[051]Docker:与容器交互

966次阅读  |  发布于2年以前

上节课我们讲了 Docker 容器的 AttachedDetached 两种运行模式,这节课我们来学习一下如何分别在这两种运行模式下与容器进行交互。

1Attached 模式下交互

我们知道,当我们使用下面的命令运行一个 nginx 容器时:

PS C:\Users\Liam> docker container run -p 80:80 nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
...

它是 Attached 运行模式,它运行的是 nginx 镜像内置的一个名为 docker-entrypoint.sh 的入口脚本,这个脚本使命令行会话进入交互模式

所谓交互模式,就是应用程序(如 Docker 容器)的输出会反映到本地的命令行终端,我们在本地命令行终端的输入也会反映到正在与之交互的应用。 注意,这里说的交互模式与 Docker 的 AttachedDetached 的模式是两个概念,前者表达的是本地命令行终端和服务端应用的一种通讯模式,后者描述的是“运行”模式。且,交互模式并不是 Docker 特有的概念。

是不是每个镜像都有 docker-entrypoint.sh 入口脚本呢?如果没有入口脚本,会不会进入交互模式呢?

不是所有的镜像都有入口脚本,比如像 Ubuntu 这类的公共基础镜像就没有入口脚本。我们来看看使用没有入口脚本的镜像运行容器会发生什么:

PS C:\Users\Liam> docker container run ubuntu
PS C:\Users\Liam> docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
PS C:\Users\Liam> docker container ls -a
CONTAINER ID   IMAGE     COMMAND         CREATED          STATUS                        PORTS       NAMES
5b69eb3e6752   ubuntu    "bash"27 seconds ago   Exited (0) 26 seconds ago                 fervent_goldstine

可以看到执行 docker container run ubuntu 后没有任何输出,再执行 docker container ls 命令也没有看到正在运行的容器,再通过 docker container ls -a 发现刚刚其实是创建了一个容器。

从上面的 COMMAND 输出我们可以看到,它运行的是容器中的 bash 命令,只不过运行后便终止了。也就是说如果镜像没有入口脚本,容器创建后会立刻终止,不会进入交互模式。

那怎样在运行这类镜像的容器时进入交互模式呢?比如运行容器后要执行一些 Linux 命令。这时,我们可以在 run 命令后面加上 -it 选项:

PS C:\Users\Liam> docker container run -it ubuntu
root@a7a224318673:/#

注:-it 中的 -i--interactive 的简写,-t--tty 的简写。TTY 泛指计算机终端。

这样,我们就通过 bash 命令进入了 Linux 的 shell 交互,可以像在真正的 Linux 机器上一样执行 Linux 命令,比如:

root@a7a224318673:/# cd ~
root@a7a224318673:~# mkdir test
root@a7a224318673:~# ls
test
root@a7a224318673:~# exit
exit
PS C:\Users\Liam>

小技巧:输入 exit 或使用 Ctrl+D 指令可以退出容器的交互模式。

但退出交互模式后,容器也会随之终止(你可以通过 docker ps 命令验证)。可见,通过 docker container run -it ubuntu 命令运行容器,其实进入的是 Attached 运行模式下的交互模式。

2Attached 变 Detached

在上一节课中我们知道了如何将 Detached 模式转换为 Attached 模式,即通过 attach 命令将容器 attach 到前台。那反过来,在交互模式下,Attached 模式运行的容器如何切换为 Detached 后台运行模式呢?

也就是说,当我们使用下面的命令进入与容器的交互模式时:

PS C:\Users\Liam> docker container run -it ubuntu
root@a7a224318673:/#

如何退出交互会话但不终止容器的运行,让容器切换为 Detached 模式在后台运行呢?

很简单,大家记住一个快捷键:Ctrl + Q。在 Attached 运行模式的交互会话中,使用 Ctrl + Q 指令可以退出会话,并将 Attached 运行模式切换为 Detached 运行模式。

机敏的你可能会问:那通过 Ctrl + Q 退出会话后,怎么再次与后台 Detached 模式运行的容器交互呢?

3Detached 模式下交互

我们继续使用 nginx 镜像作为示例,用 Detached 模式运行一个容器:

PS C:\Users\Liam> docker container run -d -p 80:80 nginx
0db24c1885d895b411a22db9f1bb53628bca2fbece7c7da41da14f2c3769b0da

要与该 Detached 模式运行的容器交互,可以使用 Docker 提供的 exec 命令,它允许我们在 Detached 模式下运行容器中的指定应用,加上 -it 选项则可以在运行后进入交互模式,比如:

PS C:\Users\Liam> docker container exec -it 0db bash
root@0db24c1885d8:/#

此处也可以使用 docker container exec -it 0db sh 命令进入 shell 交互会话。

此命令将运行 bash 命令,并分配一个终端会话,进入 shell 交互模式。进入交互模式后,我们便可以执行一些 Linux 命令,比如查看容器应用的版本号、运行状态等:

root@0db24c1885d8:/# nginx -v
nginx version: nginx/1.21.6
root@0db24c1885d8:/# service nginx status
nginx is running.
root@0db24c1885d8:/#

此处因为已经是 Detached 运行模式了,所以 Ctrl + Q 指令对该会话是无效的。要退出交互会话可以输入 exit 或使用 Ctrl+D 指令。

4小结

本节课我们学习了如何分别在 AttachedDetached 两种运行模式中与容器进行交互。通过 docker container run -it ... 命令可以在运行容器的同时进入交互模式;通过 Ctrl + Q 指令可以在退出会话的同时将 Attached 模式变为 Detached 模式。通过 docker container exec -it ... 命令可以与后台 Detached 模式运行的容器交互。

另外,不要忘记前面几节课的内容哦,你还记得 container 命令行的简写吗?

下节课我们将开始学习 Docker 镜像。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8