前言
在 上一篇文章 中已經(jīng)介紹了 Docker 相關(guān)的概念以及 Docker 的安裝, 下面正式進入 Docker 的使用。Docker 分為客戶端和服務(wù)端兩部分, docker 為客戶端調(diào)用的命令, dockerd 為服務(wù)端調(diào)用的命令, 本文著重介紹客戶端的用法。
主要用法:docker [ docker命令選項 ] [ 子命令 ] [ 子命令選項 ]
docker [ 子命令 ] --help 可查看每個子命令的詳細用法。
Docker 命令選項列表
| 選項 | 說明 | 其他 |
|---|---|---|
| --config [string] | 客戶端本地配置文件路徑 | 默認為 ~/.docker |
| -D, --debug | 啟用調(diào)試模式 | |
| --help | 打印用法 | |
| -H, --host list | 通過 socket 訪問指定的 docker 守護進程 ( 服務(wù)端 ) | unix:// , fd:// , tcp:// |
| -l, --log-level [string] | 設(shè)置日志級別 ( debug 、info 、warn 、error 、fatal ) | 默認為 info |
| --tls | 啟用 TLS 加密 | |
| --tlscacert [string] | 指定信任的 CA 根證書 路徑 | 默認為 ~/.docker/ca.pem |
| --tlscert [string] | 客戶端證書路徑 | 默認為 ~/.docker/cert.pem |
| --tlskey [string] | 客戶端證書私鑰路徑 | 默認為 ~/.docker/key.pem |
| --tlsverify | 啟用 TLS 加密并驗證客戶端證書 | |
| -v, --version | 打印 docker 客戶端版本信息 |
1. 鏡像倉庫相關(guān)
1.1 查找鏡像
docker search [ 條件 ]
# 查詢?nèi)w星及以上名字包含alpine的鏡像
docker search -f=stars=3 alpine
1.2 獲取鏡像
docker pull [ 倉庫 ]:[ tag ]
倉庫格式為 [倉庫url]/[用戶名]/[應(yīng)用名] , 除了官方倉庫外的第三方倉庫要指定 url, 用戶名就是在對應(yīng)倉庫下建立的賬戶, 一般只有應(yīng)用名的倉庫代表 官方鏡像, 如 ubuntu、tomcat 等, 而 tag 表示鏡像的版本號, 不指定時默認為 latest
# 獲取alpine Linux 的鏡像
docker pull alpine
1.3 推送鏡像到倉庫
docker push [ 鏡像名 ]:[ tag ]
當(dāng)然, 需要先登錄
ubuntu@VM-84-201-ubuntu:~$ docker push alpine
The push refers to a repository [docker.io/library/alpine]
3fb66f713c9f: Layer already exists
errors:
denied: requested access to the resource is denied(沒有權(quán)限, 需要登錄帳號)
unauthorized: authentication required
1.4 登錄/退出第三方倉庫
docker [ login/logout ] [ 倉庫地址 ]
# 登錄
ubuntu@VM-84-201-ubuntu:~$ docker login daocloud.io
Username (username): username
Password:
Login Succeeded
# 退出
ubuntu@VM-84-201-ubuntu:~$ docker logout daocloud.io
Removing login credentials for daocloud.io
2. 本地鏡像
2.1 查看本地鏡像
docker images
ubuntu@VM-84-201-ubuntu:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest a41a7446062d 14 hours ago 3.97MB
hello-world latest 48b5124b2768 4 months ago 1.84kB
2.2 刪除本地鏡像
docker rmi [ 鏡像名 or 鏡像 id ]
如果用 鏡像 id 作為參數(shù), 可以只輸入前幾位, 能唯一確定即可 ( 可以同時刪除多個鏡像, 空格隔開 )。此外, 如果已經(jīng)使用該 鏡像 啟動了 容器 需要先刪除 容器。
ubuntu@VM-84-201-ubuntu:~$ docker rmi a41
Untagged: alpine:latest
Untagged: alpine@sha256:0b94d1d1b5eb130dd0253374552445b39470653fb1a1ec2d81490948876e462c
Deleted: sha256:a41a7446062d197dd4b21b38122dcc7b2399deb0750c4110925a7dd37c80f118
Deleted: sha256:3fb66f713c9fa9debcdaa58bb9858bd04c17350d9614b7a250ec0ee527319e59
2.3 查看鏡像詳情
docker inspect [ 鏡像名 or 鏡像 id ]
ubuntu@VM-84-201-ubuntu:~$ docker inspect a41
[
{
"Id": "sha256:a41a7446062d197dd4b21b38122dcc7b2399deb0750c4110925a7dd37c80f118",
"RepoTags": [
"alpine:latest"
],
"RepoDigests": [
"alpine@sha256:0b94d1d1b5eb130dd0253374552445b39470653fb1a1ec2d81490948876e462c"
],
"Parent": "",
"Comment": "",
"Created": "2017-05-25T23:33:22.029729271Z",
"Container": "19ee1cd90c07eb7b3c359aaec3706e269a871064cca47801122444cef51c5038",
......
}
}
]
2.4 打包本地鏡像, 使用壓縮包來完成遷移
docker save [ 鏡像名 ] > [ 文件路徑 ]
# 默認為文件流輸出
docker save alpine > /usr/anyesu/docker/alpine.img
# 或者使用 '-o' 選項指定輸出文件路徑
docker save -o /usr/anyesu/docker/alpine.img alpine
2.5 導(dǎo)入鏡像壓縮包
docker load < [ 文件路徑 ]
# 默認從標(biāo)準(zhǔn)輸入讀取
ubuntu@VM-84-201-ubuntu:~$ docker load < /usr/anyesu/docker/alpine.img
3fb66f713c9f: Loading layer [==================================================>] 4.221MB/4.221MB
Loaded image: alpine:latest
# 用 '-i' 選項指定輸入文件路徑
ubuntu@VM-84-201-ubuntu:~$ docker load -i /usr/anyesu/docker/alpine.img
Loaded image: alpine:latest
Loaded image ID: sha256:665ffb03bfaea7d8b7472edc0a741b429267db249b1fcead457886e861eae25f
Loaded image ID: sha256:a41a7446062d197dd4b21b38122dcc7b2399deb0750c4110925a7dd37c80f118
2.6 修改鏡像tag
docker tag [ 鏡像名 or 鏡像 id ] [ 新鏡像名 ]:[ 新 tag ]
ubuntu@VM-84-201-ubuntu:~$ docker tag a41 anyesu/alpine:1.0
ubuntu@VM-84-201-ubuntu:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
anyesu/alpine 1.0 a41a7446062d 15 hours ago 3.97MB
alpine latest a41a7446062d 15 hours ago 3.97MB
hello-world latest 48b5124b2768 4 months ago 1.84kB
3. 容器相關(guān)
3.1 創(chuàng)建、啟動容器并執(zhí)行相應(yīng)的命令
docker run [ 參數(shù) ] [ 鏡像名 or 鏡像 id ] [ 命令 ]
如果沒有指定命令時就執(zhí)行 鏡像 中默認的命令, 創(chuàng)建 鏡像 的時候可設(shè)置默認命令。另外要注意的一點, 啟動 容器 后要執(zhí)行一個前臺進程 ( 就是能在控制臺不斷輸出的或者一直等待的那種程序, 如 tomcat 的 catalina.sh ) 才能使 容器 保持運行狀態(tài), 否則, 命令執(zhí)行完 容器 就關(guān)閉了, 像下面這個例子執(zhí)行完就直接結(jié)束了。
ubuntu@VM-84-201-ubuntu:~$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
run 命令常用選項
| 選項 | 說明 |
|---|---|
| -d | 后臺運行容器, 并返回容器ID;不指定時, 啟動后開始打印日志, Ctrl + C 退出命令同時會關(guān)閉容器 |
| -i | 以交互模式運行容器, 通常與 -t 同時使用; |
| -t | 為容器重新分配一個偽輸入終端, 通常與 -i 同時使用 |
| --name "anyesu-container" | 為容器指定一個別名, 不指定時隨機生成 |
| -h docker-anyesu | 設(shè)置容器的主機名, 默認隨機生成 |
| --dns 8.8.8.8 | 指定容器使用的 DNS 服務(wù)器, 默認和宿主機一致 |
| -e docker_host=172.17.0.1 | 設(shè)置環(huán)境變量 |
| --cpuset="0-2" or --cpuset="0,1,2" | 綁定容器到指定 CPU 運行 |
| -m 100M | 設(shè)置容器使用內(nèi)存最大值 |
| --net bridge | 指定容器的網(wǎng)絡(luò)連接類型, 支持 bridge / host / none / container 四種類型 |
| --ip 172.18.0.13 | 為容器分配固定 ip ( 需要使用自定義網(wǎng)絡(luò) ) |
| --expose 8081 --expose 8082 | 開放一個端口或一組端口, 會覆蓋鏡像設(shè)置中開放的端口 |
| -p [宿主機端口]:[容器內(nèi)端口] | 宿主機到容器的端口映射, 可指定宿主機的要監(jiān)聽的 ip, 默認為 0.0.0.0 |
| -P | 注意是大寫的, 宿主機隨機指定一組可用的端口映射容器 expose 的所有端口 |
| -v [宿主機目錄路徑]:[容器內(nèi)目錄路徑] | 掛載宿主機的指定目錄 ( 或文件 ) 到容器內(nèi)的指定目錄 ( 或文件 ) |
| --add-host [主機名]:[ip] | 為容器 hosts 文件追加 host , 默認會在 hosts 文件最后追加內(nèi)容:[主機名]:[容器ip]
|
| --volumes-from [其他容器名] | 將其他容器的數(shù)據(jù)卷添加到此容器 |
| --link [其他容器名]:[在該容器中的別名] | 添加鏈接到另一個容器, 在本容器 hosts 文件中加入關(guān)聯(lián)容器的記錄, 效果類似于 --add-host |
一個較完整的例子:
# 創(chuàng)建一個名為anyesu_net、網(wǎng)段為172.18.0.0的網(wǎng)橋(docker默認創(chuàng)建的網(wǎng)段為172.17.0.0)
docker network create --subnet=172.18.0.0/16 anyesu_net
# 創(chuàng)建并啟動一個配置復(fù)雜的容器
ubuntu@VM-84-201-ubuntu:~$ docker run -d --name anyesu-container -h docker-anyesu --dns 8.8.8.8 -e docker_host=172.18.0.1 -e docker_host2=172.18.0.2 --net anyesu_net --ip 172.18.0.13 --expose 8081 --expose 8082 -P -p 8000:8000 -p 8001:8001 -v /usr/anyesu:/usr/anyesu --add-host anyesu_host:172.18.0.1 tomcat:7
912e6632161de0783a057aa02380e676753f66cfb367ef1686d4d09cdc931659
ubuntu@VM-84-201-ubuntu:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
912e6632161d tomcat:7 "catalina.sh run" 6 seconds ago Up 5 seconds 0.0.0.0:8000-8001->8000-8001/tcp, 0.0.0.0:32783->8080/tcp, 0.0.0.0:32782->8081/tcp, 0.0.0.0:32781->8082/tcp anyesu-container
單字符選項可以合并, 如
-i -t可以合并為-it
3.2 查看運行中的容器
docker ps
加 -a 選項可查看所有的 容器
3.3 開啟/停止/重啟容器
# 關(guān)閉容器(發(fā)送SIGTERM信號,做一些'退出前工作',再發(fā)送SIGKILL信號)
docker stop anyesu-container
# 強制關(guān)閉容器(默認發(fā)送SIGKILL信號, 加-s參數(shù)可以發(fā)送其他信號)
docker kill anyesu-container
# 啟動容器
docker start anyesu-container
# 重啟容器
docker restart anyesu-container
3.4 刪除容器
docker rm [ 容器名 or 容器 id ]
可以指定多個容器一起刪除, 加 -f 選項可強制刪除正在運行的 容器
ubuntu@VM-84-201-ubuntu:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd7a6c1ba0f0 tomcat "catalina.sh run" 20 seconds ago Up 18 seconds 0.0.0.0:32798->8080/tcp, 0.0.0.0:32797->8081/tcp, 0.0.0.0:32796->8082/tcp musing_newton
61941bea1c87 tomcat "catalina.sh run" About a minute ago Up About a minute 0.0.0.0:8000-8001->8000-8001/tcp, 0.0.0.0:32795->8080/tcp, 0.0.0.0:32794->8081/tcp, 0.0.0.0:32793->8082/tcp anyesu-container
ubuntu@VM-84-201-ubuntu:~$ docker rm musing_newton anyesu-container -f
musing_newton
anyesu-container
3.5 查看容器詳情
docker inspect [ 容器名 or 容器 id ]
docker inspect anyesu-container
3.6 查看容器中正在運行的進程
docker top [ 容器名 or 容器 id ]
ubuntu@VM-84-201-ubuntu:~$ docker top anyesu-container
UID PID PPID C STIME TTY TIME CMD
root 31769 31752 1 00:26 ? 00:00:03 /docker-java-home/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
3.7 將容器保存為鏡像
docker commit [ 容器名 or 容器 id ] [ 鏡像名 ]:[ tag ]
ubuntu@VM-84-201-ubuntu:~$ docker commit anyesu-container anyesu/tomcat:1.0
sha256:582fcffd3209a2478e2179c9381a1ef67e0df9ba95aba713875c0857f5dae4e5
ubuntu@VM-84-201-ubuntu:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
anyesu/tomcat 1.0 582fcffd3209 2 seconds ago 334MB
alpine latest a41a7446062d 17 hours ago 3.97MB
tomcat latest 3695a0fe8320 2 days ago 334MB
hello-world latest 48b5124b2768 4 months ago 1.84kB
3.8 使用 Dockerfile 構(gòu)建鏡像
docker build -t [ 鏡像名 ]:[ tag ] -f [ DockerFile 名 ] [ DockerFile 所在目錄 ]
數(shù)據(jù)是實時更新的, 點擊 查看詳細用法。
4. 硬件資源相關(guān)
4.1 顯示容器硬件資源使用情況
docker stats [ 選項 ] [ 0個或多個正在運行容器 ]
# 不指定容器時顯示所有正在運行的容器
ubuntu@VM-84-201-ubuntu:~$ docker stats
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
9bb9d6bed6e6 0.00% 20.57MiB / 864.5MiB 2.38% 104kB / 1.99MB 4.9MB / 4.1kB 11
4.2 更新容器的硬件資源限制
docker update [ 選項 ]
這個操作可能會輸出下面的錯誤內(nèi)容:
Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap
# /etc/default/grub
sudo vi /etc/default/grub
# 添加內(nèi)核啟動參數(shù)
GRUB_CMDLINE_LINUX="... cgroup_enable=memory swapaccount=1"
# 更新 grub
sudo update-grub
# 重啟
sudo reboot
注意是在 GRUB_CMDLINE_LINUX 項 追加 上述參數(shù)內(nèi)容, 我試過簡單粗暴的在文件末尾添加下面內(nèi)容, 這么做會覆蓋原有的啟動參數(shù), 導(dǎo)致網(wǎng)絡(luò)連接失敗。網(wǎng)絡(luò)壞了, ssh 都連不上了, 幸好可以在 騰訊云 的網(wǎng)頁控制臺登錄, 修改內(nèi)容重啟就好了。所以呢, 這一步操作一定要慎重。
4.3 使用壓力測試工具 stress 驗證效果
使用已有的 stress 鏡像 progrium/stress, 開兩個終端, 在其中一個終端中執(zhí)行下面的命令
docker run -m 100m --rm -it progrium/stress --cpu 2 --io 1 --vm 10 --vm-bytes 9M
在另一個終端執(zhí)行 docker stats 進行監(jiān)控
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
9eb0 88.42% 92.22MiB / 100MiB 92.22% 0B / 0B 1.65MB / 2.88MB 14
再開一個終端執(zhí)行
# 9eb0為容器id開頭, 請根據(jù)實際情況替換。內(nèi)存限制只能調(diào)大不能調(diào)小
docker update -m 200m 9eb0
相關(guān)文章:
基礎(chǔ)子命令列表
| 選項 | 說明 |
|---|---|
| attach | 進入運行中的容器, 顯示該容器的控制臺界面。注意, 從該指令退出會導(dǎo)致容器關(guān)閉 |
| build | 根據(jù) Dockerfile 文件構(gòu)建鏡像 |
| commit | 提交容器所做的改為為一個新的鏡像 |
| cp | 在容器和宿主機之間復(fù)制文件 |
| create | 根據(jù)鏡像生成一個新的容器 |
| diff | 展示容器相對于構(gòu)建它的鏡像內(nèi)容所做的改變 |
| events | 實時打印服務(wù)端執(zhí)行的事件 |
| exec | 在已運行的容器中執(zhí)行命令 |
| export | 導(dǎo)出容器到本地快照文件 |
| history | 顯示鏡像每層的變更內(nèi)容 |
| images | 列出本地所有鏡像 |
| import | 導(dǎo)入本地容器快照文件為鏡像 |
| info | 顯示 Docker 詳細的系統(tǒng)信息 |
| inspect | 查看容器或鏡像的配置信息, 默認為 json 數(shù)據(jù) |
| kill | -s 選項向容器發(fā)送信號, 默認為 SIGKILL 信號 ( 強制關(guān)閉 ) |
| load | 導(dǎo)入鏡像壓縮包 |
| login | 登錄第三方倉庫 |
| logout | 退出第三方倉庫 |
| logs | 打印容器的控制臺輸出內(nèi)容, -f 選項可以持續(xù)輸出 |
| pause | 暫停容器 |
| port | 容器端口映射列表 |
| ps | 列出正在運行的容器, -a 選項顯示所有容器 |
| pull | 從鏡像倉庫拉取鏡像 |
| push | 將鏡像推送到鏡像倉庫 |
| rename | 重命名容器名 |
| restart | 重啟容器 |
| rm | 刪除已停止的容器, -f 選項可強制刪除正在運行的容器 |
| rmi | 刪除鏡像 ( 必須先刪除該鏡像構(gòu)建的所有容器 ) |
| run | 根據(jù)鏡像生成并進入一個新的容器 |
| save | 打包本地鏡像, 使用壓縮包來完成遷移 |
| search | 查找鏡像 |
| start | 啟動關(guān)閉的容器 |
| stats | 顯示容器對資源的使用情況 ( 內(nèi)存、CPU、磁盤等 ) |
| stop | 關(guān)閉正在運行的容器 |
| tag | 修改鏡像 tag |
| top | 顯示容器中正在運行的進程 ( 相當(dāng)于容器內(nèi)執(zhí)行 ps -ef 命令 ) |
| unpause | 恢復(fù)暫停的容器 |
| update | 更新容器的硬件資源限制 ( 內(nèi)存、CPU 等 ) |
| version | 顯示 Docker 客戶端和服務(wù)端版本信息 |
| wait | 阻塞當(dāng)前命令直到對應(yīng)的容器被關(guān)閉, 容器關(guān)閉后打印結(jié)束代碼 |
| daemon | 這個子命令已 過期, 將在 Docker 17.12 之后的版本中移出, 直接使用 dockerd |
用于管理的子命令列表
| 選項 | 說明 |
|---|---|
| container | 管理容器 |
| image | 管理鏡像 |
| network | 管理容器網(wǎng)絡(luò) ( 默認為 bridge、host、none 三個網(wǎng)絡(luò)配置) |
| plugin | 管理插件 |
| system | 管理系統(tǒng)資源。其中, docker system prune 命令用于清理沒有使用的鏡像、容器、數(shù)據(jù)卷以及網(wǎng)絡(luò) |
| volume | 管理數(shù)據(jù)卷 |
| swarm | 管理 Swarm 模式 |
| service | 管理 Swarm 模式下的服務(wù) |
| node | 管理 Swarm 模式下的 Docker 集群中的節(jié)點 |
| secret | 管理 Swarm 模式下的敏感數(shù)據(jù) |
| stack | Swarm 模式下利用 compose-file 管理服務(wù) |
說明
其中 container 、image 、system 一般用前面的簡化指令即可。Swarm 模式用來管理 Docker 集群, 它將一群 Docker 宿主機變成一個單一的虛擬的主機, 實現(xiàn)對多臺物理機的集群管理。
- 使用 Docker Swarm 管理 Docker 集群
- 初試Docker swarm命令
- 優(yōu)雅地實現(xiàn)安全的容器編排 - Docker Secrets
- 解讀1.13.1 | 探究Docker Stack和可對接網(wǎng)絡(luò)