1/13
本章通过学习 8 个命令的基础使用方式来熟悉 Docker Client。
-
docker run
第一章启动容器时我们使用了 docker run 命令,这个命令会先根据镜像中的快照创建容器,然后再用镜像中的启动命令启动容器。
该命令的使用格式如下:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
除了第一章中的用法,还可以在镜像名称后,[COMMAND] 处添加自定义启动命令:
wuxianmimi ~ % docker run busybox ls
bin
dev
etc
home
lib
lib64
proc
root
sys
tmp
usr
var
echo 信息:
wuxianmimi ~ % docker run busybox echo wuxianmimi
wuxianmimi
wuxianmimi ~ %
⚠️:使用自定义启动命令后会覆盖默认启动命令。
上面的例子使用的是 busybox 镜像,但如果我们用 hello-world 镜像来使用相同的启动命令,会报错:
wuxianmimi ~ % docker run hello-world ls
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "ls": executable file not found in $PATH: unknown.
wuxianmimi ~ %
原因就是 hello-world 镜像中的文件系统快照,并没有执行 ls 的程序。我们传递所有启动命令,必须得在镜像的文件系统快照中存在对应的程序才行。
⚠️:docker run = docker create + docker start
-
docker ps
docker ps 的格式如下:
docker ps [OPTIONS]
这个命令可以输出计算机上所有正在运行的容器列表,先前测试的两个容器都是立即执行并退出的,所以我们得到列表为空:
wuxianmimi ~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
wuxianmimi ~ %
为了测试 docker ps,我们可以先在终端输入命令:
docker run busybox ping bilibili.com
然后新建终端窗口,输入 docker ps,会得到以下结果:
wuxianmimi ~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
35baf22ff8c1 busybox "ping bilibili.com" 7 seconds ago Up 6 seconds hardcore_chatelet
wuxianmimi ~ %
如果要查看所有的容器,而不只是正在运行的,可以添加 --all 选项:
docker ps --all
-
docker start
使用 docker ps --all 列出所有容器后,我们发现之前运行 hello-world 的容器目前处在 Exited 状态:
wuxianmimi ~ % docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc5bff91b03c hello-world "/hello" 3 seconds ago Exited (0) 2 seconds ago pedantic_hugle
wuxianmimi ~ %
在 Exited 状态并不代表容器没用了,我们可以使用 docker start 命令再次运行容器:
docker start -a cc5bff91b03c
“cc5bff91b03c”是容器的 CONTAINER ID,选项 -a 来获取容器的标准输出/标准错误。
docker start 的命令格式:
docker start [OPTIONS] CONTAINER [CONTAINER...]
-
docker system prune
这个命令会一口气删除所有未运行的容器来节省空间,同时也会删除本地的镜像缓存。
-
docker logs
如果我们在启动容器(docker start)时,忘记添加 -a 选项怎么办?我们就不能获得容器的标准输出了。
docker logs 命令就是可以在不重新启动容器的情况下,获取容器的标准输出。
命令格式:
docker logs [OPTIONS] CONTAINER
示例:
wuxianmimi ~ % docker create busybox echo hi mimi
6158cf3c32a190ff0bcb946d63317960269adbe70e71d8480022c82c0897ce74
wuxianmimi ~ % docker start 6158cf3c32a190ff0bcb946d63317960269adbe70e71d8480022c82c0897ce74
6158cf3c32a190ff0bcb946d63317960269adbe70e71d8480022c82c0897ce74
wuxianmimi ~ % docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6158cf3c32a1 busybox "echo hi mimi" 22 seconds ago Exited (0) 8 seconds ago affectionate_dirac
wuxianmimi ~ % docker logs 6158cf3c32a1
hi mimi
wuxianmimi ~ %
-
停止容器
有两种方法可以停止容器,docker stop 和 docker kill。
docker stop 发送 SIGTERM 信号给容器,容器接收到信号后,执行相关逻辑并停止。
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker kill 发送 SIGKILL 信号给容器,使它立即终止。
docker kill [OPTIONS] CONTAINER [CONTAINER...]
一般情况下我们使用 docker stop 来停止容器,对于容器已经未响应的情况,再使用 docker kill 命令。不过默认情况下,docker stop 命令会在信号发送后10秒钟后,对未停止的容器再发送 SIGKILL 信号。
-
docker exec
课程中通过 redis 演示,在安装了 redis 的机器上运行 redis-server 启动服务,然后在另一个终端输入 redis-cli 来连接 redis 服务。
然而用 docker run redis 启动 redis-server 后,我们如何连接这个服务?
这就要使用到 docker exec:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
这个命令使得我们可以在运行中的容器内执行命令:
wuxianmimi ~ % docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19b3b19d3225 redis "docker-entrypoint.s…" About a minute ago Exited (1) 13 seconds ago vigorous_williams
a9cd082a2d4c busybox "ping bilibili.com" 9 minutes ago Exited (137) 9 minutes ago heuristic_hopper
6158cf3c32a1 busybox "echo hi mimi" 23 minutes ago Exited (0) 23 minutes ago affectionate_dirac
wuxianmimi ~ % docker start 19b3b19d3225
19b3b19d3225
wuxianmimi ~ % docker exec -it 19b3b19d3225 redis-cli
127.0.0.1:6379> set myname mimi
OK
127.0.0.1:6379> get myname
"mimi"
127.0.0.1:6379>
在上面的例子中,我们先启动了 redis 容器,然后通过命令 docker exec -it [容器ID] redis-cli 成功在容器内执行了命令,连接到 redis-server 中。
命令中的 -it 有什么作用?
-it 是简写,相当于 -i -t。-i(-interactive) 选项使得我们终端保持连接到容器的标准输入,如果不添加的话,我们无法执行 redis-cli 连接成功后的操作。而 -t(-tty) 选项,可以理解为对容器3个标准的文件描述符的格式化,使得用户交互更方便。
不加 -it 选项执行 docker exec 命令,终端上仍旧没地方输入:
wuxianmimi ~ % docker exec 19b3b19d3225 redis-cli
wuxianmimi ~ %
只加 -i 选项执行 docker exec 命令,输入命令时没了提示,且输出的格式没之前好看:
wuxianmimi ~ % docker exec -i 19b3b19d3225 redis-cli
set myname mimi
OK
get myname
mimi
如果我们要在容器内执行很多命令,那么一直反复的敲 docker exec 我们也手累,这时候可以输入:
docker exec -it 19b3b19d3225 sh
我们会在容器内打开 sh,sh 是 shell,可以让我们可以在容器内执行命令(相当于进入了一台 Linux 虚拟机)
wuxianmimi ~ % docker exec -it 19b3b19d3225 sh
# cd /
# ls
bin boot data dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
# redis-cli
127.0.0.1:6379>
#
需要退出时,使用 Ctrl+d 快捷键。

浙公网安备 33010602011771号