概述
如果大家對devops有研究的話,第一個肯定要研究docker,Docker為基於Linux容器的開源項目,其利用Linux內核中的各項功能——例如命名空間與控制組——以在操作系統之上創建容器。
下面講一下啟動容器、讓容器長期運行、終止容器、進入容器、導出和導入容器、刪除容器幾個方面,內容有點多,希望大家可以耐心看完。
啟動容器
啟動容器有兩種方式,一種是基於鏡像新建一個容器並啟動, 另外一個是將在終止狀態( stopped)的容器重新啟動。
新建並啟動容器
所需要的命令主要為 dockerrun。
-t選項讓Docker分配一個偽終端( pseudo-tty)並綁定到容器的標準輸入上, -i則讓容器的標準輸入保持打開。
在交互模式下,用戶可以通過所創建的終端來輸入命令
當利用 docker run 來創建容器時, Docker 在後臺運行的標準操作包括:
1、檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
2、利用鏡像創建並啟動一個容器
3、分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
4、從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
5、從地址池配置一個ip地址給容器
6、執行用戶指定的應用程序
7、執行完畢後容器被終止
啟動已終止容器
可以利用 dockerstart命令,直接將一個已經終止的容器啟動運行。
容器的核心為所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,並沒有
其它的資源。可以在偽終端中利用 ps或 top來查看進程信息。執行 docker ps 或 docker container ls 可以查看 Docker host 中當前運行的容器:
容器中僅運行了指定的bash應用。 這種特點使得Docker對資源的利用率極高,是貨真價實的輕量級虛擬化。
讓容器長期運行
因為容器的生命週期依賴於啟動時執行的命令,只要該命令不結束,容器也就不會退出。理解了這個原理,我們就可以通過執行一個長期運行的命令來保持容器的運行狀態。
while 語句讓 bash 不會退出。我們可以打開另一個終端查看容器的狀態:
可見容器仍處於運行狀態。不過這種方法有個缺點:它佔用了一個終端。 我們可以加上參數 -d 以後臺方式啟動容器。
容器啟動後回到了 docker host 的終端。這裡看到 docker 返回了一串字符,這是容器的 ID。
終止容器
可以使用 dockerstop來終止一個運行中的容器。
此外,當Docker容器中指定的應用終結時,容器也自動終止。 例如對於上一章節中只啟動了一個終端的容器,用戶通過 exit命令或 Ctrl+d來退出終端時,所創建的容器立刻終止。
終止狀態的容器可以用 dockerps-a命令看到。例如
處於終止狀態的容器,可以通過 dockerstart命令來重新啟動。
此外, dockerrestart命令會將一個運行態的容器終止,然後再重新啟動它。
進入容器
在使用 -d參數時,容器啟動後會進入後臺。 某些時候需要進入容器進行操作,有很多種方法,包括使用dockerattach命令或 nsenter工具等。
為了連接到容器,需要找到容器的第一個進程的PID,可以通過下面的命令獲取。
PID=$(docker inspect --format "{{ .State.Pid }}")
通過這個PID,就可以連接到這個容器:
$ nsenter --target $PID --mount --uts --ipc --net --pid
下面給出一個完整的例子。
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND
243c32535da7 ubuntu:latest "/bin/bash"
$ PID=$(docker-pid 243c32535da7)
10981
$ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
root@243c32535da7:/#
導出和導入容器
如果要導出本地某個容器,可以使用 dockerexport命令。
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND
7691a814370e ubuntu:14.04 "/bin/bash"
$ sudo docker export 7691a814370e > ubuntu.tar
這樣將導出容器快照到本地文件。
可以使用 dockerimport從容器快照文件中再導入為鏡像,例如
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZ
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
此外,也可以通過指定URL或者某個目錄來導入,例如
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
*注:用戶既可以使用 dockerload來導入鏡像存儲文件到本地鏡像庫,也可以使用 dockerimport來導入一個容器快照到本地鏡像庫。 這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標籤等元數據信息。
刪除容器
可以使用 dockerrm來刪除一個處於終止狀態的容器。 例如
$sudo docker rm trusting_newton
trusting_newton
如果要刪除一個運行中的容器,可以添加 -f參數。 Docker會發送 SIGKILL信號給容器。
docker容器管理是學習docker的第一步,容器是在docker鏡像的上一層,每次重啟容器實際上都是鏡像的初始化,數據都要重頭來過,這個時候就有數據的持久化問題。
篇幅有限,後續會再分享一下數據持久化怎麼做,docker又怎麼去做監控,dockerfile一鍵部署等等,大家有興趣可以動動手指關注哦~
閱讀更多 波波說運維 的文章