Docker如何安全地進入到容器內部

🌟 前言

鏡像是構建容器的藍圖,Docker 以鏡像為模板,構建出容器。

容器在鏡像的基礎上被構建,也在鏡像的基礎上運行,容器依賴於鏡像。

本文將對 容器的運行 及相關內容進行詳細講解。

在這裡插入圖片描述

1. 容器運行

Docker 官方網站可以查詢與 Docker 相關的資料以及幫助手冊,但是內容都是英文的,可能會對一些小白造成困擾。(而且,訪問 Docker 官方網站特別緩慢 ),所以這裡向大傢推薦 Docker 中文社區。

這是一個中文的 Docker 資料庫,其中有很多整理好的技術文檔,Docker 中文社區的官方介紹是:系統整理 Docker 官方的教程和手冊、報道 Docker 相關動態和進展、整合網絡上其他社區相關資源。

當然用戶也可以將自己在學習過程中整理的技術文檔上傳與大傢分享。

使用 docker run 命令可以運行容器,該命令底層其實是 docker createdocker start 兩條命令的結合體,運行容器需要先基於鏡像創建一個容器,然後啟動容器,完成一個容器的運行,如圖所示👇

在這裡插入圖片描述

例如,基於鏡像啟動一個新容器,並打印當月的日歷,示例代碼如下:

在這裡插入圖片描述

從以上示例中可以看到日歷已經被打印出來,但無法看到容器是否運行。

ps 命令在 Linux 系統中被用來查看進程,在 Docker 中被用來查看容器,因為運行中的容器也是一個進程,示例代碼如下:

在這裡插入圖片描述

從以上示例中可以看到,一個 Docker 容器以 CentOS 鏡像為基礎運行,並傳瞭一個 cal(打印當前月份日歷)命令,容器正常啟動並執行瞭 cal 命令。

除此之外,還可以通過指定參數,啟動一個bash交互終端,代碼如下:

上述代碼創建瞭一個交互式的容器,並分配瞭一個偽終端,使用戶可以通過命令行與容器進行交互。終端對宿主機進行直接操作,宿主機通過一個虛擬終端將對 Docker 的指令傳輸給容器,這個虛擬終端就是偽終端,對容器進行直接操作。

執行 docker run 命令啟動容器時,Docker 會進行如下操作。

(1)檢測本地是否存在指定的鏡像,不存在則從默認的 Docker Hub 公有倉庫下載。

(2)使用鏡像創建(docker create)並啟動(docker run)容器。

(3)分配一個文件系統,並在隻讀層外面掛載一個可讀可寫層。

(4)從宿主機配置的網橋接口中橋接一個虛擬接口到容器中去。

(5)從地址池分配一個 IP 地址給容器。

(6)執行用戶指定的命令。

(7)執行之後容器被終止(docker stop)。

另外,在 docker run 命令中可以添加相應參數,實現不同的功能。

下面運行一個容器,並使用終端對其進行操作,示例代碼如下:

以上命令執行成功的前提是本地含有 CentOS 鏡像。其中,-i 表示捕獲標準輸入輸出,-t 表示分配一個終端或控制臺。

下面運行一個容器,並為其設置環境變量,示例代碼如下:

其中,-e 參數是在創建容器時為容器配置環境變量。

此時已經成功創建瞭一個容器,接著查看它的環境變量,示例代碼如下:

從以上示例中可以看到,key=1000 的環境變量已經設置成功。

🍇 自動重啟的容器

下面運行一個正常的容器,示例代碼如下:

在新創建的容器中,使用 exit 命令即可退出容器,但容器也將停止運行。

查看容器狀態,示例代碼如下:

可以看到,容器此時的狀態為 “Exited”,說明容器處於終止狀態。

下面運行一個添加參數的容器,示例代碼如下:

不出意外的話,此時容器應該是終止狀態。

接著,驗證容器的狀態,示例代碼如下:

從示例中可以看到,容器此時不是終止狀態,而是運行狀態。這是由於添加瞭 –restart 參數的容器被終止後自動重啟。

🍇 自定義名稱的容器

下面運行一個自定義名稱的容器,示例代碼如下:

從示例中可以看到,創建容器時添加瞭 -name 參數來定義容器名稱。創建之後容器的名字就是指定的 “test”

🍇 開啟端口的容器

下面創建一個開啟 80 端口的容器,示例代碼如下:

參數冒號之前是宿主機端口號,冒號之後是容器的端口號,表示宿主機的 80 端口映射到容器的 80 端口上。

從示例中可以看到,容器正在運行,並且可以看到開啟瞭 80 端口。

為瞭驗證,使用 curl 工具訪問容器端口,示例代碼如下:

訪問容器 80 端口的返回值為 200,說明容器端口能夠被用戶正常訪問。

接下來,將容器停止,並再次訪問容器端口,示例代碼如下:

再次訪問容器端口時,連接被拒絕,說明先前的服務由是 Docker 容器來提供的,隻是通過宿主機的端口向外網開放。

🍇 與宿主機共享目錄的容器

首先在宿主機上創建需要共享的目錄與文件,示例代碼如下:

已經在 /root/test/ 目錄下別創建瞭 a.txtb.txt 兩個文件,接著創建一個可以共享這兩個文件的容器,示例代碼如下:

-v 參數用來指定文件路徑,–privileged 參數用來給用戶添加操作權限。

