進入 Docker 容器的 Shell

Isaac Tony 2023年1月30日
  1. 使用 docker exec 進入 Docker 容器的 Shell
  2. 使用 docker container attach 進入 Docker 容器的 Shell
  3. 使用安全 Shell (SSH) 進入 Docker 容器的 Shell
進入 Docker 容器的 Shell

本教程將演示如何使用多種方式進入 Docker 的容器 Shell。

使用 docker exec 進入 Docker 容器的 Shell

我們需要啟動並執行一個容器才能使用此命令。我們可以使用以下命令檢查系統中容器的狀態。

docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED      STATUS                    PORTS     NAMES
38086474cb6c   debian    "bash"                   2 days ago   Exited (0) 2 days ago               epic_jackson
1c955bac1a84   ubuntu    "bash"                   2 days ago   Exited (0) 2 days ago               musing_morse
1296f9b9d330   nginx     "/docker-entrypoint.…"   2 days ago   Exited (255) 2 days ago   80/tcp    distracted_napier

如果我們沒有執行容器,我們可以輕鬆建立一個。我們將使用 rabbitmq 基礎映象來設定一個容器。

在建立容器之前,我們將首先使用 docker pull 命令從登錄檔中提取基礎映像,如下所示。

$ docker run -d rabbitmq

輸出:

Dcad9f270643802092ab525796897c357026767863dade831e8c7d7d82c45712

現在,我們應該有一個正在執行的容器。再一次,我們可以確定使用 docker ps 命令。

$ docker ps -a

輸出:

CONTAINER ID   IMAGE      COMMAND                  CREATED              STATUS          PORTS                                                 NAMES
dcad9f270643   rabbitmq   "docker-entrypoint.s…"   About a minute ago   Up 57 seconds   4369/tcp, 5671-5672/tcp, 15691-15692/tcp, 25672/tcp   inspiring_moore

我們將使用 -it 標籤旁邊的 docker exec 命令進入容器,與檔案互動或執行一些除錯。

exec 命令將允許我們在正在執行的容器中執行命令,而 -it 標籤將使我們能夠互動地開啟容器。

最後,sh 命令將開啟一個基本的 shell 提示符以在容器中執行我們的命令。

isaactonyloi@DESKTOP-HV44HT6:~$ docker exec -it dcad9f270643 sh
#

現在我們已經進入了 Docker 容器,我們可以在容器中執行各種命令。鍵入 exit 命令並從該模式按回車鍵返回主終端。

使用 docker container attach 進入 Docker 容器的 Shell

我們還可以使用 docker container attach 命令連線到正在執行的容器。這允許我們使用容器的 ID 將終端輸出、輸入和錯誤流附加到正在執行的容器。

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

為此,我們將使用 docker ps,如下所示。我們仍在使用上一節中的 rabbitmq 容器。

$ docker ps -a

輸出:

CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                                                 NAMES
dcad9f270643   rabbitmq   "docker-entrypoint.s…"   39 minutes ago   Up 38 minutes   4369/tcp, 5671-5672/tcp, 15691-15692/tcp, 25672/tcp   inspiring_moore

如果 docker 容器已經停止,那麼在這種情況下,我們需要首先使用 docker start 命令啟動它,就像我們在這裡所做的那樣。

$ docker start dcad9f270643
dcad9f270643

現在,如果 docker 容器沒有按預期工作,我們可以執行 docker container attach 來檢視容器內發生了什麼。

$ docker container attach dcad9f270643

輸出:

2022-02-21 16:14:51.119742+00:00 [info] <0.466.0> Server startup complete; 3 plugins started.
2022-02-21 16:14:51.119742+00:00 [info] <0.466.0>  * rabbitmq_prometheus
2022-02-21 16:14:51.119742+00:00 [info] <0.466.0>  * rabbitmq_web_dispatch
2022-02-21 16:14:51.119742+00:00 [info] <0.466.0>  * rabbitmq_management_agent

使用安全 Shell (SSH) 進入 Docker 容器的 Shell

最後,我們還可以使用通常縮寫為 SSH 的安全 shell 在容器內執行命令。但是,這是最不推薦的方式,因為它會導致基礎映像膨脹以及我們可能遇到的配置問題。

此外,這種方法存在安全問題,因為我們需要自己管理金鑰。我們還需要考慮到某些映象可能本質上不支援此方法,因此可能需要進一步配置。

但是,如果我們需要使用這種方法,我們必須遵循這些步驟。

  • 我們首先需要安裝並啟用 SSH 服務。
  • 然後,我們必須檢索容器的 IP 地址。
  • 最後,我們使用檢索到的 IP 地址 SSH 進入容器。
作者: 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