1/13

第二章:了解 Docker Client 中基本命令

本章通过学习 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 stopdocker 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 快捷键。

⚠️:docker run 也可以添加 -it 选项

posted @ 2025-01-13 20:11  Hbro  阅读(18)  评论(0)    收藏  举报