当您想查看容器内发生的情况时,连接到正在运行的 Docker 容器会很有帮助。如果 Docker 容器未按预期工作,您可以附加到容器或为容器获取 shell 并运行以下命令:ps
or top
。还可以进入容器,安装新的包,构建一个新的 Docker 镜像从中。
在本教程中,我们将解释如何附加到容器的主要运行进程以及如何为正在运行的容器获取 shell。
附加到容器#
尽管可以在容器中运行多个进程,但大多数 docker 容器只运行单个进程。启动容器时执行的命令使用ENTRYPOINT
and/or RUN
操作说明。
The docker附加命令允许您将终端附加到正在运行的容器。当您想要实时查看标准输出中写入的内容或以交互方式控制过程时,这非常有用。
为了更好地理解如何attach
命令可以工作了run使用官方 Nginx 镜像的新分离 Nginx 容器。
docker container run --name my_nginx -d -p 8080:80 nginx
The -p 8080:80
选项告诉 Docker 将容器中的端口 80 映射到主机上的端口 8080。
列出容器确保“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
过程。
Open 127.0.0.1:8080
在你的browser并且可以实时观察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
停止容器。
如果您附加的正在运行的进程接受输入,您可以向其发送指令。
获取容器的外壳#
The docker 执行命令允许您在正在运行的容器内运行命令。
看看如何exec
命令的工作原理以及如何使用它进入容器 shell,首先启动一个新容器。我们将使用官方 MySQL 镜像:
docker container run --name my_mysql -d mysql
这将创建一个名为“my_mysql”的容器。
要在容器内执行命令,请运行以下命令:
docker container exec -it my_mysql ls /var
The -i
选项代表交互式,并且-t
告诉 Docker 分配一个伪 TTY 设备。这ls命令将列出容器内的所有文件和目录/var
目录:
backups cache lib local lock log mail opt run spool tmp
要获得容器的 shell,即进入容器内部,请通过执行 shell 二进制文件来启动新的 shell 会话。您可以使用sh
, bash
,或图像中包含的任何其他外壳。
下面的命令将在容器内创建一个新的 Bash 会话:
docker container exec -it my_mysql /bin/bash
您的命令提示符将会更改,表明您现在正在使用容器 shell。
从这里,您可以像在任何其他 Linux 服务器上一样运行命令。例如,要获取当前的列表环境变量
type 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
结论#
The docker exec
and docker attach
命令允许您连接到正在运行的容器。要获得容器的交互式 shell,请使用exec
命令启动新的 shell 会话。这attach
命令将您的终端附加到正在运行的容器。
如果您有任何疑问,请在下面留言。