docker附加和docker执行之间的区别
两者都能够在容器中执行命令。 两者都可以分离容器。
那么docker exec和docker attach究竟有什么区别呢?
有一个提交公关添加到文档:
注意:该命令(
attach
)不用于在容器中运行新的进程。 请参阅:docker exec
。
“ Docker。如何获得bash \ ssh在runned容器( run -d
)? ”的答案说明了区别:
(docker> = 1.3)如果我们使用
docker attach
, 我们只能使用shell的一个实例 。
所以如果我们想用容器的shell的新实例打开新的terminal,我们只需要运行docker exec
如果Docker容器是使用
/bin/bash
命令启动的,则可以使用attach来访问它,如果不是,则需要执行命令以使用exec
在容器内创build一个bash实例。
正如在这个问题中提到的:
- Attach不是用于在容器中运行额外的东西,而是用于附加到正在运行的进程。
- “
docker exec
”专门用于在已经启动的容器中运行新的东西,不pipe是shell还是其他进程。
同样的问题补充说:
虽然
attach
并没有很好的命名,特别是因为LXC命令lxc-attach
(这更像是docker exec <container> /bin/sh
,但是特定于LXC),它确实有一个特定的目的,将字面上连接到进程Docker开始。
根据进程的不同 , 行为可能会有所不同 ,例如,连接到/bin/bash
会给你一个shell,但是连接到redis服务器就像刚刚直接启动redis而没有守护进程一样。
当使用/ bin / bash启动容器时,它将成为容器PID 1,并使用docker attach来获取容器的PID 1。 所以, docker attach <container-id>会带你进入bashterminal,因为它是PID 1,正如我们在启动容器时提到的那样。 从容器中退出将停止容器。
而在docker exec命令中,您可以指定要input的shell。 它不会把你带到容器的PID 1。 它将为bash创build一个新的进程。 docker exec -it <container-id> bash 。 从容器中退出不会阻止容器。
你也可以使用nsenter来进入容器。 nsenter -m -u -n -p -i -t <容器的 PID >可以使用以下命令查找容器的PID:docker inspect <container-id> | grep PID
注意:如果你用-d标志启动你的容器,那么从容器中退出不会停止容器,无论你使用attach还是exec来进入。