一、Docker的基礎命令
[root@node02 ~]# docker volume prune -f #刪除無主的數(shù)據(jù)卷
#在運行容器時,-v掛載目錄時沒有指定本地要掛載的目錄,而是由docker管理的,
#當容器刪除后,這些目錄并不會被刪除,此時這種目錄就是無主數(shù)據(jù)卷。
#若要在刪除容器時,同時刪除這些數(shù)據(jù)卷,可以使用以下命令(添加“-v”選項即可):
[root@node02 ~]# docker rm -f -v 8086 #其中8086為容器ID
[root@master volumes]# docker container prune -f #清理掉所有處于終止狀態(tài)的容器。
[root@localhost ~]# docker search dhcp #以DHCP作為關鍵字進行搜索鏡像
[root@localhost ~]# docker pull docker.io/networkboot/dhcpd #下載查詢出來的某個鏡像
[root@localhost ~]# docker images #查詢下載的鏡像
[root@localhost ~]# docker tag docker.io/networkboot/dhcpd dchp:dhcp #改新名稱及標簽
[root@localhost ~]# docker rmi docker.io/networkboot/dhcpd #刪除鏡像
[root@localhost ~]# docker save -o dhcptest dchp:dhcp #導出為本地鏡像
[root@localhost ~]# docker load --input dhcp #導入鏡像
#或者
[root@localhost ~]# docker load < dhcp #導入鏡像
[root@docker ~]# docker save > dhcp busybox:latest #導出鏡像busybox
[root@localhost ~]# docker push docker.io/ljztest/dhcp #上傳鏡像
[root@localhost ~]# docker create -itd dchp:dhcp /bin/bash #創(chuàng)建一個容器,并指定偽終端
#選項解釋如下:
* -i:交互式
* -t:分配一個為終端
* -d:后臺運行
[root@docker ~]# docker run -itd --name test2 --restart=always httpd #保持容器處于開機自啟狀態(tài)
#作用是可以在執(zhí)行“systemctl restart docker”時,使容器也隨之重啟;
#若不加--restart,那么一旦執(zhí)行“systemctl restart docker”,這個容器將會停止。
[root@localhost ~]# docker ps -a #查出容器的ID號
[root@localhost ~]# docker exec -it 2304f92a8158 /bin/bash #進入一個容器
[root@docker ~]# docker attach test1 #也是進入一個容器
#如果是attach進入容器,使用exit退出的話這個容器也會關閉。
#使用ctrl+p ctrl+q退出容器,并不會關閉這個容器,會保持容器的運行狀態(tài)。
[root@docker ~]# docker ps -a -q | xargs docker start #開啟所有容器
[root@docker ~]# docker ps -a -q | xargs docker stop #關閉所有容器
[root@docker ~]# docker logs test1 #查看容器的日志,可以在后面加“-f”選項,動態(tài)輸出
[root@docker ~]# docker ps -a -q | xargs docker rm -f #刪除所有容器,威力不亞于rm -rf /*
[root@localhost ~]# docker ps -a -q | xargs docker start #啟動所有容器
[root@localhost ~]# docker rm 2304f92a8158 #刪除容器
[root@docker ~]# docker run -it --name containerB -c 512 centos
#創(chuàng)建一個名為containerB的容器,設置其CPU的權(quán)重為512
[root@docker ~]# docker run -it --name testA --device-write-bps /dev/sda:30MB centos
#限制磁盤的每秒可以寫入的大小為30MB
#其中還可以有以下選項:
#--device-read-bps:設置讀設備的bps
#--device-write-bps:設置寫入設備的bps
#--device-read-iops:設置讀取設備的iops
#--device-write-iops:設置寫入設備的iops。
[root@docker lv]# docker history test04:latest #如果使用Dockerfile制作鏡像,可以使用這條命令查看這個鏡像都做過什么
[root@docker ~]# docker logs web01 #查看容器的日志,可以加“-f”選項,動態(tài)刷新。
[root@docker ~]# docker commit web01 mytest:v1.0 #將容器制作為鏡像
[root@docker ~]# docker cp /a.txt web01:/usr #將本機的文件復制到容器中
[root@docker ~]# docker cp web01:/usr/a.txt /usr #將容器中的文件復制到本機中
二、docker網(wǎng)絡管理相關的命令:
[root@docker ~]# docker network ls #查看docker的網(wǎng)絡
[root@docker ~]# brctl show #專用于查看虛擬網(wǎng)絡
[root@docker ~]# docker exec web ip a #查看某個指定容器的網(wǎng)絡信息
[root@docker ~]# docker network create -d bridge my_net #創(chuàng)建一個docker的網(wǎng)絡,-d:指定驅(qū)動類型
[root@docker ~]# docker network create -d bridge --subnet 172.22.0.0/24 my_net2 #創(chuàng)建網(wǎng)絡時,指定網(wǎng)段
[root@docker ~]# docker network inspect my_net2 #查看這個網(wǎng)絡的詳細信息
[root@docker ~]# docker inspect web05 #查看容器的詳細信息
[root@docker ~]# docker inspect web05 #查看容器的詳細信息
[root@docker ~]# docker run -tid --name web07 --network my_net2 --ip 172.22.0.8 busybox #啟動容器時,一并指定IP地址。
[root@docker ~]# docker exec web03 ping 172.17.0.3 #不進入虛擬機執(zhí)行ping命令。
[root@docker ~]# iptables-save #查看iptables規(guī)則
[root@docker ~]# docker network connect my_net web001
#將web001連接至my_net網(wǎng)絡,執(zhí)行后web001將會多出一塊網(wǎng)卡,并具有my_net網(wǎng)絡的IP地址。
docker run 命令參數(shù)
-a stdin: 指定標準輸入輸出內(nèi)容類型,可選 STDIN/STDOUT/STDERR 三項;
-d: 后臺運行容器,并返回容器ID;
-i: 以交互模式運行容器,通常與 -t 同時使用;
-P: 隨機端口映射,容器內(nèi)部端口隨機映射到主機的高端口
-p: 指定端口映射,格式為:主機(宿主)端口:容器端口
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
--name="nginx-lb": 為容器指定一個名稱;
--dns 8.8.8.8: 指定容器使用的DNS服務器,默認和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默認和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 設置環(huán)境變量;
--env-file=[]: 從指定文件讀入環(huán)境變量;
--cpuset="0-2" or --cpuset="0,1,2": 綁定容器到指定CPU運行;
-m :設置容器使用內(nèi)存最大值;
--net="bridge": 指定容器的網(wǎng)絡連接類型,支持 bridge/host/none/container: 四種類型;
--link=[]: 添加鏈接到另一個容器;
--expose=[]: 開放一個端口或一組端口;
--volume , -v: 綁定一個卷
三、docker Swarm群集常用命令
[root@docker01 ~]# docker node ls #查看群集的信息(只可以在manager角色的主機上查看)
[root@docker01 ~]# docker swarm join-token worker #如果后期需要加入worker端,可以執(zhí)行此命令查看令牌(也就是加入時需要執(zhí)行的命令)
[root@docker01 ~]# docker swarm join-token manager #同上,若要加入manager端,則可以執(zhí)行這條命令查看令牌。
[root@docker01 ~]# docker service scale web05=6 #容器的動態(tài)擴容及縮容
[root@docker01 ~]# docker service ps web01 #查看創(chuàng)建的容器運行在哪些節(jié)點
[root@docker01 ~]# docker service ls #查看創(chuàng)建的服務
#將docker03脫離這個群集
[root@docker03 ~]# docker swarm leave #docker03脫離這個群集
[root@docker01 ~]# docker node rm docker03 #然后在manager角色的服務器上移除docker03
[root@docker01 ~]# docker node promote docker02 #將docker02從worker升級為manager。
#升級后docker02狀態(tài)會為Reachable
[root@docker01 ~]# docker node update --availability drain docker01
#設置主機docker01以后不運行容器,但已經(jīng)運行的容器并不會停止
docker企業(yè)級實戰(zhàn)
系統(tǒng)環(huán)境
[root@docker~]# cat /etc/redhat-release #查看版本號
CentOS Linux release 7.1.1503 (Core)
[root@docker ~]# uname -r #查看Linux內(nèi)核
c3.10.0-229.el7.x86_64
[root@docker ~]#yum install -y docker #安裝docker(CentOS7系統(tǒng)CentOS-Extras庫中已帶Docker)
[root@docker ~]#systemctl start docker #啟動docker
[root@docker ~]#systemctl enable docker #加入開機自啟動
[root@docker ~]# docker version #查看docker版本信息
Client: #docker客戶端版本信息
Version:1.8.2-el7.centos
API version:1.20
Package Version: docker-1.8.2-10.el7.centos.x86_64
Go version:go1.4.2
Git commit:a01dc02/1.8.2
Built: OS/Arch:linux/amd64
Server: #docker服務端版本信息
Version:1.8.2-el7.centos
API version:1.20
Package Version:
Go version:go1.4.2
Git commit:a01dc02/1.8.2
Built: OS/Arch:linux/amd64
docker基礎命令
查詢
[root@docker ~]# docker --help
Usage:
docker [OPTIONS] COMMAND [arg...]
docker daemon [ --help | ... ]
docker [ --help | -v | --version ]
A
self-sufficient runtime for containers.
Options:
--config=~/.docker Location of client config files #客戶端配置文件的位置
-D, --debug=false Enable debug mode #啟用Debug調(diào)試模式
-H, --host=[] Daemon socket(s) to connect to #守護進程的套接字(Socket)連接
-h, --help=false Print usage #打印使用
-l, --log-level=info Set the logging level #設置日志級別
--tls=false Use TLS; implied by--tlsverify #
--tlscacert=~/.docker/ca.pem Trust certs signed only by this CA #信任證書簽名CA
--tlscert=~/.docker/cert.pem Path to TLS certificate file #TLS證書文件路徑
--tlskey=~/.docker/key.pem Path to TLS key file #TLS密鑰文件路徑
--tlsverify=false Use TLS and verify the remote #使用TLS驗證遠程
-v, --version=false Print version information and quit #打印版本信息并退出
Commands:
attach Attach to a running container #當前shell下attach連接指定運行鏡像
build Build an image from a Dockerfile #通過Dockerfile定制鏡像
commit Create a new image from a container's changes #提交當前容器為新的鏡像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT #從容器中拷貝指定文件或者目錄到宿主機中
create Create a new container #創(chuàng)建一個新的容器,同run 但不啟動容器
diff Inspect changes on a container's filesystem #查看docker容器變化
events Get real time events from the server#從docker服務獲取容器實時事件
exec Run a command in a running container#在已存在的容器上運行命令
export Export a container's filesystem as a tar archive #導出容器的內(nèi)容流作為一個tar歸檔文件(對應import)
history Show the history of an image #展示一個鏡像形成歷史
images List images #列出系統(tǒng)當前鏡像
import Import the contents from a tarball to create a filesystem image #從tar包中的內(nèi)容創(chuàng)建一個新的文件系統(tǒng)映像(對應export)
info Display system-wide information #顯示系統(tǒng)相關信息
inspect Return low-level information on a container or image #查看容器詳細信息
kill Kill a running container #kill指定docker容器
load Load an image from a tar archive or STDIN #從一個tar包中加載一個鏡像(對應save)
login Register or log in to a Docker registry#注冊或者登陸一個docker源服務器
logout Log out from a Docker registry #從當前Docker registry退出
logs Fetch the logs of a container #輸出當前容器日志信息
pause Pause all processes within a container#暫停容器
port List port mappings or a specific mapping for the CONTAINER #查看映射端口對應的容器內(nèi)部源端口
ps List containers #列出容器列表
pull Pull an image or a repository from a registry #從docker鏡像源服務器拉取指定鏡像或者庫鏡像
push Push an image or a repository to a registry #推送指定鏡像或者庫鏡像至docker源服務器
rename Rename a container #重命名容器
restart Restart a running container #重啟運行的容器
rm Remove one or more containers #移除一個或者多個容器
rmi Remove one or more images #移除一個或多個鏡像(無容器使用該鏡像才可以刪除,否則需要刪除相關容器才可以繼續(xù)或者-f強制刪除)
run Run a command in a new container #創(chuàng)建一個新的容器并運行一個命令
save Save an image(s) to a tar archive#保存一個鏡像為一個tar包(對應load)
search Search the Docker Hub for images #在dockerhub中搜索鏡像
start Start one or more stopped containers#啟動容器
stats Display a live stream of container(s) resource usage statistics #統(tǒng)計容器使用資源
stop Stop a running container #停止容器
tag Tag an image into a repository #給源中鏡像打標簽
top Display the running processes of a container #查看容器中運行的進程信息
unpause Unpause all processes within a container #取消暫停容器
version Show the Docker version information#查看容器版本號
wait Block until a container stops, then print its exit code #截取容器停止時的退出狀態(tài)值
Run 'docker COMMAND --help' for more information on a command. #運行docker命令在幫助可以獲取更多信息
搜索Docker鏡像
[root@docker ~]# docker search centos #搜索所有centos的docker鏡像
INDEX NAME(名稱) DESCRIPTION(描述) STARS(下載次數(shù))OFFICIAL(官方) AUTOMATED(自動化)
docker.io docker.io/centos The official build of CentOS. 1781 [OK]
docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.7 x86_64 / 14 [OK]
獲取Docker鏡像
[root@docker ~]# docker pull centos #獲取centos鏡像
[root@docker ~]# docker run -it centos /bin/bash #完成后可以使用該鏡像創(chuàng)建一個容器
[root@5284d42eeb3a /]#
查看docker鏡像
鏡像的ID唯一標識了鏡像,如果ID相同,說明是同一鏡像。
TAG信息來區(qū)分不同發(fā)行版本,如果不指定具體標記,默認使用latest標記信息。
[root@docker ~]# docker images #查看docker鏡像
REPOSITORY(來自那個倉庫) TAG(標簽) IMAGE ID(唯一ID) CREATED(創(chuàng)建時間) VIRTUAL SIZE(大小)
docker.io/centos latest 60e65a8e4030 5
days ago 196.6 MB
docker.io/nginx latest 813e3731b203 13
days ago 133.8 MB
刪除Docker鏡像
如果要移除本地的鏡像,可以使用docker rmi命令(在刪除鏡像之前先用docker rm刪除依賴于這個鏡像的所有容器)。注意docker rm 命令是移除容器。
[root@docker ~]# docker rmi imageID #刪除docker鏡像
導出Docker鏡像
如果要導出鏡像到本地文件,可以使用docker save命令。
root@docker ~]# docker save centos > /opt/centos.tar.gz #導出docker鏡像至本地
[root@docker ~]# ll /opt/
-rw-r--r--.1 root root 204205056 12月 30 09:53 centos.tar.gz
導入Docker鏡像
可以使用docker load從本地文件中導入到本地docker鏡像庫
[root@docker ~]# docker load < /opt/centos.tar.gz #導入本地鏡像到docker鏡像庫
[root@docker~]# docker images #查看鏡像導入情況
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/centos latest 60e65a8e4030 5 days ago 196.6 MB
啟動Docker容器
啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動,另外一個是將在終止狀態(tài)(stopped)的容器重新啟動。
因為Docker的容器實在太輕量級了,很多時候用戶都是隨時刪除和新創(chuàng)建容器。
[root@docker ~]# docker run centos /bin/echo "hehe" #這跟在本地直接執(zhí)行 /bin/echo'hehe'
hehe
[root@docker ~]# docker run --name mydocker -it centos /bin/bash#啟動一個bash終端,允許用戶進行交互。
[root@1c6c3f38ea07 /]# pwd
/
[root@1c6c3f38ea07 /]# ls
anaconda-post.log bindev etc homelib lib64 lost+foundmedia mnt optproc root runsbin srv systmp usr var
--name:給容器定義一個名稱
-i:則讓容器的標準輸入保持打開。
-t:讓Docker分配一個偽終端,并綁定到容器的標準輸入上
/bin/bash:執(zhí)行一個命令
啟動已終止容器
可以利用docker start命令,直接將一個已經(jīng)終止的容器啟動運行。
容器的核心為所執(zhí)行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,并沒有其他的資源。可以在偽終端中利用ps和top來查看進程信息。
[root@docker ~]# docker start 1c6c3f38ea07 #啟動一個終止的容器
1c6c3f38ea07
[root@docker ~]# docker ps -a #查看是否啟動
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c6c3f38ea07 centos "/bin/bash" 8 minutes ago Up 1 seconds mycentos
守護進程運行
更多的時候,需要讓Docker容器在后臺以守護形式運行。此時可以通過添加-d參數(shù)來實現(xiàn)。
例如下面的命令會在后臺運行容器。
[root@docker ~]# docker run -d centos /bin/bash -c "while true; do echo hehe; sleep 1;done"
961fd1162c2f6a8d04e4d8ab6ccacf4cb01a90af8ab553d5e2c5063ac483ffd8
[root@docker ~]# docker ps #查看正在運行的docker容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
961fd1162c2f centos "/bin/bash -c 'while
" 18 minutes ago Up 18 minutes agitated_raman
[root@docker ~]# docker logs 961fd1162c2f #獲取容器輸出信息,通過dockerlogs命令
hehe
hehe
停止容器
可以使用docker stop來終止一個運行中的容器。
此外,當Docker容器中指定的應用終結(jié)時,容器也自動終止。例如啟動一個終端的容器,用戶通過exit命令或者ctrl+d來退出終端時,所創(chuàng)建的容器立刻終止。
終止狀態(tài)的容器可以用docker ps -a命令看到,也可以通過docker start ID 命令來啟動容器。
[root@docker ~]# docker ps -a #查看所有容器的情況
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
961fd1162c2f centos "/bin/bash -c 'while
" 30 minutes ago Up 30 minutes agitated_raman
[root@docker ~]# docker stop 961fd1162c2f #停止容器
961fd1162c2f
[root@docker ~]# docker ps -a
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
961fd1162c2f centos "/bin/bash -c 'while" 31 minutes ago Exited (137) 27 seconds ago agitated_raman
極端方式停止容器(不推薦)
[root@867e6627a194 ~]# docker ps -a -q #列出所有啟動容器的ID
867e6627a194
[rot@867e6627a194 ~]# docker kill $(docker ps -a -q) #批量殺掉啟動的容器
./in.sh: 行 4: 20078 已殺死 nsenter -t $PID -u -i -n -p
刪除容器
[root@867e6627a194 ~]# docker ps -a #查看所有容器當前狀態(tài)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194 centos "/bin/bash" 16 minutes ago Up 5 minutes mydocker
c599b569f387 centos "/bin/echo hehe" 19 minutes ago Exited (0) 19 minutes ago fervent_torvalds
302f39c202c9 nginx "/bin/bash" 2 hours ago Up 2 hours 80/tcp, 443/tcp mynginx
[root@867e6627a194 ~]#
[root@867e6627a194 ~]# docker rm c599b569f387 #刪除已經(jīng)停止的容器
c599b569f387
[root@867e6627a194 ~]# docker rm -f 302f39c202c9 #刪除正在運行的容器
302f39c202c9
進入容器
使用-d參數(shù)時,容器啟動后會進入后臺。某些時候需要進入容器進行操作,有很多種方法,包括使用docker attach命令或nsenter工具等。
1attach命令
docker attach是Docker自帶的命令。下面示例如何使用該命令。
[root@docker ~]# docker ps -a
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194 centos "/bin/bash" 10 minutes ago Exited (127) 47 seconds ago mydocker
[root@docker ~]# docker start 867e6627a194 #啟動已經(jīng)停止的容器
867e6627a194
[root@docker ~]# docker attach 867e6627a194 #通過docker attach進入
[root@867e6627a194 /]#
但是使用attach命令有時候并不方便。當多個窗口同時attach到同一個容器的時候,所有的窗口都會同步顯示,當某個窗口因命令阻塞時,其他窗口也無法執(zhí)行操作了。
nsenter命令
nsenter可以訪問另一個進程的名字空間。nsenter需要有root權(quán)限。
[root@docker ~]# yum install -y util-linux #安裝包中有需要用到的nsenter
[root@docker ~]# docker ps -a
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194 centos "/bin/bash" 10 minutes ago Exited (127) 47 seconds ago mydocker
[root@docker ~]# docker start 867e6627a194 #啟動已經(jīng)關閉的容器
867e6627a194
[root@docker ~]# docker inspect --format "{{.State.Pid}}" 867e6627a194 #找到容器的第一個進程PID
20012
[root@docker ~]# nsenter -t 20012 -u -i -n -p #通過這個PID連接到容器
[root@867e6627a194 ~]# exit
[root@docker ~]# docker ps
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194 centos "/bin/bash" 13 minutes ago Up 2 minutes mydocker
[root@docker ~]# cat in.sh #編寫成腳本快速進入容器空間
#!/bin/sh
PID=$(docker inspect --format "{{.State.Pid}}" $1)
nsenter -t $PID -u -i -n -p
[root@docker ~]# docker ps
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194 centos "/bin/bash" 15 minutes ago Up 4 minutes mydocker
[root@docker ~]# ./in.sh 867e6627a194 #執(zhí)行腳本跟上容器ID快速進入
[root@867e6627a194 ~]