每个 Docker 用户都应该知道的 21 个基本命令

Docker 有一组广泛的命令(更准确地说是子命令)。 你不可能全部使用它们,也没有必要去追求那个成就。

大多数时候,您将使用特定的命令子集来管理容器和图像。

我将列出这些常见但必不可少的 Docker 命令,这些命令对于 Docker 用户和管理员的日常使用非常有用。

我将这些 Docker 命令分为两类:

  1. 可执行文件:用于运行和管理容器的命令
  2. 信息性:用于提取有关容器、图像和层的信息的命令。

听起来不错? 让我们看看这些必须知道的 Docker 命令以及实际示例。

Docker执行命令 [for running and managing containers]

这些 Docker 命令用于管理容器和构建映像。 它们执行特定的任务,因此我称它们为“Docker 执行命令”。

此时,我建议您使用此映像刷新 Docker 容器生命周期的基础知识:

除此之外,让我们看看命令及其示例。

如果您的系统上安装了 Docker,您可以运行示例和教程进行练习。

1. Docker 运行

Docker run 用于创建容器并立即启动它。

此命令首先查找要运行的容器的现有映像,如果未找到,则从存储库中提取它,从该映像创建一个容器,然后立即开始运行它。

让我们从官方存储库运行一个 Nginx 容器。

[email protected]:~$ docker run --name nginx-root -p 80:80 -d nginx

8411c3df0fd7f57395b0732b1b1963c215040eed669dc8327200db197ff6099b
[email protected]:~$

随着 --name标志,您自定义其本地名称并将主机端口映射到容器端口。 -d 或者 --detach 有助于以分离模式在后台运行容器。

“docker run”是“docker container run”的较短版本。 Docker 官方推荐使用较长的形式,但较旧和较短的形式仍然很受欢迎,因为命令键入所需的时间较短。

2.码头工人停止

该命令用于停止已经在运行的容器。 语法很简单:

docker stop container-name-or-id

让我们停止您在第一个命令中启动的容器。

[email protected]:~$ docker stop nginx-root
nginx-root
[email protected]:~$

如果您在运行时没有自定义名称,您可以检查随机生成的名称 docker ps 命令(稍后讨论)。

当您使用 docker stop 命令时,它会发送 SIGTERM 信号请求终止,之后根据终止情况管理 SIGKILL 信号。

3.Docker启动

这用于启动已停止的容器。 语法很简单:

docker start container-name-or-id

让我们启动上一个你刚刚停止的 Nginx 容器 example.

[email protected]:~$ docker start nginx-root
nginx-root
[email protected]:~$

请注意,与 docker run 不同,docker start 不能从图像创建新容器。 它只能“运行”处于停止状态的容器。

4. 码头工人执行

docker exec,顾名思义,用于在已经运行的容器中执行新命令。

[email protected]:~$ docker exec -ti nginx-root /bin/bash
[email protected]:/#

现在你正在运行一个 bash 容器内的外壳。

-ti, 表示“终端”并且 一世 表示“交互式”以保持 STDIN(标准输入)打开,即使没有附加。

要退出容器外壳,只需使用 exit 命令返回主机控制台。

[email protected]:/# exit
exit
[email protected]:~$

5.Docker重命名

要重命名容器,请使用以下语法:

docker rename old_container_name new_container_name

让我们将 nginx-root 容器重命名为 nginx-toor。 请注意,即使容器已启动并正在运行,您也可以执行此操作!

[email protected]:~$ docker rename nginx-root nginx-toor

6. Docker 暂停/取消暂停

docker pause,您可以暂停指定容器中的所有进程。 使用了 SIGSTOP 信号,该信号被挂起的进程注意到。

[email protected]:~$ 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 容器:

[email protected]:~$ docker pause nginx-toor
nginx-toor

现在你可以检查它是否真的被暂停了 docker ps 再次命令:

[email protected]:~$ 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

要恢复,只需使用取消暂停:

[email protected]:~$ docker unpause nginx-toor
nginx-toor

7. 码头工人杀

docker kill 用于向容器发送默认的 KILL 信号。 不像 docker stop,它直接发送一个 SIGKILL 信号而不用 SIGTERM 信号请求终止。

这是一种基于典型紧急情况强制终止的突然方式,因此始终建议使用 docker stop 第一的。

[email protected]:~$ docker kill nginx-root
nginx-root
[email protected]:~$

8. Docker 构建

如果您正在修改 Docker 映像,则需要先构建自定义映像,然后才能使用它来部署新容器。

docker build 是构建此类修改图像的命令。

我推荐阅读这篇关于使用 Dockerfile 创建自定义 Docker 镜像的详细指南。 在这里,我将快速展示 example.

这是一个示例 Dockerfile:

FROM alpine:latest
RUN apk update
RUN apk add vim

首先它下载一个 高山 Linux 图片来自官方仓库。 然后它更新包缓存,然后另外安装 Vim 编辑器。

这意味着从此映像运行的容器将具有 Vim 编辑器 预装。

通过以下方式构建镜像:

[email protected]:~/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。

9. 码头工人cp

cp 命令已经为经验丰富的 Linux 用户所熟知,用于在不同位置之间复制文件和目录。

