21 个可执行且信息丰富的 Docker 命令的汇编,供您快速参考。
Docker 有一组广泛的命令(更准确地说是子命令)。你不可能使用所有这些,也没有必要去追求那个成就。
大多数时候,您将使用特定的命令子集来管理容器和映像。
我将列出这些常见但必不可少的 Docker 命令,这些命令对于 Docker 用户和管理员的日常使用非常有用。
我将这些 Docker 命令分为两类:
可执行文件:用于运行和管理容器的命令
信息性:用于提取有关容器、图像和图层信息的命令。
听起来不错?让我们看看这些必须知道的 Docker 命令以及实际示例。
这些 Docker 命令用于管理容器和构建镜像。它们执行特定的任务,因此我将它们称为“Docker 执行命令”。
此时,我建议您使用此映像刷新 Docker 容器生命周期的基础知识:
除此之外,让我们看看命令及其示例。
如果您的系统上安装了 Docker,您可以运行示例和教程来练习。
Docker run 用于创建容器并立即启动它。
该命令首先查找要运行的容器的现有映像,如果找不到,则从存储库中提取它,从该映像创建一个容器,然后立即开始运行它。
让我们从官方存储库运行 Nginx 容器。
avimanyu@localhost:~$ docker run --name nginx-root -p 80:80 -d nginx 8411c3df0fd7f57395b0732b1b1963c215040eed669dc8327200db197ff6099b avimanyu@localhost:~$
使用 --name
标志,您可以自定义其本地名称,并将主机端口映射到容器端口。 -d
或 --detach
有助于以分离模式在后台运行容器。
“docker run”是“docker 容器运行”的缩写版本。 Docker 官方建议使用较长的形式,但较旧且较短的形式仍然很流行,因为输入命令所需的时间较短。
该命令用于停止已经运行的容器。语法很简单:
docker stop container-name-or-id
让我们停止在第一个命令中启动的容器。
avimanyu@localhost:~$ docker stop nginx-root nginx-root avimanyu@localhost:~$
如果您在运行时没有自定义名称,可以使用 docker ps 命令检查随机生成的名称(稍后讨论)。
当您使用 docker stop 命令时,它会发送 SIGTERM 信号请求终止,然后根据终止情况管理 SIGKILL 信号。
这用于启动已停止的容器。语法很简单:
docker start container-name-or-id
让我们启动您在上一个示例中刚刚停止的 Nginx 容器。
avimanyu@localhost:~$ docker start nginx-root nginx-root avimanyu@localhost:~$
请注意,与 docker run 不同,docker start 无法从镜像创建新容器。它只能“运行”处于停止状态的容器。
docker exec,顾名思义,用于在已经运行的容器中执行新命令。
avimanyu@localhost:~$ docker exec -ti nginx-root /bin/bash root@72acb924f667:/#
现在您正在容器内运行 bash shell。
在 -ti
中,t 表示“终端”,i 表示“交互式”,以保持 STDIN(标准输入)打开(即使未连接)。
要退出容器 shell,只需使用 exit 命令返回到主机控制台。
root@72acb924f667:/# exit exit avimanyu@localhost:~$
要重命名容器,请使用以下语法:
docker rename old_container_name new_container_name
让我们将 nginx-root 容器重命名为 nginx-toor。 请注意,即使容器已启动并运行,您也可以执行此操作!
avimanyu@localhost:~$ docker rename nginx-root nginx-toor
使用docker暂停
,您可以暂停指定容器中的所有进程。使用 SIGSTOP 信号,暂停状态下的进程会注意到该信号。
avimanyu@localhost:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 72acb924f667 nginx "nginx -g 'daemon of…" 4 hours ago Up 4 hours 0.0.0.0:80->80/tcp nginx-toor e2dd68fdd220 wordpress:5.3.0-php7.1-apache "docker-entrypoint.s…" 3 days ago Up 3 days 0.0.0.0:8088->80/tcp wp2_wordpress_1 016709c05add wordpress:5.3.0-php7.1-apache "docker-entrypoint.s…" 3 days ago Up 3 days 0.0.0.0:8080->80/tcp wp1_wordpress_1 656f6761ce0d mariadb:10.4.10-bionic "docker-entrypoint.s…" 8 days ago Up 3 days 3306/tcp wp2_mysql_1 ee953bb14483 mariadb:10.4.10-bionic "docker-entrypoint.s…" 8 days ago Up 3 days 3306/tcp wp1_mysql_1
让我们暂停 nginx-toor 容器:
avimanyu@localhost:~$ docker pause nginx-toor nginx-toor
现在您可以再次使用 docker ps 命令检查它是否真的暂停了:
avimanyu@localhost:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 72acb924f667 nginx "nginx -g 'daemon of…" 4 hours ago Up 4 hours (Paused) 0.0.0.0:80->80/tcp nginx-toor e2dd68fdd220 wordpress:5.3.0-php7.1-apache "docker-entrypoint.s…" 3 days ago Up 3 days 0.0.0.0:8088->80/tcp wp2_wordpress_1 016709c05add wordpress:5.3.0-php7.1-apache "docker-entrypoint.s…" 3 days ago Up 3 days 0.0.0.0:8080->80/tcp wp1_wordpress_1 656f6761ce0d mariadb:10.4.10-bionic "docker-entrypoint.s…" 8 days ago Up 3 days 3306/tcp wp2_mysql_1 ee953bb14483 mariadb:10.4.10-bionic "docker-entrypoint.s…" 8 days ago Up 3 days 3306/tcp wp1_mysql_1
要恢复,只需使用取消暂停:
avimanyu@localhost:~$ docker unpause nginx-toor nginx-toor
docker Kill
用于向容器发送默认的 KILL 信号。与 docker stop 不同的是,它直接发送 SIGKILL 信号,而不用 SIGTERM 信号请求终止。
这是一种基于典型紧急情况强制终止的突然方法,因此始终建议首先使用 docker stop 。
avimanyu@localhost:~$ docker kill nginx-root nginx-root avimanyu@localhost:~$
如果您要修改 Docker 映像,则需要先构建自定义映像,然后才能使用它来部署新容器。
docker build 是构建此类修改后的映像的命令。
我建议阅读有关使用 Dockerfile 创建自定义 Docker 映像的详细指南。在这里,我仅举一个简单的例子。
这是一个示例 Dockerfile:
FROM alpine:latest RUN apk update RUN apk add vim
首先,它从官方存储库下载 Alpine Linux 映像。然后它会更新包缓存,然后另外将 Vim 编辑器安装到其中。
这意味着从此映像运行的容器将预安装 Vim 编辑器。
按以下方式构建图像:
avimanyu@localhost:~/docker-build-test$ docker image build -t docker-build-test-image . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM alpine:latest ---> 965ea09ff2eb Step 2/3 : RUN apk update ---> Using cache ---> b16ea26b03aa Step 3/3 : RUN apk add vim ---> Using cache ---> b283eaf606c1 Successfully built b283eaf606c1 Successfully tagged docker-build-test-image:latest
修改后的镜像名为docker-build-test-image,该命令在当前目录中查找 Dockerfile。
cp 命令对于有经验的 Linux 用户来说已经很熟悉了,它可以在不同位置之间复制文件和目录。
类似地,docker cp 或简称 docker cp 用于在容器和主机之间复制文件和目录。
avimanyu@localhost:~/nginx-root$ docker cp nginx-root:/etc/nginx/nginx.conf ./config
上面的命令会将 nginx.conf 文件从容器 nginx-root 复制到名为 config 的目录,该目录必须已位于当前工作目录(也名为 nginx-root)中。请注意,容器的文件系统结构(/etc/nginx)与常规 Linux 系统类似。
与通过 Linux 终端删除文件和目录类似,Docker 也使用类似的语法来删除映像和容器。
docker rm container_or_image_name_or_id
尝试删除您之前在本教程中创建的 nginx-root 容器:
avimanyu@localhost:~$ docker rm nginx-root nginx-root
输出不会说容器已删除或类似的内容,但它仍然被删除。
您无法删除正在运行的容器。您无法删除与容器关联的映像,即使是已停止的映像。
让我们总结一下上面的所有命令:
我将再次创建 nginx-root 容器以在其他一些命令示例中使用它。
为您提供与特定任务和现有可读参数相关的信息的 Docker 命令可以称为信息性 docker 命令。
为此,我列出了 11 个 Docker 命令:
docker ps 是 docker container ls 的缩写,可用于列出系统上当前运行的所有容器,并通过其他统计信息检查其状态。
avimanyu@localhost:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e2dd68fdd220 wordpress:5.3.0-php7.1-apache "docker-entrypoint.s…" 3 days ago Up 3 days 0.0.0.0:8088->80/tcp wp2_wordpress_1 016709c05add wordpress:5.3.0-php7.1-apache "docker-entrypoint.s…" 3 days ago Up 3 days 0.0.0.0:8080->80/tcp wp1_wordpress_1 80e12e4a431c nginx "nginx -g 'daemon of…" 3 days ago Up 3 days 0.0.0.0:80->80/tcp nginx-root 656f6761ce0d mariadb:10.4.10-bionic "docker-entrypoint.s…" 7 days ago Up 3 days 3306/tcp wp2_mysql_1 ee953bb14483 mariadb:10.4.10-bionic "docker-entrypoint.s…" 7 days ago Up 3 days 3306/tcp wp1_mysql_1 avimanyu@localhost:~$
如果您是经验丰富的 Linux 用户,您可能已经熟悉用于使用 Linux 终端检查目录内容的 ls 命令。
类似地,在 Docker 中,docker image ls
或简称 docker images
用于检查系统中存在的所有 Docker 镜像的列表。这些图像可能是官方的或自定义的,具体取决于它们的构建方式。
avimanyu@localhost:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 4152a9608752 10 days ago 126MB avimanyu786/flask-test latest f8e2d6f524ef 2 weeks ago 122MB avimanyu786/nginx-test latest 5fe5e88b9eaa 2 weeks ago 23MB wordpress 5.3.0-php7.1-apache f0985bcc2ffb 2 weeks ago 530MB mariadb 10.4.10-bionic c1c9e6fba07a 2 weeks ago 355MB avimanyu786/alpine-with-vim latest b283eaf606c1 2 weeks ago 34.7MB jwilder/nginx-proxy latest d1c0beda6804 3 weeks ago 161MB nginx alpine b6753551581f 5 weeks ago 21.4MB python alpine 204216b3821e 5 weeks ago 111MB alpine latest 965ea09ff2eb 5 weeks ago 5.55MB mysql latest c8ee894bd2bd 6 weeks ago 456MB hello-world latest fce289e99eb9 11 months ago 1.84kB avimanyu@localhost:~$
除了容器和镜像之外,ls
还在 Docker 上用于类似的目的,以管理网络、卷、节点和集群服务。
此命令对于生产服务器调查和解决问题非常有帮助。您可以借助 docker log 命令获取任何容器的日志。
docker logs container_name_or_id
例如:
avimanyu@localhost:~$ docker logs nginx-toor 178.130.157.61 - - [30/Nov/2019:07:56:14 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" "-" 178.130.157.61 - - [30/Nov/2019:07:56:14 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" "-" . . . . x64|'|'|No|'|'|0.7d|'|'|..|'|'|AA==|'|'|112.inf|'|'|SGFjS2VkDQoxOTIuMTY4LjkyLjIyMjo1NTUyDQpEZXNrdG9wDQpjbGllbnRhLmV4ZQ0KRmFsc2UNCkZhbHNlDQpUcnVlDQpGYWxzZQ==12.act|'|'|AA==" 400 157 "-" "-" "-" 8.36.123.216 - - [30/Nov/2019:10:32:20 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" "-" 202.142.105.74 - - [30/Nov/2019:12:03:39 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0" "-"
要获取系统上安装的 Docker 版本的详细信息,只需使用:
docker version
这些信息如下所示:
avimanyu@localhost:~$ docker version Client: Docker Engine - Community Version: 19.03.4 API version: 1.40 Go version: go1.12.10 Git commit: 9013bf583a Built: Fri Oct 18 15:54:09 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.4 API version: 1.40 (minimum version 1.12) Go version: go1.12.10 Git commit: 9013bf583a Built: Fri Oct 18 15:52:40 2019 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.10 GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339 runc: Version: 1.0.0-rc8+dev GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657 docker-init: Version: 0.18.0 GitCommit: fec3683 avimanyu@localhost:~$
以下命令将显示安装 Docker 的主机系统的系统范围信息:
avimanyu@localhost:~$ docker info Client: Debug Mode: false Server: Containers: 9 Running: 5 Paused: 0 Stopped: 4 Images: 17 Server Version: 19.03.4 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657 init version: fec3683 Security Options: apparmor seccomp Profile: default Kernel Version: 4.15.0-50-generic Operating System: Ubuntu 18.04.2 LTS OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 985.4MiB Name: localhost ID: MZTJ:L5UF:WMQ3:VOIO:NR3N:336Q:YX2T:MSOU:5Y2N:MA7V:F6BQ:6UDY Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false WARNING: No swap limit support avimanyu@localhost:~$
docker检查命令用于显示有关容器和映像的低级信息。
您可以获得图像的校验和、层、容器 IP 地址和其他网络信息以及许多其他信息。
明智的做法是使用 grep 命令来过滤输出并仅获取所需的信息。
在以下示例中,我检查名为 avimanyu786/alpine-with-vim
的现有 Docker 映像。avimanyu@localhost:~$ docker inspect avimanyu786/alpine-with-vim:latest [ { "Id": "sha256:b283eaf606c18a4d0cc461ffdf86d53ecb173db5271129090a7421a64b1c514e", "RepoTags": [ "avimanyu786/alpine-with-vim:latest" ], "RepoDigests": [], "Parent": "sha256:b16ea26b03aaf5d9bd84157fbef61670d2f318c1af854ae04f0dbc290afd4b04", "Comment": "", "Created": "2019-11-12T11:51:24.458552779Z", "Container": "5b759e6f98e354a78dfca588eb65316b35f0cfb88c9119844471c8fcba362898", "ContainerConfig": { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "apk add vim" ], "Image": "sha256:b16ea26b03aaf5d9bd84157fbef61670d2f318c1af854ae04f0dbc290afd4b04", . . . . "Metadata": { "LastTagTime": "2019-11-12T11:51:24.563369343Z" } } avimanyu@localhost:~$
使用 docker History image-name 找出 Docker 系统上存在的任何镜像的历史记录。
图像的历史记录将以相反的时间顺序告诉您所做的更改和提交。
avimanyu@localhost:~$ docker history avimanyu786/alpine-with-vim:latest IMAGE CREATED CREATED BY SIZE COMMENT b283eaf606c1 2 weeks ago /bin/sh -c apk add vim 27.7MB b16ea26b03aa 2 weeks ago /bin/sh -c apk update 1.42MB 965ea09ff2eb 5 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B <missing> 5 weeks ago /bin/sh -c #(nop) ADD file:fe1f09249227e2da2… 5.55MB avimanyu@localhost:~$
该命令在管理多个容器时非常有用,因为它非常容易地显示主机到容器的端口映射:
avimanyu@localhost:~$ docker port nginx-root 80/tcp -> 0.0.0.0:80
在这里您可以看到主机端口 80 映射到名为 nginx-root 的容器的容器端口 80。
使用 docker diff,您可以检查容器文件系统上文件或目录的更改。它列出了容器文件系统自创建以来更改的文件和目录。
跟踪三种不同类型的更改 (A/D/C):
A:添加文件或目录
D:删除文件或目录
C:文件或目录的更改
让我们检查一下 nginx-root 容器的情况:
avimanyu@localhost:~$ docker diff nginx-root C /run A /run/nginx.pid C /var C /var/cache C /var/cache/nginx A /var/cache/nginx/client_temp A /var/cache/nginx/fastcgi_temp A /var/cache/nginx/proxy_temp A /var/cache/nginx/scgi_temp A /var/cache/nginx/uwsgi_temp avimanyu@localhost:~$
再次强调,top 是您可能已经熟悉的 Linux 命令。它用于列出系统上正在运行的进程。
使用 docker top,您可以列出容器内运行的进程。
docker top container_ID_or_name
如果我在我们的示例中使用 nginx-root 执行此操作,它会显示以下值。
avimanyu@localhost:~$ docker top nginx-root UID PID PPID C STIME TTY TIME CMD root 10355 10330 0 07:54 ? 00:00:00 nginx: master process nginx -g daemon off; systemd+ 10401 10355 0 07:54 ? 00:00:00 nginx: worker process root 12054 10330 0 10:22 pts/0 00:00:00 /bin/bash avimanyu@localhost:~$
docker stats 命令可以按原样使用,也可以用于特定容器。它向您显示容器详细信息以及系统资源使用情况。
首先我们看一下它的通用形式:
avimanyu@localhost:~$ docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 72acb924f667 nginx-root 0.00% 2.621MiB / 985.4MiB 0.27% 8.02kB / 8.92kB 6.8MB / 0B 3 e2dd68fdd220 wp2_wordpress_1 0.00% 44.24MiB / 985.4MiB 4.49% 1.9MB / 1.62MB 53.3MB / 61.4kB 11 016709c05add wp1_wordpress_1 0.00% 68.52MiB / 985.4MiB 6.95% 12MB / 4.77MB 136MB / 61.4kB 11 656f6761ce0d wp2_mysql_1 0.05% 70.12MiB / 985.4MiB 7.12% 1.05MB / 1MB 16MB / 2.15MB 30 ee953bb14483 wp1_mysql_1 0.04% 31.73MiB / 985.4MiB 3.22% 1.16MB / 4.76MB 50.6MB / 91.8MB 31
上述输出将持续实时生成,直到您使用 Ctrl+C 退出。
现在,如果您尝试针对特定容器,您将看到相同的输出,但仅针对该容器:
avimanyu@localhost:~$ docker stats nginx-root CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 72acb924f667 nginx-root 0.00% 2.621MiB / 985.4MiB 0.27% 8.02kB / 8.92kB 6.8MB / 0B 3
我也总结一下 Docker 命令的信息:
要获得所有 Docker 命令的详尽且全面的资源,您可以始终参考 Docker 的官方文档。
您会注意到常用的 Linux 命令和一些 Docker 命令之间有相似之处。我认为这是故意让 Docker 命令更容易记住。
希望您发现本文对您的日常 Docker 使用很有用。如果您有更多此类有用的命令可以分享,请随时在下面分享。反馈和建议,随时欢迎。