Docker 常用指令詳解

前言


上一篇文章 中已經(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 、infowarn 、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í)行一個前臺進程 ( 就是能在控制臺不斷輸出的或者一直等待的那種程序, 如 tomcatcatalina.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 學(xué)習(xí)總結(jié)

使用 Dockerfile 構(gòu)建鏡像

使用 Docker Compose 構(gòu)建容器

Docker Daemon 連接方式詳解

Docker 下的網(wǎng)絡(luò)模式


轉(zhuǎn)載請注明出處:http://www.itdecent.cn/p/7c9e2247cfbd

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容