Docker深入淺出系列教程——容器管理
我是架構師張飛洪,鑽進浩瀚程式碼,十年有餘,人不堪其累,吾不改其樂。如果你和我的看法不一樣,請關注我的頭條號,我們一起奇聞共賞,疑義相析。
接下來來講解Docker三大元件之一的容器,如果說映象是靜態的只讀檔案,那麼容器就是帶有執行時需要的可寫檔案層。也可以這樣理解,映象是物件的模板——類,容器是類生成的物件,映象只有一個,物件可以有很多個。
建立容器
1.新建容器
docker create -it ubuntu:lastest
該命令建立的容器處於停止狀態,可以使用docker start啟動。
2.啟動容器
docker start 容器id
3.建立並啟動容器
等價於docker create,再執行docker run
下面的指令,輸出一個hello world後,自動終止。
docker run ubuntu /bin/echo 'hello'
該指令背後一系列別隱藏操作,包括:
- 檢查本地是否存在指定的映象,不存在就從公有倉庫下載;
- 利用映象建立一個容器,並啟啟動該容器;
- 分配一個檔案系統給容器,並在只讀的映象層外面掛載一層可讀寫層;
- 從宿主主機配置的的網橋介面中,橋接一個虛擬介面口到容器中;
- 從網橋的地址池配置一個IP地址給容器, 口執行使用者指定的應用程式;
- 執行完後,容器被自動終止。
下面的命令啟動一個bash終端,允許使用者進行互動:
docker run-it ubuntu:14.04 /bin/bash
其中,-t 選項讓docker分配一個偽終端並繫結到容器的標準輸入上,-i 則讓容器的標準輸入保持開啟。 更多的命令選項可以通過 man docker - run命令來檢視。
在容器內用ps命令檢視程序,可以看到只運行了bash應用,並沒有執行其的程序。
使用者可以按ctrl+d或輸入exit命令來退出容器。
4.守護態執行
更多的時候,需要讓docker容器在後臺以守護態形式執行。此時通過新增 -d 引數來實現。
下面的命令會在後臺執行容器:
docker ubuntu /bin/sh -c "while true; do echo hello world; sleep 1;done"
ce554267d7a4c34eefc92c5517051dc37b918b588736d0823e4c846596b04d83
容器啟動後會返回一個唯一的id。
此時,要獲取容器的輸出資訊,可以用docker logs ce5
終止容器
docker stop ce5
終止的容器通過 docker start重新啟動
docker restart 會將執行容器先終止,然後重新啟動
進入容器
在使用-d引數時,容器啟動後會進人後臺,使用者無法看到容器中的資訊,也無法進行操作。
這個時候如果需要進入容器進行操作,有多種方法,包括使用官方的 attach或exec命令,以及第三方的 nsenter工具等。
1.attach
docker run -it ubuntu
docker ps
docker attach 容器id
2.exec[推薦]
例如,進人到剛建立的容器中,並啟動bash
docker exec -it 453698741 /bin/bash
root @453698741: /#
可以看到,一個 bash終端打開了,在不影響容器內其他應用的前提下,使用者戶可以很容易與容器進行互動。
過指定 -it 引數來保持標準輸入開啟,並且分配一個偽終端。
該操作是最為推薦的方式!
刪除容器
可以使用docker rm命令來刪除處於終止或退出狀態的容器,但不能刪除處於執行狀態的容器,
如果要直接刪除一個執行中的容器,可以新增 -f,終止運用後,強行刪除。
匯入匯出容器
某些時候,需要將容器從一個系統遷移到另外一個系統,此日時可以使用docker的匯入和匯出功能。
1.匯出容器
匯出容器是指匯出一個已經建立的容器到一個檔案,不管此時這個容器是否處於執行狀態,可以使用docker export命令,該命令的格式為docker export [-o | output [=""]] 容器id。其中,可以通過-o選項來指定匯出的tar檔名,也可以通過重定向來實現。
docker export -o demo.tar e12
docker export r78 > demo2.tar
2.匯入容器
docker import demo.tar - test/ubuntu:v1.0
該命令和docker load匯入映象十分相似,這兩者的區別在於容器快照檔案將丟棄所有的歷史記錄和元資料資訊(即僅儲存容器當時的快照狀態)而映象儲存檔案將儲存完整記錄,體積也更大。
小結
容器是直接提供應用服務的元件,也是docker實現快速啟停和高效服務效能的基礎。在生產環境中,因為容器自身的輕量級特性,筆者推薦使用容器時,在一組容器前引高可靠性機制。
例如使用Haproxy工具來代理容器訪問,這樣在容器出現故障時,可以快速切換到功能正常的容器。此外,建議通過指定合適的容器重啟策略,來自動重啟退出的容器。
如果對Docker有更深的洞察,歡迎補充和討論,感謝您的捧場。我是張飛洪,我為部落格園的讀者寫故事。我會給你呈現程式設計師眼中的世界,請關注我的頭條號!