您的位置:

Docker attach和exec的区别

一、attach 和 exec的定义和作用

docker attach和exec都是docker容器的命令,用于进入正在运行的Docker容器的命令行界面,以实现对容器的调试和管理。

docker attach:可以让你进入到容器的标准输入,输出和错误输出(stdin,stdout和stderr)。可以使用docker attach连接正在运行的容器并查看输出。这对于实时查看容器控制台输出非常有用。连接后可以通过Ctrl+C或Ctrl+D断开连接。

docker exec:是在正在运行的容器中运行新命令的首选方式。这个命令可以在后台运行,不影响容器的运行状态。通过docker exec也可以连接到正在运行的容器并运行一些命令。

二、attach 和 exec的区别

1、使用场景

attach和exec的最大区别在于使用场景。docker attach适用于监视容器的输出,通常用于Container 1的启动和关闭日志。docker exec适用于创建容器中的新进程,通常用于 Container 1 启动之后在运行容器上也运行一些命令。

2、交互性

docker attach与容器进行实时连接。这种连接非常类似于Telnet连接和交互式脚本,有一些限制,不能与容器进行完整的交互。这意味着,无法查看挂起的输出或使用键盘输入来运行新的命令。如果要输入新的命令,必须首先中断连接。

docker exec则与容器进行非实时连接,您可以交互式地运行新命令,查询文件并在容器中运行新程序。它提供了一个更好的虚拟终端环境,其中可以输入和输出数据。

3、效率

docker attach的效率较低,因为它会阻塞正在运行的容器。如果容器的输入/输出被占用,可能会更加显著。

docker exec的效率较高,因为它不会阻塞正在运行的容器。它是在一个新的进程中运行的,并且不会影响正在运行的容器的性能和安全。

4、退出容器

从使用方面来讲,当使用docker exec退出容器时,容器会继续运行。仍可以使用docker attach重新在运行的容器上查看信息。

然而,如果使用docker attach退出容器,容器将会停止运行。如果需要重新运行容器,则需要使用docker start命令重新启动容器。

三、示例

1、docker attach实例

$ docker run -d busybox sh -c "while true; do echo hello world; sleep 1; done"
$ docker ps
$ docker attach 

  

现在,您可以在这个容器中看到随时间推移输出的“Hello World”语句。如果要停止查看,请按ctrl+C。

2、docker exec实例

$ docker run -dit busybox
$ docker exec -it  sh

  

使用这个命令打开一个新的终端,该终端将与正在运行的容器进行交互,您可以在其中输入各种命令,例如ls、cat、ps等。使用exit命令退出终端,但容器仍会保持运行状态。

3、查看实时日志

$ docker run -d busybox sh -c "while true; do echo hello world; sleep 1; done"
$ docker logs -f 

  

此命令将连接到正在运行的容器并显示实时输出。此命令非常有利于查看日志文件和其他文件,如/var/log/messages。

结论

容器的管理需要使用一些工具,但最好的工具是docker attach和docker exec。它们都有自己的用途,可根据您的需要使用。