如何连接Docker容器

当您想查看容器内部正在发生什么时,连接到正在运行的Docker容器会很有帮助。如果Docker容器无法正常工作,则可以登录或者连接到容器的Shell

4 min read
By myfreax
如何连接Docker容器

当您想查看容器内部正在发生什么时,连接到正在运行的Docker容器会很有帮助,这样你可以查看docker容器内部状态,调试,排除问题。

如果Docker容器无法正常工作,则可以登录或者连接到容器的Shell,然后运行pstop之类的命令。您还可以在容器安装命令或者软件,保存当前容器为Docker镜像。

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

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会话。

您可以使用shbash或镜像中所包含的其它shell程序。很多容器都会存在bash和sh等shell程序,你可以尝试其中的一个。

以下命令将在容器内创建一个新的Bash shell会话,您的命令提示符将更改,表明您正在使用容器内部的shell。

docker container exec -it my_mysql /bin/bash

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

结论

使用docker execdocker attach命令可以连接到正在运行的容器。要使用docker容器的shell会话,请使用exec命令启动新的Shell会话。

attach命令将终端的标准输入,标准输出,标准错误连接到正在运行的容器。如有任何疑问,请在下面发表评论。