Docker常用命令行


原文出處:https://blog.csdn.net/qq_29303759/article/details/87639016
linux docker-compose安裝:curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

啟動docker

啟動docker

systemctl start docker

守護進程重啟

sudo systemctl daemon-reload

重啟docker服務

systemctl restart docker

重啟docker服務

sudo service docker restart

關閉docker

service docker stop

關閉docker

systemctl stop docker

避免輸出Sudo
這里把當前用戶加入到docker組就可以直接使用命令,而不用每次都加sudo

sudo groupadd docker

改完后需要重新登陸用戶

sudo gpasswd -a ${USER} docker

Docker版本

sudo docker --version

當前Docker宿主機的信息

docker info

查看容器內部的進程信息

docker top [container]

Containers

ps
查看正在運行的容器,不加-l則只列出正在運行的container(比如后台任務)

 sudo docker ps

查看所有的容器

sudo docker ps -a

run
從指定image里生成一個container並在其中運行一個命令,

-d:在后台運行

–p:映射好內外端口,

--name:在容器時的名稱

-v 'pwd':/usr/share/nginx/html :把運行容器的當前目錄映射到/usr/share/nginx/html

docker run -d -p 80:80 --name myname -v 'pwd':/usr/share/nginx/html nginx:1.13

進入容器
進入一個已經啟動的docker容器

docker exec -it ContainerID bash 這個命令exit退出,容器還在運行
docker attach ContainerID ,exit退出就會導致容器stop;按Ctrl+P+Q則容器還在運行

在容器中運行后台任務,只對正在運行的容器有效。

$ docker exec -d -p [container][cmd]
$ docker exec -d edison touch /home/haha

在容器中運行交付式任務,只對正在運行的容器有效。

$ docker exec -t -i edison /bin/bash

注:在/var/lib/docker中,可以查看Docker Image、Container和Volumes等細節信息。

start
再次運行某個container

docker start [container]

stop
中止后台任務container

docker stop [container]

rm
刪除某個container
其中container_id不需要輸入完整,只要能保證唯一即可。
運行中的Docker容器是無法刪除的,必須先通過docker stop或者docker kill命令停止。

docker rm [container]
docker rm `docker ps -a -q`  #刪除所有容器,-q表示只返回容器的ID

commit

把容器中的對象轉成鏡像

docker commit 92 m1

logs
查看某個container的運行日志

docker logs [container]
docker logs -f [container] 類似tailf

inspect
查看container詳情

docker inspect [container]

attach
切換到后台任務container, 需要當前容器正常運行
注意:切換到后台任務以后無法用Ctrl-C退出

docker attach [container]

指定名稱
為容器指定名稱,容器的名稱是唯一

$ docker run --name edison -i -t ubuntu /bin/bash

有三種方式可以唯一指代容器
短UUID: 716d3c16dc65(12位)
長UUID:716d3c16dc654230ada14f555faadd036474231dfca0ca44b597574a5c618565(64位)
名稱: edison

從容器內拷貝文件到主機上

docker cp 容器id:容器同路徑 目的的主機路徑
docker cp b7845:/home/test.java /home

Images

pull

通過docker命令下載tutorial鏡像

docker pull learn/tutorial

images

查看本地鏡像

sudo docker images

run/stop

從鏡像中運行/停止一個新實例

sudo docker run/stop containerID

search

搜索Docker Image

docker search tutorial

搜索網址是:index.docker.io [國內無法訪問]
其他網址是:https://hub.docker.com/

rmi
刪除images

docker rmi [image id]

push

將container保存為一個image

docker push [image_name]

原文出處:https://www.jianshu.com/p/10ed530766af

Dockerfile

部分 命令
基礎鏡像信息 FROM
維護者信息 MAINTAINER
鏡像操作指令 RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器啟動時執行指令 CMD、ENTRYPOINT
FROM 	# 基礎鏡像, 一切從這里開始構建
MANTAINER # 鏡像是誰寫的, 姓名+郵箱
RUN #鏡像構建的時候需要運行的命令
ADD # 步驟, tomcat鏡像,壓縮包! 添加內容
WORKDIR # 鏡像的工作目錄
VOLUME # 掛載的目錄
EXPOSE # 暴露端口配置
RUN #運行
CMD # 指定這個容器啟動的時候要運行的命令,只有最后一個會生效,可被替代
ENTRYPOINT # 指定這個容器啟動的時候要運行的命令,可以追加命令
ONBUILD # 當構建一個被繼承 DockerFile 這個時候就會運行ONBUILD的指令,觸發指令
COPY	#	類似ADD,將我們文件拷貝到鏡像中
ENV 	# 構建的時候設置環境變量! 

