
- Docker 教程
- Docker - 首頁
- Docker - 概述
- Docker - 在 Linux 上安裝
- Docker - 安裝
- Docker - Hub
- Docker - 映象
- Docker - 容器
- Docker - 倉庫
- Docker - Compose
- Docker - 操作容器
- Docker - 架構
- Docker - 層
- Docker - 容器與主機
- Docker - 配置
- Docker - 容器與Shell
- Docker - Dockerfile
- Docker - 構建檔案
- Docker - 公共倉庫
- Docker - 管理埠
- Docker - Web 伺服器
- Docker - 命令
- Docker - 容器連結
- Docker - 資料儲存
- Docker - 卷
- Docker - 網路
- Docker - 安全
- Docker - 工具箱
- Docker - 雲
- Docker - 構建雲
- Docker - 日誌
- Docker - 持續整合
- Docker - Kubernetes 架構
- Docker - Kubernetes 的工作原理
- Docker - 生成式 AI
- Docker - 託管
- Docker - 最佳實踐
- Docker 設定服務
- Docker - 設定 Node.js
- Docker - 設定 MongoDB
- Docker - 設定 NGINX
- Docker - 設定 ASP.Net
- Docker - 設定 MySQL
- Docker - 設定 Go
- Docker - 設定 Rust
- Docker - 設定 Apache
- Docker - 設定 MariaDB
- Docker - 設定 Jupyter
- Docker - 設定 Portainer
- Docker - 設定 Rstudio
- Docker - 設定 Plex
- Docker 設定 - Flame
- Docker 設定 - PostgreSql
- Docker 設定 - Mosquitto
- Docker 設定 - Grafana
- Docker 設定 - Nextcloud
- Docker 設定 - Pawns
- Docker 設定 - Ubuntu
- Docker 設定 - RabbitMQ
- Docker - 設定 Python
- Docker - 設定 Java
- Docker - 設定 Redis
- Docker - 設定 Alpine
- Docker - 設定 BusyBox
- Docker 設定 - Traefik
- Docker 設定 - WordPress
- Docker 有用資源
- Docker - 快速指南
- Docker - 有用資源
- Docker - 討論
Docker - 容器與Shell
Shell 在 Docker 容器中至關重要;它們充當介面,透過它們在容器中執行命令。通常,當容器啟動時,它必須執行一個 Shell 來解釋和執行在 Dockerfile 中描述或在執行容器時傳遞的命令。
Shell 執行幾個重要的功能 -
- 命令執行 - Shell 解釋和執行在指令碼中編寫的或使用者互動式輸入的命令。這包括軟體安裝、環境配置和應用程式執行。
- 指令碼自動化 - Shell 指令碼在 Dockerfile 中扮演的最大角色之一是容器環境設定的自動化。它確保所有必要步驟都自動且一致地執行。
- 互動訪問 - Shell 允許互動訪問容器,允許開發人員和管理員除錯、管理和檢查容器的環境。這是透過執行命令(例如,docker exec)來針對正在執行的容器互動地完成的,以在其中開啟 Shell 會話。
Docker 中常用的 Shell 型別
Docker 容器中使用了相當多的 Shell 型別,它們具有不同的特性和優勢 -
Bash(Bourne Again Shell)
- 預設 Shell - Bash 是大多數 Linux 發行版的預設 Shell,並且在 Docker 容器中使用最為廣泛。
- 指令碼 - 它具有廣泛的指令碼功能,從變數和迴圈到條件和函式。
- 豐富的功能 - Bash 提供了命令歷史記錄、作業控制和製表符完成等功能,增強了互動式使用。
Sh(Bourne Shell)
- 簡單性 - 與 Bash 相比,Sh 是一個非常簡單的 Shell。它是原始的 Unix Shell,幾乎所有類 Unix 系統上都可用。
- 可移植性 - Sh 指令碼具有很強的可移植性,幾乎可以在任何類 Unix 作業系統上執行。
- 功能較少 - 它不像 bash 那樣功能豐富,但這使得指令碼通常更容易編寫成可移植的。
Zsh(Z Shell)
- 高階功能 - 它擁有 Bash 中不存在的大多數高階功能,例如更好的製表符補全、廣泛的指令碼功能和高度可定製的提示。
- 自定義 - 它高度可定製,允許使用者根據自己的喜好定製 Shell 環境。
- 流行度 - 憑藉其強大的功能和自定義功能,Zsh 在開發人員中尤其受歡迎。
訪問 Docker 容器中的 Shell
讓我們瞭解訪問 Docker 容器內 Shell 的不同方法。
Docker exec 命令(互動式和分離模式)
訪問和互動正在執行的 Docker 容器的最佳方法之一是透過 docker exec 命令。它允許在現有容器內啟動一個新程序,從而允許執行命令甚至開啟互動式 Shell 會話。
互動模式
docker exec 命令與 -it 標誌一起使用,以互動方式訪問正在執行的容器中可用的 Shell。在這種情況下,-i 表示互動式,-t 分配偽終端。透過這種方式,使用者可以與 Shell 互動,就像他們真的登入了一樣。
執行正在執行的容器內的 Bash Shell 的示例命令 -
$ docker exec -it <container_id> /bin/bash

