HOWTO · Docker

進入 Docker 容器的 Shell

Docker 為我們提供了多種進入容器的方法,這可能有多種原因。本教程將演示如何進入 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 進入容器。