2015-06-21 123 views

回答

52

有一個commit PR其加入到該文檔:

注:此命令(attach)是不適合的容器中運行的一個新進程。 參見:docker exec

答案爲 「Docker. How to get bash\ssh inside runned container (run -d)?」 示出的區別:

(搬運工> = 1.3)如果我們使用docker attach我們可以僅使用一個殼的實例。
因此,如果我們想打開集裝箱的外殼的新實例新的終端,我們只需要運行docker exec

如果泊塢窗容器使用/bin/bash命令啓動,您可以訪問它使用連接,如果沒有,那麼你需要執行使用exec在容器內部創建bash實例的命令。

正如this issue提到:

  • 附上不是在一個容器中運行一個額外的東西,它是連接到正在運行的進程。
  • docker exec」專門用於在已啓動的容器中運行新事物,無論是殼還是其他過程。

同樣的問題補充:

雖然attach沒有得到很好的命名特別是因爲LXC命令lxc-attach的,(這是更接近docker exec <container> /bin/sh,但LXC具體的),它有一個特定的從字面上將您附加到Docker啓動的過程。
根據過程的不同,行爲可能會有所不同,例如附加到/bin/bash會給你一個shell,但是附加到redis-server會像你剛剛直接啓動redis而沒有守護進程一樣。

7

當容器使用/斌/慶典開始那麼變得容器PID 1和搬運工ATTACH用於獲取內部容器的PID 1。所以碼頭附加<容器ID>將帶你進入bash終端,因爲它是PID 1,正如我們在啓動容器時提到的那樣。從容器中退出將停止容器。

而在docker exec命令中,您可以指定要輸入的shell。它不會把你帶到容器的PID 1。它將爲bash創建一個新的進程。 docker exec -it < container-id> bash。 從容器中退出不會阻止容器。

您還可以使用nsenter進入容器內部。 nsenter -m -u -n -p -i -t <容器的PID> 您可以使用以下方法找到容器的PID:docker inspect < container-id> | grep的PID

注:如果你有那麼-d標誌退出了容器不會停止的容器,無論您使用附加或EXEC進去開始你的容器。