当您想查看容器内部正在发生什么时,连接到正在运行的Docker容器会很有帮助。如果Docker容器无法正常工作,则可以登录或者连接到容器的Shell,然后运行pstop之类的命令。您还可以在容器,安装新的命令/软件包,然后从中构建新的Docker镜像

在本教程中,我们将说明如何连接到容器的进程以及如何登录到容器的shell。我们将使用docker的attachexec命令。attach命令将会把当前终端标准输入标准输出标准错误附加到容器。这将让你可以使用当前终端查看日志。exec命令将在容器启动新的shell会话,比如bashsh 等shell程序。这将允许你在容器中执行可用的Linux命令。

连接到容器

尽管可以在一个容器中运行多个进程,但大多数docker容器仅运行一个进程。使用ENTRYPOINTRUN指令指定启动容器时执行的命令。

docker attach命令允许您在终端连接到正在运行的容器。此时你当前终端绘画的标准输入,标准输出,标准错误都被正在远程容器进程所使用,你在终端任何输入会被容器进程捕获,容器进程写道标准输出,标准错误都能在当前终端会话中看到。

当您想实时查看写到标准输出,标准错误的内容,此功能很有用。为更好地了解attach命令的工作原理,我们使用官方的Nginx镜像,创建一个Nginx容器。

docker container run --name my_nginx -d -p 8080:80 nginx

-p 8080:80选项告诉Docker将容器的端口8080映射到主机上的端口80。通过列出容器来验证my_nginx容器是否正在运行:

docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
8e1c4974a8d8        nginx               "nginx -g 'daemon of…"   3 minutes ago       Up 2 seconds        0.0.0.0:8080->80/tcp   my_nginx

使用容器的ID或名称连接到容器:

docker container attach my_nginx

运行容器时执行的nginx镜像默认命令为CMD ["nginx", "-g", "daemon off;"]。运行attach命令时,终端的标准输出,标准出入,标准错误将附加到nginx进程。在浏览器中打开127.0.0.1:8080,您可以实时观看nginx进程的输出。

注意

要访问容器日志,您应该首选使用docker logs命令。要退出容器的连接而不停止容器,请使用CTRL-p CTRL-q组合键。按下CTRL-c将停止容器。如果连接到正在运行进程接受标准输入,则可以向其该进程发送指令。

将shell带到容器中

docker exec命令允许您在正在运行的容器中运行命令。要查看exec命令的工作方式以及如何使用该命令进入容器shell会话,请首先启动一个新容器。我们将使用官方的MySQL镜像:

docker container run --name my_mysql -d mysql

这将创建一个名为my_mysql的容器。要在容器内执行命令,请运行以下命令:

docker container exec -it my_mysql ls /var

-i选项代表交互式,-t告诉Docker分配一个伪TTY设备。ls命令将列出容器的/var目录中的文件和目录:

backups  cache	lib  local  lock  log  mail  opt  run  spool  tmp

如需要在容器​中启动shell会话​,请通过执行shell二进制文件来启动新的shell会话。您可以使用shbash或镜像中所包含的其它shell程序。很多容器基本都会存在bash和sh的shell程序,你可以尝试其中的一个。以下命令将在容器内创建一个新的Bash shell会话:

docker container exec -it my_mysql /bin/bash

您的命令提示符将更改,表明您正在使用容器内部的shell。

现在,您可以像在Linux服务器上一样运行可用的命令。例如,要获取当前个环境变量的列表,请键入env

env

输出将如下所示:

HOSTNAME=e0214d97e0fe
MYSQL_ROOT_PASSWORD=my-secret-pw
PWD=/
HOME=/root
MYSQL_MAJOR=8.0
GOSU_VERSION=1.7
MYSQL_VERSION=8.0.17-1debian9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

结论

使用docker execdocker attach命令可以连接到正在运行的容器。要使用docker容器的shell会话,请使用exec命令启动新的Shell会话。attach命令将终端的标准输入,标准输出,标准错误连接到正在运行的容器。如有任何疑问,请在下面发表评论。