相似地, docker container cp,或者简单地说 docker cp 用于在容器和主机之间复制文件和目录。

[email protected]:~/nginx-root$ docker cp nginx-root:/etc/nginx/nginx.conf ./config

上面的命令会将 nginx.conf 文件从容器 nginx-root 复制到一个名为 config 的目录,该目录必须已经位于当前工作目录(也称为 nginx-root)中。 请注意容器的类似文件系统结构(/etc/nginx),就像常规 Linux 系统一样。

10. 码头工人

与通过 Linux 终端删除文件和目录类似,Docker 也使用类似的语法来删除镜像和容器。

docker rm container_or_image_name_or_id

尝试删除您之前在本教程中创建的 nginx-root 容器:

[email protected]:~$ docker rm nginx-root
nginx-root

输出不会说容器已删除或任何类似的内容,但它仍然被删除。

您不能删除正在运行的容器。 您无法删除与容器关联的图像,即使是已停止的图像。

让我们总结一下上述所有命令:

基本的可执行 Docker 命令

我将再次创建 nginx-root 容器以在其他一些命令示例中使用它。

Docker 信息命令 [for getting information about containers and images]

为您提供与特定任务和现有可读参数相关的信息的 Docker 命令可以称为信息丰富的 docker 命令。

在这里,我为此使用了 11 个 Docker 命令:

11. Docker ps/容器 ls

短缺 docker container ls, docker ps 可用于列出当前在系统上运行的所有容器,还可以使用其他统计信息检查它们的状态。

[email protected]:~$ 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

[email protected]:~$

12. Docker 镜像/镜像 ls

如果您是一位经验丰富的 Linux 用户,您可能已经熟悉 ls 用于使用 Linux 终端检查目录内容的命令。

同样,在 Docker 中, docker image ls 或者干脆 docker images 用于检查系统中存在的所有 Docker 映像的列表。 这些图像可能是官方的或自定义的,具体取决于它们的构建方式。

[email protected]:~$ 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
[email protected]:~$

除了容器和图像, ls 在 Docker 上也用于类似目的来管理网络、卷、节点和 swarm 服务。

13. 泊坞窗日志

此命令对生产服务器的调查和解决问题非常有帮助。 您可以在 docker logs 命令的帮助下获取任何容器的日志。

docker logs container_name_or_id

为了 example:

[email protected]:~$ 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" "-"

14.Docker版本

要获取系统上安装的 Docker 版本的详细信息,只需使用:

docker version

以下是这些信息的样子:

[email protected]:~$ 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
[email protected]:~$

15. 码头工人信息

以下命令将显示安装 Docker 的主机系统的系统范围信息:

[email protected]:~$ 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
[email protected]:~$

16. 码头工人检查

docker inspect 命令用于显示容器和图像的低级信息。

您可以获得诸如图像校验和、层、容器 IP 地址和其他网络信息以及许多其他信息之类的信息。

明智的做法是使用 grep 命令过滤输出并仅获取所需的信息。

在下面的 example,我检查了一个名为 avimanyu786/alpine-with-vim: 最新.

[email protected]:~$ 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"
}
}
[email protected]:~$

17. Docker 历史

使用 docker history image-name 查找 Docker 系统上存在的任何图像的历史记录。

图像的历史将告诉您按时间倒序进行的更改和提交。

[email protected]:~$ 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
[email protected]:~$

18. 码头工人端口

这个命令在管理多个容器时非常有用,因为它很容易显示主机到容器的端口映射:

[email protected]:~$ docker port nginx-root
80/tcp -> 0.0.0.0:80

在这里,您可以看到主机端口 80 映射到名为 nginx-root 的容器的容器端口 80。

19. Docker 差异

使用 docker diff,您可以检查容器文件系统上文件或目录的更改。 它列出了容器文件系统自创建以来更改的文件和目录。

跟踪三种不同类型的变化 (A/D/C):

  • A:添加文件或目录
  • D:删除文件或目录
  • C:更改文件或目录

让我们检查一下我们的 nginx-root 容器:

[email protected]:~$ 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
[email protected]:~$

20. 码头工人顶

再一次,top 是您可能已经熟悉的 Linux 命令。 它用于列出系统上正在运行的进程。

使用 docker top,您可以列出在容器中运行的进程。

docker top container_ID_or_name

如果我在我们的示例中使用 nginx-root 执行此操作,它会显示以下值。

[email protected]:~$ 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
[email protected]:~$

21. 码头工人统计

docker stats 命令可以按原样使用,也可以用于特定容器。 它向您显示容器详细信息以及系统资源使用情况。

首先,让我们看一下它的通用形式:

[email protected]:~$ 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退出。

现在,如果您对特定容器尝试它,您将看到相同的输出,但仅针对该容器:

[email protected]:~$ 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 命令

有关所有 Docker 命令的详尽和全面的资源,您可以随时参考 Docker 的官方 文件.

您会注意到常见的 Linux 命令和一些 Docker 命令之间的相似之处。 我认为故意让记住 Docker 命令变得更容易。

希望这篇文章对您的日常 Docker 使用很有帮助。 如果您有更多这样有用的命令要分享,请随时在下面分享。 反馈和建议,随时欢迎。