当您想查看容器内部正在发生什么时,连接到正在运行的Docker容器会很有帮助,这样你可以查看docker容器内部状态,调试,排除问题。
如果Docker容器无法正常工作,则可以登录或者连接到容器的Shell,然后运行ps
或top
之类的命令。您还可以在容器安装命令或者软件,保存当前容器为Docker镜像。
尽管可以在一个容器中运行多个进程,但大多数docker容器仅运行一个进程。可以使用ENTRYPOINT
或RUN
指令指定启动容器时运行的命令。
docker attach
命令允许您在当前终端连接到正在运行的容器。此时你当前终端会话的标准输入,标准输出,标准错误都被容器进程所使用。
你在终端任何输入会被容器进程捕获,容器进程写到标准输出,标准错误都能在当前终端会话中看到。
当您想实时查看写到标准输出,标准错误的内容时,此功能很有用。为更好地了解attach
命令的工作原理,我们使用官方的Nginx镜像,创建一个Nginx容器。
docker container run --name my_nginx -d -p 8080:80 nginx
命令将使用nginx镜像创建命令为my_nginx
的容器。
-p 8080:80
选项将容器的端口8080映射到主机端口80。-d
指示在后台运行容器。
在连接到docker容器之前,我们需要通过运行命令docker container ls
列出容器来验证my_nginx容器是否正在运行。
当确定my_nginx容器正在运行时,接下运行命令docker container attach
命令连接到容器,attach
子命令的参数可以是容器名称或者容器id。
docker container attach my_nginx
docker container attach my_nginx
将以容器名称连接容器。
创建my_nginx容器时将运行nginx镜像默认命令CMD ["nginx", "-g", "daemon off;"]
。daemon off
指示在前台运行。nginx的标准输入,输出,错误都写到容器的标准重定向中。
运行attach
命令时,终端的标准输出,标准出入,标准错误将附加到nginx
进程。在浏览器中打开127.0.0.1:8080
,您可以实时观看nginx进程的输出。
要访问容器日志,您应该首先使用docker logs
命令。要退出容器的连接而不停止容器,请使用CTRL-p
CTRL-q
组合键。
CTRL-c
将停止容器。如果连接的进程接受标准输入,则可以向其该进程发送指令。在这个示例nginx不接受标准输入。因此不接受任何指令。
容器shell
docker exec
命令允许您在正在运行的容器中运行命令。我们将使用MySQL镜像演示exec
命令的工作方式以及如何使用exec
命令进入容器shell会话。
首先启动一个新容器。我们将使用官方的MySQL镜像。
docker container run --name my_mysql -d mysql
命令将创建一个名为my_mysql的容器,容器将在后台运行。
docker container exec -it my_mysql ls /var
命令将会在容器内执行ls
命令。
-i
选项使用交互式运行命令,-t
指示Docker分配一个伪TTY设备。ls
命令将列出容器的/var
目录中的文件和目录。
如需要在容器中启动shell会话,可以直接指定shell二进制文件来启动新的shell会话。
您可以使用sh
,bash
或镜像中所包含的其它shell程序。很多容器都会存在bash和sh等shell程序,你可以尝试其中的一个。
以下命令将在容器内创建一个新的Bash shell会话,您的命令提示符将更改,表明您正在使用容器内部的shell。
docker container exec -it my_mysql /bin/bash
现在,您可以像在Linux服务器上一样运行可用的命令。例如运行env
获取当前个环境变量的列表。
结论
使用docker exec
和docker attach
命令可以连接到正在运行的容器。要使用docker容器的shell会话,请使用exec
命令启动新的Shell会话。
attach
命令将终端的标准输入,标准输出,标准错误连接到正在运行的容器。如有任何疑问,请在下面发表评论。