当想查看容器内的情况时,连接到正在运行的Docker容器是非常有用的。如果Docker容器未按预期运行,则可以docker attach到容器或docker exec到容器的shell窗口运行ps或top等命令。还可以在容器中安装新软件包,并从中构建新的Docker映像。
Attach to a Container
虽然可以在一个容器中运行多个进程,但大多数docker容器只运行一个进程。容器启动时所执行的命令是使用ENTRYPOINT或CMD指令指定的。
docker attach命令将终端连接到正在运行的容器。可以实时查看容器中标准输出的内容。
为了更好地理解attach命令的工作原理,我们使用官方的Nginx映像运行一个Nginx容器。
$ docker run --name my_nginx -d -p 8080:80 nginx
-d 选项告诉Docker将容器后台运行。
-p 8080:80选项告诉Docker将容器中的80端口映射到主机上的8080端口。
列出容器以确保“my_nginx”容器正在运行:
$ docker ps
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
使用docker attach进入容器:
$ docker attach my_nginx
因为nginx映像的默认命令为CMD[“nginx”、“-g”、“daemon off;”],所以当运行attach命令时,终端将连接到nginx进程,而不是一个新的shell窗口。
在浏览器中打开127.0.0.1:8080,可以实时查看nginx进程的输出。
192.168.0.1 - - [12/Sep/2021:10: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.0.1 - - [12/Sep/2021:10: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命令查看容器日志,而不是docker attach。
要在不停止容器的情况下退出容器,使用ctrl p + q 组合键。按ctrl c 键可停止容器。
Get a Shell to a Container
docker exec命令允许你在正在运行的容器中运行命令。
要查看exec命令的工作方式以及如何使用它进入容器,我们将使用官方的MySQL映像:
$ docker run --name my_mysql -d mysql
这将创建一个名为“my_mysql”的容器。
要在容器内执行命令,运行以下命令:
$ docker exec -it my_mysql ls /var
-i选项代表交互式,-t告诉Docker分配一个伪tty终端。ls命令将列出容器/var目录中的所有文件和目录:
backups cache lib local lock log mail opt run spool tmp
要获取容器的shell(即进入容器内部),可以使用sh、bash或镜像中内置的其他shell。
$ docker 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 exec和docker attach命令允许你连接到正在运行的容器,要进入容器的交互式 shell,使用exec命令,attach命令是将终端连接到容器正在运行的主进程中。