专业编程基础技术教程

网站首页 > 基础教程 正文

Docker attach 和 Docker exec 的区别

ccvgpt 2024-07-20 12:00:09 基础教程 15 ℃

当想查看容器内的情况时,连接到正在运行的Docker容器是非常有用的。如果Docker容器未按预期运行,则可以docker attach到容器或docker exec到容器的shell窗口运行ps或top等命令。还可以在容器中安装新软件包,并从中构建新的Docker映像。

Attach to a Container

虽然可以在一个容器中运行多个进程,但大多数docker容器只运行一个进程。容器启动时所执行的命令是使用ENTRYPOINT或CMD指令指定的。

Docker attach 和 Docker exec 的区别

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 execdocker attach命令允许你连接到正在运行的容器,要进入容器的交互式 shell,使用exec命令,attach命令是将终端连接到容器正在运行的主进程中。

Tags:

最近发表
标签列表