Docker給PaaS世界帶來的“降維打擊”,其實是提供了一種非常便利的打包機制。該機制打包了應用運行所需要的整個操作系統,從而保證了本地環境和雲端環境的高度一致,避免了用戶通過“試錯”來匹配不同運行環境間差異的痛苦。
接下來來講解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有更深的洞察,歡迎補充和討論,感謝您的捧場。