Docker 如何安全地进入到容器内部
作者 | 飛向星的客機
來源 | CSDN博客
🌟 前言
鏡像是構建容器的藍圖,Docker 以鏡像為模板,構建出容器。
容器在鏡像的基礎上被構建,也在鏡像的基礎上運行,容器依賴于鏡像。
本文將對 容器的運行 及相關內容進行詳細講解。
容器運行
在 Docker 官方網站可以查詢與 Docker 相關的資料以及幫助手冊,但是內容都是英文的,可能會對一些小白造成困擾。(而且,訪問 Docker 官方網站特別緩慢 )。
使用 docker run 命令可以運行容器,該命令底層其實是 docker create 與 docker 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.txt 與 b.txt 兩個文件,接著創建一個可以共享這兩個文件的容器,示例代碼如下:
-v 參數用來指定文件路徑,–privileged 參數用來給用戶添加操作權限。
從示例中可以看到,目錄與文件共享成功。
進入容器
容器在宿主機中共有三種狀態,分別為運行(Up)狀態、暫停(Paused)狀態與終止(Exited)狀態。
下面通過示例來觀察容器的三種狀態。
2.1 容器的三種狀態
🍑 運行狀態
運行一個名為 test-nginx 的 Nginx 容器,并將容器 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
在企業中,運維工程師與開發工程師都可能會有進入容器內部的需求。
但是不建議使用SSH(Secure 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 exec 與 docker attach 不同,在使用 exec 進入的容器中執行 exit 命令不會終止容器,只會退出當前 bash 終端。
所以在工作中,建議大家使用 docker exec 命令進入容器,這樣不容易出現操作失誤。
往期推薦
read 文件一個字節實際會發生多大的磁盤IO?
Docker 容器為什么傲嬌?全靠鏡像撐腰!
Redis 內存滿了怎么辦?這樣置才正確!
云原生的本手、妙手和俗手
點分享
點收藏
點點贊
點在看
總結
以上是生活随笔為你收集整理的Docker 如何安全地进入到容器内部的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SuperMemo
- 下一篇: Set和Map数据结构。