一、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 -itsh
使用这个命令打开一个新的终端,该终端将与正在运行的容器进行交互,您可以在其中输入各种命令,例如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。它们都有自己的用途,可根据您的需要使用。