Docker如何安全地進(jìn)入到容器內(nèi)部
?? 前言
鏡像是構(gòu)建容器的藍(lán)圖,Docker 以鏡像為模板,構(gòu)建出容器。
容器在鏡像的基礎(chǔ)上被構(gòu)建,也在鏡像的基礎(chǔ)上運行,容器依賴于鏡像。
本文將對 容器的運行 及相關(guān)內(nèi)容進(jìn)行詳細(xì)講解。
1. 容器運行
在 Docker 官方網(wǎng)站可以查詢與 Docker 相關(guān)的資料以及幫助手冊,但是內(nèi)容都是英文的,可能會對一些小白造成困擾。(而且,訪問 Docker 官方網(wǎng)站特別緩慢 ),所以這里向大家推薦 Docker 中文社區(qū)。
這是一個中文的 Docker 資料庫,其中有很多整理好的技術(shù)文檔,Docker 中文社區(qū)的官方介紹是:系統(tǒng)整理 Docker 官方的教程和手冊、報道 Docker 相關(guān)動態(tài)和進(jìn)展、整合網(wǎng)絡(luò)上其他社區(qū)相關(guān)資源。
當(dāng)然用戶也可以將自己在學(xué)習(xí)過程中整理的技術(shù)文檔上傳與大家分享。
使用 docker run 命令可以運行容器,該命令底層其實是 docker create 與 docker start 兩條命令的結(jié)合體,運行容器需要先基于鏡像創(chuàng)建一個容器,然后啟動容器,完成一個容器的運行,如圖所示??
例如,基于鏡像啟動一個新容器,并打印當(dāng)月的日歷,示例代碼如下:
從以上示例中可以看到日歷已經(jīng)被打印出來,但無法看到容器是否運行。
ps 命令在 Linux 系統(tǒng)中被用來查看進(jìn)程,在 Docker 中被用來查看容器,因為運行中的容器也是一個進(jìn)程,示例代碼如下:
從以上示例中可以看到,一個 Docker 容器以 CentOS 鏡像為基礎(chǔ)運行,并傳了一個 cal(打印當(dāng)前月份日歷)命令,容器正常啟動并執(zhí)行了 cal 命令。
除此之外,還可以通過指定參數(shù),啟動一個bash交互終端,代碼如下:
上述代碼創(chuàng)建了一個交互式的容器,并分配了一個偽終端,使用戶可以通過命令行與容器進(jìn)行交互。終端對宿主機進(jìn)行直接操作,宿主機通過一個虛擬終端將對 Docker 的指令傳輸給容器,這個虛擬終端就是偽終端,對容器進(jìn)行直接操作。
執(zhí)行 docker run 命令啟動容器時,Docker 會進(jìn)行如下操作。
(1)檢測本地是否存在指定的鏡像,不存在則從默認(rèn)的 Docker Hub 公有倉庫下載。
(2)使用鏡像創(chuàng)建(docker create)并啟動(docker run)容器。
(3)分配一個文件系統(tǒng),并在只讀層外面掛載一個可讀可寫層。
(4)從宿主機配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中去。
(5)從地址池分配一個 IP 地址給容器。
(6)執(zhí)行用戶指定的命令。
(7)執(zhí)行之后容器被終止(docker stop)。
另外,在 docker run 命令中可以添加相應(yīng)參數(shù),實現(xiàn)不同的功能。
下面運行一個容器,并使用終端對其進(jìn)行操作,示例代碼如下:
以上命令執(zhí)行成功的前提是本地含有 CentOS 鏡像。其中,-i 表示捕獲標(biāo)準(zhǔn)輸入輸出,-t 表示分配一個終端或控制臺。
下面運行一個容器,并為其設(shè)置環(huán)境變量,示例代碼如下:
其中,-e 參數(shù)是在創(chuàng)建容器時為容器配置環(huán)境變量。
此時已經(jīng)成功創(chuàng)建了一個容器,接著查看它的環(huán)境變量,示例代碼如下:
從以上示例中可以看到,key=1000 的環(huán)境變量已經(jīng)設(shè)置成功。
?? 自動重啟的容器
下面運行一個正常的容器,示例代碼如下:
在新創(chuàng)建的容器中,使用 exit 命令即可退出容器,但容器也將停止運行。
查看容器狀態(tài),示例代碼如下:
可以看到,容器此時的狀態(tài)為 “Exited”,說明容器處于終止?fàn)顟B(tài)。
下面運行一個添加參數(shù)的容器,示例代碼如下:
不出意外的話,此時容器應(yīng)該是終止?fàn)顟B(tài)。
接著,驗證容器的狀態(tài),示例代碼如下:
從示例中可以看到,容器此時不是終止?fàn)顟B(tài),而是運行狀態(tài)。這是由于添加了 –restart 參數(shù)的容器被終止后自動重啟。
?? 自定義名稱的容器
下面運行一個自定義名稱的容器,示例代碼如下:
從示例中可以看到,創(chuàng)建容器時添加了 -name 參數(shù)來定義容器名稱。創(chuàng)建之后容器的名字就是指定的 “test”。
?? 開啟端口的容器
下面創(chuàng)建一個開啟 80 端口的容器,示例代碼如下:
參數(shù)冒號之前是宿主機端口號,冒號之后是容器的端口號,表示宿主機的 80 端口映射到容器的 80 端口上。
從示例中可以看到,容器正在運行,并且可以看到開啟了 80 端口。
為了驗證,使用 curl 工具訪問容器端口,示例代碼如下:
訪問容器 80 端口的返回值為 200,說明容器端口能夠被用戶正常訪問。
接下來,將容器停止,并再次訪問容器端口,示例代碼如下:
再次訪問容器端口時,連接被拒絕,說明先前的服務(wù)由是 Docker 容器來提供的,只是通過宿主機的端口向外網(wǎng)開放。
?? 與宿主機共享目錄的容器
首先在宿主機上創(chuàng)建需要共享的目錄與文件,示例代碼如下:
已經(jīng)在 /root/test/ 目錄下別創(chuàng)建了 a.txt 與 b.txt 兩個文件,接著創(chuàng)建一個可以共享這兩個文件的容器,示例代碼如下:
-v 參數(shù)用來指定文件路徑,–privileged 參數(shù)用來給用戶添加操作權(quán)限。
從示例中可以看到,目錄與文件共享成功。
2. 進(jìn)入容器
容器在宿主機中共有三種狀態(tài),分別為運行(Up)狀態(tài)、暫停(Paused)狀態(tài)與終止(Exited)狀態(tài)。
下面通過示例來觀察容器的三種狀態(tài)。
2.1 容器的三種狀態(tài)
?? 運行狀態(tài)
運行一個名為 test-nginx 的 Nginx 容器,并將容器 80 端口映射到宿主機 80 端口,示例代碼如下:
這時,容器已經(jīng)創(chuàng)建完成,通過 ps 命令查看容器是否為運行狀態(tài),示例代碼如下:
從以上示例中可以看出,此時容器狀態(tài)為運行狀態(tài)。
?? 暫停狀態(tài)
下面通過命令使容器進(jìn)入暫停狀態(tài),示例代碼如下:
docker pause 是暫停容器的命令,上述示例中,暫停了名為 test-nginx 的容器。
接著通過命令查看容器是否成功暫停,示例代碼如下:
從以上示例中可以看到,容器仍是運行狀態(tài),但同時也是暫停狀態(tài)。
接著通過 curl 工具對該容器進(jìn)行訪問測試,示例代碼如下:
通過訪問測試發(fā)現(xiàn),此時無法訪問到容器網(wǎng)頁,但是服務(wù)器沒有拒絕連接,說明暫停容器的本質(zhì)是暫停容器中的服務(wù)。
下面使用 docker unpause 命令使暫停狀態(tài)的容器終止暫停狀態(tài),示例代碼如下:
此時,命令執(zhí)行完畢,接著查看容器狀態(tài),示例代碼如下:
從以上代碼中可以看到,暫停狀態(tài)已經(jīng)被終止,容器只處于運行狀態(tài)。
接著用 curl 工具對容器進(jìn)行訪問測試,示例代碼如下:
從以上示例中可以看到,此時網(wǎng)站已經(jīng)可以正常訪問,說明容器中的服務(wù)正常運行。
?? 終止?fàn)顟B(tài)
當(dāng)不再需要某一個業(yè)務(wù)繼續(xù)運行時,就要通過命令使該業(yè)務(wù)的容器終止,示例代碼如下:
以上示例使用 docker stop 命令終止了容器 test-nginx,接著驗證容器狀態(tài),示例代碼如下:
從以上示例中可以看出,此時容器為終止?fàn)顟B(tài),接著對容器進(jìn)行訪問測試,示例代碼如下:
從測試結(jié)果中可以看出,客戶端請求被拒絕,服務(wù)已關(guān)閉。與暫停狀態(tài)的容器不同是,終止?fàn)顟B(tài)的容器會給客戶端發(fā)送拒絕的回應(yīng)。
下面使用 docker start 命令將終止?fàn)顟B(tài)的容器喚醒,示例代碼如下:
示例中使用 docker start 命令對處于終止?fàn)顟B(tài)的容器進(jìn)行了喚醒,接著查看容器此刻狀態(tài),示例代碼如下:
從以上示例中可以看出,此時容器狀態(tài)為運行狀態(tài)。接著對該容器進(jìn)行訪問測試,示例代碼如下:
通過訪問測試結(jié)果可以看出,此時容器中的服務(wù)已經(jīng)可以正常訪問。
2.2 docker attach與docker exec
在企業(yè)中,運維工程師與開發(fā)工程師都可能會有進(jìn)入容器內(nèi)部的需求。
但是不建議使用SSH(Secure Shell)登錄容器,因為這違背了一個容器里只有一個進(jìn)程的原則,同時增加了被攻擊的風(fēng)險。
建議使用以下兩種 Docker 原生方式進(jìn)入容器。
?? docker attach
通過 docker attach 命令可以進(jìn)入到一個已經(jīng)在運行容器的虛擬輸入設(shè)備,然后執(zhí)行其他命令。
下面演示 docker attach 命令的使用方式。
創(chuàng)建任意一個容器,這里以 CentOS 為例,示例代碼如下:
此時 CentOS 容器已經(jīng)創(chuàng)建成功,接著使用 docker attach 命令與容器 ID 號進(jìn)入容器中,示例代碼如下:
在以上示例中,不僅進(jìn)入了容器,還對容器執(zhí)行了 ls 命令,說明此時已經(jīng)可以在命令行直接對容器進(jìn)行操作。
在退出容器時需要注意的是,直接從容器中使用 exit 命令或者 Ctrl+d 組合鍵退出容器,會導(dǎo)致容器終止。如果想要退出當(dāng)前容器,并且不終止容器,可以使用 Ctrl+P+Q 組合鍵退出終端。下面進(jìn)行示例演示,示例代碼如下:
從以上示例中可以看到,容器已經(jīng)被終止。接著將容器啟動并進(jìn)入容器,再使用 Ctrl+P+Q 組合鍵退出,示例代碼如下:
上述示例啟動了容器并使用 Ctrl+P+Q 組合鍵退出了容器,接著查看當(dāng)前容器狀態(tài),示例代碼如下:
上述示例中可以看到,容器處于運行狀態(tài),并沒有被終止。
docker attach 還有有共享屏幕的功能,兩個終端同時使用 docker attach 進(jìn)入同一個容器時可以看到同步操作。如圖所示:
?? docker exec
下面對 exec 的參數(shù)進(jìn)行介紹,如表所示。
docker exec 可以在宿主機上向運行的容器傳輸命令,示例代碼如下:
以上示例通過 docker exec 命令向容器發(fā)送 ls 命令,并將結(jié)果回顯至終端。
下面創(chuàng)建一個新容器,并為容器啟動一個虛擬終端,使用命令行對容器進(jìn)行操作,示例代碼如下:
上述示例通過虛擬終端對容器進(jìn)行一系列的操作。接著使用 exit 命令退出容器,并查看容器狀態(tài),示例代碼如下:
以上示例使用 exit 命令退出了容器,但容器仍在運行狀態(tài)。
這說明 docker exec 與 docker attach 不同,在使用 exec 進(jìn)入的容器中執(zhí)行 exit 命令不會終止容器,只會退出當(dāng)前 bash 終端。
所以在工作中,建議大家使用 docker exec 命令進(jìn)入容器,這樣不容易出現(xiàn)操作失誤。
到此這篇關(guān)于Docker如何安全地進(jìn)入到容器內(nèi)部的文章就介紹到這了,更多相關(guān)Docker 進(jìn)入容器內(nèi)部內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker容器通過ping直接運行獲取公網(wǎng)IP操作
這篇文章主要介紹了docker容器通過ping直接運行獲取公網(wǎng)IP操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11阿里云ECS(CentOS鏡像)安裝docker的實現(xiàn)步驟
本文主要介紹了阿里云ECS(CentOS鏡像)安裝docker的實現(xiàn)步驟,從準(zhǔn)備工作到實際安裝步驟,詳細(xì)解析每一步操作,具有一定的參考價值,感興趣的可以了解一下2024-01-01CentOS 7.x docker使用overlay2存儲方式
這篇文章主要介紹了CentOS 7.x docker使用overlay2存儲方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11一次centos Docker網(wǎng)橋模式無法訪問宿主機Redis服務(wù)的故障排除經(jīng)歷
這篇文章主要給大家介紹了關(guān)于一次centos Docker網(wǎng)橋模式無法訪問宿主機Redis服務(wù)的故障排除經(jīng)歷,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Docker具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Docker 容器互聯(lián)互通的實現(xiàn)方法
這篇文章主要介紹了Docker 容器互聯(lián)互通,本文講解不同網(wǎng)絡(luò)下的容器可以通過加入同一個docker網(wǎng)絡(luò),來訪問該docker網(wǎng)絡(luò)下的容器,并且既可以通過容器ip也可以通過容器名連接,非常方便,需要的朋友可以參考下2022-10-10