在新的 Docker 容器中啟動 Bash 終端

Isaac Tony 2023年1月30日
  1. 使用 Bash 互動式 Shell
  2. 使用 docker exec 命令
  3. 使用 docker attach 命令
在新的 Docker 容器中啟動 Bash 終端

Docker 容器是打包應用程式所有依賴項的標準單元,使我們能夠在任何環境中輕鬆執行它們。容器最近變得非常流行,現在大多數開發人員都嚴重依賴容器來管理他們的應用程式和依賴項。

Docker 通過在 docker 容器中啟動 bash 終端,為我們提供了多種訪問 shell 例項的方法。這在 docker 容器內執行某些命令時特別有用。

此外,這也可能是出於除錯原因,或者你可能想檢查所有配置是否正確。本文探討了我們可用於執行容器和未執行容器的不同方法。

使用 Bash 互動式 Shell

Bash 是 Linux 系統中常見的命令處理器,它允許使用者輸入導致操作的命令。如果你與基於 Unix 的系統或 WSL 進行了一些互動,你可能會通過 bash 與各種命令進行互動。

同樣,我們也可以直接訪問 docker 容器中的 Linux 終端並執行命令,就像使用普通 Linux bash 一樣。這種方法的一個優點是我們可以使用未執行的容器來執行此操作,這與諸如 docker exec 命令之類的其他命令不同。

如下所示,我們將使用來自 docker 登錄檔的官方 rabbitmq 映像來建立一個 docker 容器並直接訪問容器內的 bash。你可以使用任何其他命令執行此操作;你要確保事先擁有該映象。

docker pull rabbitmq
docker images

現在我們有了映象,我們可以互動地建立 docker 容器。這意味著我們可以在執行的同時在 docker 容器內執行命令,如下所示。

$ docker run -it rabbitmq bash

輸出:

root@f418a3286aae:/#

如你所見,我們現在位於 docker 容器中,並且我們成功地在新容器中執行了 bash。現在我們可以像使用真正的終端一樣執行命令了。

例如,我們可以列出這個容器內的檔案和目錄,如下所示。

root@f418a3286aae:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  plugins  proc  root  run  sbin  srv  sys  tmp  usr  var
root@f418a3286aae:/#

使用 docker exec 命令

或者,我們也可以使用 docker exec 命令在新的 docker 容器中執行 bash。但是,與之前的方法不同,此命令要求我們已經讓容器執行;否則,該命令將不起作用。

使用 docker ps -a 命令確認我們的容器正在執行。如果你要使用的容器沒有執行,你可能需要使用 docker start 命令後跟容器 ID 或名稱來啟動它。

docker ps

我們將在 -it 標籤旁邊使用 docker exec 命令。exec 命令允許我們在執行的容器中執行命令,而 -it 標籤允許我們以互動方式開啟容器。

我們可以執行如下所示。

$ docker exec -it f418a3286aae bash

輸出:

root@f418a3286aae:/# ls
bin  boot  dev  etc  home  isaac  lib  lib32  lib64  libx32  media  mnt  opt  plugins  proc  root  run  sbin  srv  sys tmp  tonyloi  usr  var

現在我們已經在這個 docker 容器中成功啟動了 bash,我們可以在容器中執行各種命令。我們也可以對沒有 bash 的容器使用 sh

這也是一個命令,它將開啟一個基本的 shell 提示,我們可以在容器中執行我們的命令。

$ docker exec -it f418a3286aae sh

輸出:

# ls
bin  boot  dev  etc  home  isaac  isaactonyloi  lib  lib32  lib64  libx32  media  mnt  opt  plugins  proc  root  run  sbin  srv  sys  tmp  tonyloi  usr  var

使用 docker attach 命令

我們還可以使用 docker attach 命令在正在執行的 docker 容器中啟動 bash。這允許我們使用容器的 ID 將本地標準輸入、輸出和錯誤流附加到正在執行的容器。

然後我們可以執行各種命令,接受輸入,除錯指定的容器。我們需要一個正在執行的容器來附加我們的輸出、輸入和錯誤流。

我們可以使用容器名稱或 id 來實現這一點,如下所示。

程式碼:

$ docker container attach f418a3286aae

輸出:

root@f418a3286aae:/# ls
bin  boot  dev  etc  home  isaac  isaactonyloi  lib  lib32  lib64  libx32  media  mnt  opt  plugins  proc  root  run  sbin  srv  sys  tmp  tonyloi  usr  var
root@f418a3286aae:/#
作者: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn