当您想查看容器内部正在发生什么时,连接到正在运行的Docker容器会很有帮助。如果Docker容器无法正常工作,则可以登录或者连接到容器的Shell,然后运行ps
或top
之类的命令。您还可以在容器,安装新的命令/软件包,然后从中构建新的Docker镜像。
在本教程中,我们将说明如何连接到容器的进程以及如何登录到容器的shell。我们将使用docker的attach
和exec
命令。attach命令将会把当前终端标准输入,标准输出,标准错误附加到容器。这将让你可以使用当前终端查看日志。exec
命令将在容器启动新的shell会话,比如bash
,sh
等shell程序。这将允许你在容器中执行可用的Linux命令。
连接到容器
尽管可以在一个容器中运行多个进程,但大多数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进程的输出。
注意
要访问容器日志,您应该首选使用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会话。您可以使用sh
,bash
或镜像中所包含的其它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 exec
和docker attach
命令可以连接到正在运行的容器。要使用docker容器的shell会话,请使用exec
命令启动新的Shell会话。attach
命令将终端的标准输入,标准输出,标准错误连接到正在运行的容器。如有任何疑问,请在下面发表评论。