一個(gè)容器由操作系統(tǒng),用戶文件和元數(shù)據(jù)組成。由此可知,每個(gè)容器都根據(jù)鏡像來(lái)生成。這個(gè)鏡像告訴Docker容器包含什么內(nèi)容,運(yùn)行什么程序,以及其他配置信息。
docker image是只讀的,當(dāng)一個(gè)容器運(yùn)行一個(gè)鏡像時(shí),容器會(huì)在Union FS的頂層增加文件層。
運(yùn)行下面一條執(zhí)行,執(zhí)行后會(huì)出現(xiàn)下面的信息:
[root@VM_0_5_centos ~]# docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu
7ddbc47eeb70: Pull complete
c1bbdc448b72: Pull complete
8c3b70e39044: Pull complete
45d437916d57: Pull complete
Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d
Status: Downloaded newer image for docker.io/ubuntu:latest
root@b2ca7b248b17:/#
docker client 通過(guò)run 命令告訴Daemon啟動(dòng)一個(gè)新的容器,這個(gè)指令至少需要包括:
(1)、需要運(yùn)行什么image,這里使用的是ubuntu基礎(chǔ)鏡像
(2)、需要在容器啟動(dòng)是運(yùn)行什么命令,這里使用的是/bin/bash。是否需要進(jìn)入應(yīng)用程序,這里指定 -i -t,表示進(jìn)入容器交互模式
那么具體到內(nèi)部的流程是怎么樣的呢?
(1)、拉取ubuntu鏡像:docker檢查本地是否存在ubuntu鏡像,如果就自動(dòng)從docker hub拉取,如果存在就進(jìn)入下一步。
(2)、創(chuàng)建一個(gè)容器:一旦本地存在ubuntu鏡像,docker將通過(guò)它來(lái)創(chuàng)建容器。
(3)、分配文件系統(tǒng)并掛載一個(gè)RW層:容器是創(chuàng)建在文件系統(tǒng)中的,并且在其之上增加了一層讀寫層。由此可以看出容器并不會(huì)改變?cè)嫉溺R像。
(4)、分配網(wǎng)絡(luò)/橋接模式:創(chuàng)建一個(gè)橋接網(wǎng)絡(luò)接口,使容器可以和本地主機(jī)進(jìn)行通信。
(5)、設(shè)置一個(gè)IP地址:根據(jù)本地網(wǎng)絡(luò)情況,選取一個(gè)可用的IP掛載到容器之上。
(6)、啟動(dòng)一個(gè)進(jìn)程:這里就是/bin/bash
(7)、抓取應(yīng)用程序的輸出:將程序的stdin、stdout、和stderr進(jìn)行捕捉,這樣就可以看到程序的運(yùn)行情況。至此,就擁有了一個(gè)運(yùn)行的容器。通過(guò)容器,可以運(yùn)行程序,并且進(jìn)行交互。當(dāng)程序執(zhí)行完畢,可以停止和刪除程序。