從示例中可以看到,目錄與文件共享成功。

2. 進入容器

容器在宿主機中共有三種狀態,分別為運行(Up)狀態、暫停(Paused)狀態與終止(Exited)狀態。

下面通過示例來觀察容器的三種狀態。

2.1 容器的三種狀態

🍑 運行狀態

運行一個名為 test-nginxNginx 容器,並將容器 80 端口映射到宿主機 80 端口,示例代碼如下:

這時,容器已經創建完成,通過 ps 命令查看容器是否為運行狀態,示例代碼如下:

從以上示例中可以看出,此時容器狀態為運行狀態。

🍑 暫停狀態

下面通過命令使容器進入暫停狀態,示例代碼如下:

docker pause 是暫停容器的命令,上述示例中,暫停瞭名為 test-nginx 的容器。

接著通過命令查看容器是否成功暫停,示例代碼如下:

從以上示例中可以看到,容器仍是運行狀態,但同時也是暫停狀態。

接著通過 curl 工具對該容器進行訪問測試,示例代碼如下:

通過訪問測試發現,此時無法訪問到容器網頁,但是服務器沒有拒絕連接,說明暫停容器的本質是暫停容器中的服務。

下面使用 docker unpause 命令使暫停狀態的容器終止暫停狀態,示例代碼如下:

此時,命令執行完畢,接著查看容器狀態,示例代碼如下:

從以上代碼中可以看到,暫停狀態已經被終止,容器隻處於運行狀態。

接著用 curl 工具對容器進行訪問測試,示例代碼如下:

從以上示例中可以看到,此時網站已經可以正常訪問,說明容器中的服務正常運行。

🍑 終止狀態

當不再需要某一個業務繼續運行時,就要通過命令使該業務的容器終止,示例代碼如下:

以上示例使用 docker stop 命令終止瞭容器 test-nginx,接著驗證容器狀態,示例代碼如下:

從以上示例中可以看出,此時容器為終止狀態,接著對容器進行訪問測試,示例代碼如下:

從測試結果中可以看出,客戶端請求被拒絕,服務已關閉。與暫停狀態的容器不同是,終止狀態的容器會給客戶端發送拒絕的回應。

下面使用 docker start 命令將終止狀態的容器喚醒,示例代碼如下:

示例中使用 docker start 命令對處於終止狀態的容器進行瞭喚醒,接著查看容器此刻狀態,示例代碼如下:

從以上示例中可以看出,此時容器狀態為運行狀態。接著對該容器進行訪問測試,示例代碼如下:

通過訪問測試結果可以看出,此時容器中的服務已經可以正常訪問。

2.2 docker attach與docker exec

在企業中,運維工程師與開發工程師都可能會有進入容器內部的需求。

但是不建議使用SSHSecure Shell)登錄容器,因為這違背瞭一個容器裡隻有一個進程的原則,同時增加瞭被攻擊的風險。

建議使用以下兩種 Docker 原生方式進入容器。

🍑 docker attach

通過 docker attach 命令可以進入到一個已經在運行容器的虛擬輸入設備,然後執行其他命令。

下面演示 docker attach 命令的使用方式。

創建任意一個容器,這裡以 CentOS 為例,示例代碼如下:

此時 CentOS 容器已經創建成功,接著使用 docker attach 命令與容器 ID 號進入容器中,示例代碼如下:

在以上示例中,不僅進入瞭容器,還對容器執行瞭 ls 命令,說明此時已經可以在命令行直接對容器進行操作。

在退出容器時需要註意的是,直接從容器中使用 exit 命令或者 Ctrl+d 組合鍵退出容器,會導致容器終止。如果想要退出當前容器,並且不終止容器,可以使用 Ctrl+P+Q 組合鍵退出終端。下面進行示例演示,示例代碼如下:

從以上示例中可以看到,容器已經被終止。接著將容器啟動並進入容器,再使用 Ctrl+P+Q 組合鍵退出,示例代碼如下:

上述示例啟動瞭容器並使用 Ctrl+P+Q 組合鍵退出瞭容器,接著查看當前容器狀態,示例代碼如下:

上述示例中可以看到,容器處於運行狀態,並沒有被終止。

docker attach 還有有共享屏幕的功能,兩個終端同時使用 docker attach 進入同一個容器時可以看到同步操作。如圖所示:

🍑 docker exec

下面對 exec 的參數進行介紹,如表所示。

docker exec 可以在宿主機上向運行的容器傳輸命令,示例代碼如下:

以上示例通過 docker exec 命令向容器發送 ls 命令,並將結果回顯至終端。

下面創建一個新容器,並為容器啟動一個虛擬終端,使用命令行對容器進行操作,示例代碼如下:

上述示例通過虛擬終端對容器進行一系列的操作。接著使用 exit 命令退出容器,並查看容器狀態,示例代碼如下:

以上示例使用 exit 命令退出瞭容器,但容器仍在運行狀態。

這說明 docker execdocker attach 不同,在使用 exec 進入的容器中執行 exit 命令不會終止容器,隻會退出當前 bash 終端。

所以在工作中,建議大傢使用 docker exec 命令進入容器,這樣不容易出現操作失誤。

到此這篇關於Docker如何安全地進入到容器內部的文章就介紹到這瞭,更多相關Docker 進入容器內部內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: