Docker attach 與 exec:命令差異大揭秘
2024-12-04 03:12:36
一、引言

Docker 作為容器化技術(shù)的代表,其命令眾多且功能各異。其中,docker attach 和 docker exec 這兩個命令常常讓使用者感到困惑。本文將詳細(xì)解析它們之間的區(qū)別,幫助大家更好地理解和運(yùn)用這兩個命令。剛開始接觸 Docker 的時候,很多命令讓人傻傻分不清楚,其中就有 docker attach 和 docker exec。稍微了解容器使用的同學(xué)就會知道進(jìn)入容器有兩種方式,分別是 docker attach 和 docker exec。下面我們就來具體看看它們的區(qū)別。
Docker attach
Docker attach 是 Docker CLI 的一個子命令,用于將當(dāng)前的控制臺連接到正在運(yùn)行的容器中,允許我們在容器中執(zhí)行命令、查看輸出等。
Docker exec
Docker exec 也是 Docker CLI 的一個子命令,用于在運(yùn)行的 Docker 容器中執(zhí)行命令。Docker exec 將在該容器中啟動一個新的進(jìn)程,并執(zhí)行指定的命令。這意味著我們可以在不打斷容器的情況下執(zhí)行命令。
區(qū)別
attach 和 Docker exec 主要的區(qū)別在于它們啟動的進(jìn)程和它們的行為方式。Docker attach 在容器的當(dāng)前進(jìn)程上直接啟動一個終端,并將該終端連接到容器的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤。這意味著我們只能在容器當(dāng)前運(yùn)行的進(jìn)程中操作,而且如果我們退出該終端,容器也會被終止。Docker exec 在容器內(nèi)啟動一個新的進(jìn)程,該進(jìn)程可以在后臺運(yùn)行,不影響其他進(jìn)程。這意味著我們可以在不打斷容器正在運(yùn)行的其他進(jìn)程的情況下執(zhí)行命令。從命令的使用方式來看,Docker attach 通常用于調(diào)試容器內(nèi)部的應(yīng)用程序,并且在操作需要交互式輸入和輸出時很有用。Docker exec 則通常用于在容器中執(zhí)行命令,并且在需要在容器內(nèi)部執(zhí)行復(fù)雜操作時非常方便。綜上所述,可以得出如下結(jié)論:docker attach 進(jìn)入容器,再退出會導(dǎo)致容器停止;docker exec 進(jìn)入容器,再退出不會導(dǎo)致容器停止。因此,我們推薦使用后者。
二、docker attach
1. 進(jìn)入容器的方式
使用命令docker attach builder可以進(jìn)入名為builder的容器。進(jìn)入容器后,可以使用ls命令查看容器內(nèi)目錄。
2. 退出后的影響
當(dāng)從容器中退出后,使用docker ps | grep builder查看,會發(fā)現(xiàn)容器停止運(yùn)行。這是因為docker attach直接進(jìn)入容器啟動命令的終端,不會啟動新的進(jìn)程,退出時會導(dǎo)致容器停止。
三、docker exec
1. 進(jìn)入容器的方式
命令為docker exec -it builder bash。這一命令可以在運(yùn)行的容器builder中啟動一個新的交互式終端會話,使用戶能夠在容器內(nèi)執(zhí)行命令。
2. 退出后的影響
退出后,使用docker ps | grep builder查看,容器仍在運(yùn)行。這是因為docker exec在容器內(nèi)啟動一個新的進(jìn)程,而不是直接連接到容器的當(dāng)前進(jìn)程。當(dāng)用戶退出時,只是關(guān)閉了這個新啟動的進(jìn)程,不會影響容器的整體運(yùn)行狀態(tài)。例如,我們可以使用以下步驟驗證:首先創(chuàng)建一個容器,如docker run -it --name builder ubuntu /bin/bash,然后使用docker exec -it builder bash進(jìn)入容器,執(zhí)行一些命令,如ls查看目錄結(jié)構(gòu)。接著退出容器,再使用docker ps | grep builder查看,會發(fā)現(xiàn)容器依然在運(yùn)行。這與docker attach有很大的不同,docker attach在退出時會導(dǎo)致容器停止運(yùn)行。
四、結(jié)論
綜上所述,docker attach 進(jìn)入容器再退出會導(dǎo)致容器停止,而 docker exec 進(jìn)入容器再退出不會導(dǎo)致容器停止。因此,在實(shí)際使用中,推薦使用 docker exec 命令。這是因為 docker attach 在容器的當(dāng)前進(jìn)程上直接啟動一個終端,并將該終端連接到容器的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤,我們只能在容器當(dāng)前運(yùn)行的進(jìn)程中操作,退出時會導(dǎo)致容器終止。而 docker exec 在容器內(nèi)啟動一個新的進(jìn)程,該進(jìn)程可以在后臺運(yùn)行,不影響其他進(jìn)程,我們可以在不打斷容器正在運(yùn)行的其他進(jìn)程的情況下執(zhí)行命令。從命令的使用方式來看,Docker attach 通常用于調(diào)試容器內(nèi)部的應(yīng)用程序,并且在操作需要交互式輸入和輸出時很有用;Docker exec 則通常用于在容器中執(zhí)行命令,并且在需要在容器內(nèi)部執(zhí)行復(fù)雜操作時非常方便。