在上面的示例中,用實際的執行容器 ID 或名稱替換 <container_id>。這會將使用者放入容器內的即時 Bash Shell 中,以進行互動和命令執行。
分離模式
除此之外,docker exec 還可以接受以分離方式執行操作的選項 - 執行命令但不將使用者附加到程序。這非常適合容器內的所有後臺處理或非互動式命令。
分離程序命令示例 -
$ docker exec -d <container_id> <command>

在此示例中,<command> 是您希望在容器內執行的命令,並且由於我們使用了 -d,因此該命令將在後臺執行,並且您的命令列與該程序分離。
docker run -it(在容器啟動時互動式終端)
當您想要啟動一個新容器並以互動方式開啟其中的終端會話時,可以使用docker run -it 命令。這在除錯、測試或互動式配置新容器時非常實用。
使用 Bash 啟動帶有互動式 Shell 的新容器的示例命令 -
$ docker run -it <image_name> /bin/bash

在上面的示例中,在 <image_name> 中,您必須包含您想要從中建立容器的 Docker 映象的名稱。然後,選項 -it 使互動式和偽終端分配模式,允許使用者直接與容器互動。
nsenter 和其他低階工具
nsenter 是一個低階 Linux 實用程式,用於訪問正在執行的程序的名稱空間。Docker 容器使用 Linux 名稱空間作為隔離;nsenter 用於進入這些名稱空間,從而訪問容器內部的環境。
使用 nsenter 進入容器名稱空間的示例命令 -
1. 首先,獲取容器中正在執行的主程序的 PID -
$ docker inspect --format "{{.State.Pid}}" <container_id>

2. 使用 nsenter 訪問容器的名稱空間 -
$ nsenter --target <pid> --mount --uts --ipc --net --pid /bin/bash

在此示例中,用您在第一步中獲得的 PID 替換 <pid>。這將在容器的名稱空間內開啟一個 bash,並完全訪問容器的環境。
使用 Docker Desktop 訪問 Shell(GUI)
Docker Desktop 對於 macOS 和 Windows 作業系統來說是一種便利,因為它提供了一個圖形使用者介面來處理 Docker 容器。因此,Docker CLI 中許多可能很複雜的工作,例如開啟容器中的 Shell,都透過其 GUI 簡化了。
要使用 Docker Desktop 訪問 Shell -
- 開啟 Docker Desktop - 從您的應用程式選單啟動 Docker Desktop 應用程式。
- 檢視容器 - 點選“容器/應用”選項卡以檢視正在執行的容器列表。
- 開啟終端 - 只需點選您要連線到的容器,然後點選“CLI”或“終端”按鈕。這將開啟一個連線到容器的新終端視窗,通常在其中包含一個 Bash Shell。
以非 root 使用者身份執行容器
以非 root 使用者身份執行容器是一種必要的安全實踐。預設情況下,Docker 容器以 root 使用者身份執行。這樣做會導致如果攻擊者進入容器,則會產生高度風險。在容器內執行最低必要的許可權有助於減少潛在的損害。
最佳實踐
建立非 root 使用者 - 使用 USER 指令在您的 Dockerfile 中定義非 root 使用者。例如 -
FROM ubuntu:latest RUN useradd -m nonrootuser USER nonrootuser
限制功能 - 透過使用 Docker 的 --cap-drop 和 --cap-add 選項來刪除不必要的許可權,從而限制容器的功能。
檔案系統許可權 - 確保檔案系統許可權設定正確,以防止未經授權訪問敏感檔案和目錄。
結論
在本章中,我們討論瞭如何訪問容器 Shell。我們查看了不同型別的 Shell 以及訪問每個 Shell 的命令。如果您想檢查 Docker 容器內部發生了什麼,或者如果您想在容器中執行命令,這些命令將非常有用。
關於 Docker 容器與 Shell 的常見問題
1. 如果 Docker 容器沒有 Shell,我該怎麼辦?
有時容器映象會故意不帶 Shell 以保持映象大小較小。在這種情況下,您可以執行以下操作:使用安裝了 Shell 的新層提交正在執行的容器,然後基於此修改後的映象啟動一個新容器。
您可以使用Docker cp 命令或以其他方式將 Shell 二進位制檔案複製到容器中。更高階的是使用nsenter 相對直接地訪問現有容器的名稱空間。
2. 訪問 Docker 容器 Shell 是否有任何替代方法?
是的,除了直接訪問之外,還有其他方法可以與容器互動。例如,可以使用 docker logs 檢視容器輸出,使用 docker inspect 檢查容器詳細資訊,或使用 docker stats 檢查資源使用情況。
專用的工具(例如帶有偵錯程式附加的 docker exec)可以實現這種除錯可能性,或者當需要深入分析正在執行的程序時,可以透過 strace 和 gdb 實現。最終,最佳方法將取決於您的需求以及您的任務需要多少訪問許可權。