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

在本教程中,我们将说明如何附加到容器的主要运行过程以及如何将shell获取到正在运行的容器。

附加到容器

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

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进程的输出。

192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.33.71:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"

要访问容器日志,您应该首选使用docker logs命令。

要从容器中卸下而不停止容器,请使用CTRL-p CTRL-q组合键。按下CTRL-c将停止容器。

如果要附加的正在运行的进程接受输入,则可以向其发送指令。

将shell带到容器中

docker exec命令允许您在正在运行的容器中运行命令。

要查看exec命令的工作方式以及如何使用该命令进入容器外壳,请首先启动一个新容器。我们将使用官方的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进入容器​​,即进入容器内部,请通过执行外壳二进制文件来启动新的外壳会话。您可以使用shbash或图像中包含的任何其他外壳。

以下命令将在容器内创建一个新的Bash会话:

docker container exec -it my_mysql /bin/bash

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

从这里开始,您可以按照与在其他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命令可以连接到正在运行的容器。要将交互式Shell放入容器,请使用exec命令启动新的Shell会话。 attach命令将终端连接到正在运行的容器。

如有任何疑问,请在下面发表评论。

如果你喜欢我们的内容可以选择在下方二维码中捐赠我们,或者点击广告予以支持,感谢你的支持