簡單示例

# 1 編寫一個DOckerfile的文件

FROM centos

MAINTAINER czp<2432688105@qq.com>

ENV MYPATH /usr/local

WORKDIR $MYPATH

RUN yum -y  install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"


# 2. 通過這個文件構建鏡像
docker build -f dockerfile文件路徑 -t
docker build -f mydockerfile -t mycentos:0.1

1 FROM
指定哪種鏡像作為新鏡像的基礎鏡像,如:

FROM ubuntu:14.04

2 MAINTAINER
指明該鏡像的作者和其電子郵件,如:

MAINTAINER vector4wang "xxxxxxx@qq.com"

3 RUN
在新鏡像內部執行的命令,比如安裝一些軟件、配置一些基礎環境,可使用\來換行,如:

RUN echo 'hello docker!' \
    > /usr/local/file.txt

也可以使用exec格式RUN ["executable", "param1", "param2"]的命令,如:

RUN ["apt-get","install","-y","nginx"]

要注意的是,executable是命令,后面的param是參數

4 COPY
將主機的文件復制到鏡像內,如果目的位置不存在,Docker會自動創建所有需要的目錄結構,但是它只是單純的復制,並不會去做文件提取和解壓工作。如:

COPY application.yml /etc/springboot/hello-service/src/resources

注意:需要復制的目錄一定要放在Dockerfile文件的同級目錄下
原因:

因為構建環境將會上傳到Docker守護進程,而復制是在Docker守護進程中進行的。任何位於構建環境之外的東西都是不可用的。COPY指令的目的的位置則必須是容器內部的一個絕對路徑。
---《THE DOCKER BOOK》

5 ADD
將主機的文件復制到鏡像中,跟COPY一樣,限制條件和使用方式都一樣,如:

ADD application.yml /etc/springboot/hello-service/src/resources
但是ADD會對壓縮文件(tar, gzip, bzip2, etc)做提取和解壓操作。

6 EXPOSE
暴露鏡像的端口供主機做映射,啟動鏡像時,使用-P參數來講鏡像端口與宿主機的隨機端口做映射。使用方式(可指定多個):

EXPOSE 8080 
EXPOSE 8081
...

7 WORKDIR
在構建鏡像時,指定鏡像的工作目錄,之后的命令都是基於此工作目錄,如果不存在,則會創建目錄。如

WORKDIR /usr/local
WORKDIR webservice
RUN echo 'hello docker' > text.txt
...
最終會在/usr/local/webservice/目錄下生成text.txt文件

8 ONBUILD
當一個包含ONBUILD命令的鏡像被用作其他鏡像的基礎鏡像時(比如用戶的鏡像需要從某為准備好的位置添加源代碼,或者用戶需要執行特定於構建鏡像的環境的構建腳本),該命令就會執行。

如創建鏡像image-A

FROM ubuntu
...
ONBUILD ADD . /var/www
...
然后創建鏡像image-B,指定image-A為基礎鏡像,如

FROM image-A
...
然后在構建image-B的時候,日志上顯示如下:

Step 0 : FROM image-A
Execting 1 build triggers
Step onbuild-0 : ADD . /var/www
...

9 USER
指定該鏡像以什么樣的用戶去執行,如:

USER mongo

10 VOLUME
用來向基於鏡像創建的容器添加卷。比如你可以將mongodb鏡像中存儲數據的data文件指定為主機的某個文件。(容器內部建議不要存儲任何數據)
如:

VOLUME /data/db /data/configdb

注意:VOLUME 主機目錄 容器目錄

11 CMD
容器啟動時需要執行的命令,如:

CMD /bin/bash

同樣可以使用exec語法,如

CMD ["/bin/bash"]

當有多個CMD的時候,只有最后一個生效。

12 ENTRYPOINT

ENTRYPOINT作用和用法和CMD一模一樣,區別:
1 CMD的命令會被 docker run 的命令覆蓋而ENTRYPOINT不會
2 CMD和ENTRYPOINT都存在時,CMD的指令變成了ENTRYPOINT的參數,並且此CMD提供的參數會被 docker run 后面的命令覆蓋

13 build

使用當前目錄的 Dockerfile 創建鏡像,標簽為 runoob/ubuntu:v1。

docker build -t runoob/ubuntu:v1 . 

使用URL github.com/creack/docker-firefox 的 Dockerfile 創建鏡像。

docker build github.com/creack/docker-firefox

也可以通過 -f Dockerfile 文件的位置:

$ docker build -f /path/to/a/Dockerfile .

在 Docker 守護進程執行 Dockerfile 中的指令前,首先會對 Dockerfile 進行語法檢查,有語法錯誤時會返回:

$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD

tar

Docker 本地導入鏡像/保存鏡像/載入鏡像/刪除鏡像
1.docker導入本地鏡像
我們可以把本地的鏡像導入,使用docker import 命令。

cat alibaba-rocketmq-3.2.6.tar.gz | docker import - rocketmq:3.2.6(鏡像名自己定義)

注意鏡像文件必須是tar.gz類型的文件。
2.保存鏡像
使用docker save命令,保存鏡像到本地。

 docker save -o rocketmq.tar rocketmq ##-o:指定保存的鏡像的名字;rocketmq.tar:保存到本地的鏡像名稱;rocketmq:鏡像名字
 或docker save rocketmq > rocketmq.tar

通過"docker images"查看,然后可以通過ll查看到本地的rocketmq.tar文件
3.載入鏡像
使用docker load將本地保存的鏡像再次導入docker中

docker load --input rocketmq.tar 
或 docker load < rocketmq.tar

4.刪除鏡像

docker rmi -f image_id ##-f:表示強制刪除鏡像;image_id:鏡像id

鏡像命名規則,是系統名+系統版本+服務名+服務版本:代碼版本,比如我centos 6.5系統安裝了nginx 1.4.7版本,放入代碼是2.0版本,那么容器命令規則為centos6.5-nginx-1.4.7:2.0.

網絡

自定義網絡

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

運行鏡像並連接該網絡

docker run -d -p --name tomcat-net-01 --net mynet tomcat
docker run -d -p --name tomcat-net-02 --net mynet tomcat

測試

docker network ls
docker network inspect mynet
docker exec -it tomcat-net-01 ping 192.168.0.3
docker exec -it tomcat-net-01 ping tomcat-net-02

將容器連通指定網絡

docker network connect mynet tomcat01

容器數據卷

指定路徑掛載

-v 宿主機路徑 : 容器內路徑 #指定路徑掛載
docker run -it -v 主機目錄: 容器內目錄  -p 主機端口: 容器端口

#將宿主機的/root/test掛載到tomcat的/home目錄
docker run -d -p 9999:8080 -v /root/test:/home --name="tomcat01"  1b6b1fe7261e

# 啟動起來我們可以使用     docker inspect 容器id
# 查看所有的卷的情況       docker volume ls
# 查看指定的卷的詳細信息   docker volume inspect 容器id

具名掛載

-v 卷名:容器內路徑 #具名掛載
docker run -d -p 9099:80 -v nginxConfig:/etc/nginx 2622e6cca7eb

匿名掛載

-v 容器內路徑 #匿名掛載
docker -run -P -name nginx01 -v /etc/nginx nginx

權限控制

#通過 -v  容器內路徑: ro rw 改變讀寫權限
ro read only
read and write

#一旦設置了容器權限,容器對掛載出來的內容就有限定了!
docker -run -P -name nginx01 -v /etc/nginx:ro nginx
docker -run -P -name nginx01 -v /etc/nginx:rw nginx
ro : 只要看到ro就說明這個路徑只能通過宿主機來改變,容器內部無法操作

多個容器共用一個數據卷

docker run -it --name docker03 --volumes-from docker01 鏡像id

安裝elasticsearch、kibana

以下開始從阿里雲拉取鏡像
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.3.0

創建運行
docker run -d --name es2 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" 5acf0e8da90b

docker run --name kibana -d -p 5601:5601 -e ELASTICSEARCH_HOSTS=http://192.168.10.8:9200 kibana:7.3.0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM