一、Docker工作原理
二、Docker容器和虛擬機對比
三、鏡像容器管理
1、Docker關鍵組件
2、Docker架構
3、Docker內部組件
鏡像(Image)——一個特殊的文件系統
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)
容器(Container)——鏡像運行時的實體
容器是鏡像運行時的實體。容器可以被創建、啓動、停止、刪除、暫停等
倉庫(Repository)——集中存放鏡像文件的地方
鏡像構建完成後,可以很容易的在當前宿主上運行,但是, 如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry就是這樣的服務
Docker採用了C/S架構。客戶端和服務端可以運行在一個機器上,也可以通過socket或者RESTful API 來進行通信。
Docker Daemon: 一般在宿主機後臺運行,等待接收客戶端的消息
Docker Client:則爲客戶提供一系列可執行的命令, 用戶使用這些命令跟docker daemon交互
Docker daemon:
Docker daemmon是Docker架構中的主要用戶接口。首先,它提供了API Server用於接收來自Docker client的請求,其後根據不同的請求分發給Docker daemon的不同模塊執行相應的工作
Image managerment:
需要創建DOcker容器時,可通過鏡像管理(image management)部分的distribution和registry模塊從Docker registry中下載鏡像,並通過鏡像管理的image、reference和layer存儲鏡像的元數據,通過鏡像存儲驅動graphdriver將鏡像文件存儲於具體的文件系統中
Network:
當需要爲Docker容器創建網絡環境時,通過網絡模塊network調用libnetwork創建並配置Docker容器的網絡環境
Volume:
當需要爲容器創建數據卷volume時,則通過volume模塊調用某個具體的volumedrive,來創建一個數據卷並負責後續的掛載操作
Execdriver:
當需要限制Docker容器運行資源或執行用戶指令操作時,則通過execdrive來完成
Libcontainer:
是對cgroups和namespace的二次封裝,execdrive是通過libcontainer來實現對容器的具體管理,包括利用UTS、IPC、PID、Network、Mount、User等namespace實現容器之間的資源隔離和利用cgroups實現對容器的資源限制.當運行容器的命令執行完畢後,一個實際的容器就處於運行狀態,該容器具有獨立的文件系統、相對安全且相互隔離的運行環境.
1、用戶是使用Docker Client與Docker Daemon建立通信,併發送請求給後者
2、Engine執行Docker內部的一系列工作,每一項工作都是以一個Job的形式的存在。
3、Job的運行過程中,當需要容器鏡像時,則從Docker Registry中下載鏡像,並通過鏡像管理驅動graphdriver將下載鏡像以Graph的形式存儲;當需要爲Docker創建網絡環境時,通過網絡管理驅動networkdriver創建並配置Docker容器網絡環境;當需要限制Docker容器運行資源或執行用戶指令等操作時,則通過execdriver來完成。libcontainer是一項獨立的容器管理包,networkdriver以及execdriver都是通過libcontainer來實現具體對容器進行的操作。
1、容器和虛擬機對比
2、Docker的優勢
3、Docker的劣勢
4、Docker的應用場景
Docker 的的優勢:
持續部署和測試
發到產品發佈的整個過程中使用相同的容器來確保沒有任何差異或者人工干預。Docker可以保證測試環境、開發環境、生產環境的一致性。
可移植性
容器可以移動到任意一臺Docker主機上,而不需要過多關注底層系統。
彈性伸縮更快速
配合K8S可以很容易的無狀態應用的彈性伸縮,只需要改一個yml的數字即可。利用docker能在幾秒鐘之內啓動大量的容器,這是虛擬機無法辦到的,快速啓動,秒級和分鐘級的對比。
資源利用率高
由於docker不需要Hypervisor實現硬件資源虛擬化,docker容器和內核交互,幾乎沒有性能損耗,性能優於通過Hypervisor層與內核層的虛擬化。一臺機器啓動上前臺容器也沒問題。
對硬件無要求
不需要CPU支持虛擬化
Docker 的的劣勢
資源隔離
docker是利用cgroup實現資源隔離的,只能限制資源消耗的最大值,而不能隔絕其他應用程序佔用自己的資源; docker屬於進程之間的隔離,虛擬機可實現系統級別隔離;
安全性問題
一個用戶擁有執行docker的權限,可以刪除任何用戶創建的容器。
兼容性問題
docker目前還在版本快速更新中,細節功能調整較大,一些核心的模塊依賴於高版本的內核,存在兼容性的問題。
1、Docker安裝
2、認識鏡像和容器
3、鏡像容器管理
什麼是鏡像?
鏡像是一個多層的聯合只讀的文件系統。
什麼是容器?
容器是在鏡像基礎上加上讀寫層。容器即進程。
構建鏡像的過程?
鏡像->鏡像+可寫層+執行命令->commit爲新的鏡像(新的一層)->鏡像+可寫層+執行命令->commit爲新的鏡像(新的一層)->…
典型文件系統啓動 :
一個典型的 Linux 文件系統由 bootfs 和 rootfs 兩部分組成,
bootfs(boot file system)
主要包含 bootloader 和 kernel,bootloader 主要用於引導加載 kernel,當 kernel 被加載到內存中後 bootfs 會被 umount 掉
rootfs (root file system)
包含的就是典型 Linux 系統中的/dev,/proc,/bin,/etc 等標準目錄和文件
加載過程:
bootfs 時會先將 rootfs 設爲 read-only,然後在系統自檢之後將 rootfs 從 read-only 改爲 read-write,
Docker文件系統啓動:
Docker 在 bootfs 自檢完畢之後並不會把 rootfs 的 read-only 改爲 read-write,而是利用 union mount(UnionFS 的一種掛載機制)將 image 中的其他的 layer 加載到之前的 read-only 的 rootfs 層之上,每一層 layer 都是 rootfs 的結構,並且是read-only 的。所以,我們是無法修改一個已有鏡像裏面的 layer 的!只有當我們創建一個容器,也就是將 Docker 鏡像進行實例化,系統會分配一層空的 read-write 的 rootfs ,用於保存我們做的修改
Dockerfile
FROM centos
ENV TZ "Asia/Shanghai"
ADD echo.sh /opt/echo.sh
RUN chmod +x /opt/echo.sh
CMD ["/opt/echo.sh"]
docker build -t test -f Dockerfile .
鏡像工作原理:
如果運行中的容器修改一個已經存在的文件,那麼會將該文件從下面的只讀層複製到讀寫層,只讀層的這個文件就會覆蓋(隱藏),但還存在。
如果刪除一個文件,在最上層會被標記隱藏,實際只讀層的文件還存在。
這就實現了文件系統隔離,當刪除容器後,讀寫層的數據將會刪除,只讀鏡像不變。
查看具體的掛載邏輯
[root@centos7 l]# mount|grep overlay
overlay on
/var/lib/docker/overlay2/56375ce93fd54484061ef08a48a7093905be680dd14754642970616127b30fca/merged type overlay (rw,relatime,seclabel,lowerdir=/var/lib/docker/overlay2/l/A6JYT4QIFZMKOPIGY675JWKS7F:/var/lib/docker/overlay2/l/4L4SUINS3DX6XPD5BL2J54JQDT,upperdir=/var/lib/docker/overlay2/56375ce93fd54484061ef08a48a7093905be680dd14754642970616127b30fca/diff,workdir=/var/lib/docker/overlay2/56375ce93fd54484061ef08a48a7093905be680dd14754642970616127b30fca/work)
Overlay和overlay2的區別
overlay: 只掛載一層,其他層通過最高層通過硬連接形式共享(增加了磁盤inode的負擔)
overlay2: 逐層掛載(最多128層)
基礎鏡像的層信息
docker pull centos
tree -L 2 /var/lib/docker/overlay2/
構建後鏡像的層信息
cd layer_dockerfile/
docker build -t centos:test -f ./Dockerfile .
tree -L 2 /var/lib/docker/overlay2/
每一層都包含了”該層獨有的文件”以及”和其低層共享的數據的連接”,在Docker 1.10之前的版本中,目錄的名字和鏡像的UUID相同,而Docker 1.10後則採用了新的存儲方式,可以看到目錄名和下載鏡像的UUID並不相同
Diff
存放掛載點的具體的文件內容
Link
對應l目錄的鏈接源的名稱
Lower
根沒有lower,其它的lower指向的父層的鏈接
L:
”l“目錄包含一些符號鏈接作爲縮短的層標識符. 這些縮短的標識符用來避免掛載時超出頁面大小的限制
docker run -idt --name centos_con centos:test /bin/bash
tree -L 2 /var/lib/docker/overlay2/
多出的兩層“……”爲讀寫層,“…..-init”爲初始層。
初始層:
初始層中大多是初始化容器環境時,與容器相關的環境信息,如容器主機名,主機host信息以及域名服務文件等。
讀寫層:
所有對容器做出的改變都記錄在讀寫層
Diff
存放掛載點的具體的文件內容
Link
對應l目錄的鏈接源的名稱
Lower
根沒有lower,其它的lower指向的父層的鏈接
Merged
如果是讀寫層會有一個Merged
Commit:容器提交爲鏡像
docker run -idt --name test centos
Touch liwei
docker commit 6de test2
Create:創建容器但是不啓動
docker create --name nginx-con -p80:80 nginx:latest
Start:啓動容器
docker start nginx-con
Stop:停止容器
docker stop nginx-con
Kill:殺掉容器,和停止相比不友好
docker kill nginx-con
Pause:暫停容器
docker pause nginx-con
Unpause:恢復暫停的容器
docker unpause nginx-con
Run:創建且啓動容器
docker run -idt --restart=always --name nginx_con -v /tmp/:/mnt -p 88:80 -e arg1=arg1 nginx
Docker attach nginx_con
Ctrl+^p+^q
CP:宿主機和容器之間copy文件
docker cp docker_install.sh nginx_con:/opt
docker exec nginx_con ls /opt
docker cp nginx_con:/opt/docker_install.sh ./1.sh
Exec:執行命令,也可附加到容器
docker exec nginx_con ls /opt
Attach:附加到容器
docker attach nginx_con
docker exec -it nginx_con /bin/bash
Logs:查看容器日誌
docker logs –f nginx_con
Inspect:查看元數據,可以查看鏡像和容器
docker inspect nginx_con
Port:查看容器端口映射
docker port nginx_con
Top:查看容器中正在運行的進程
docker top nginx_con
Ps:查看容器
docker ps
docker ps -a
docker ps -aq
查看正在運行的容器,加上-a查看所有容器(包含停止和暫停狀態的容器)
Rm:刪除容器
docker rm nginx_con 刪除容器
docker rm -f nginx_con 強行刪除容器
Export:導出容器
docker pull busybox
docker run -itd busybox
docker export 983989307eef>busybox.tar
Import:導入容器
docker import busybox.tar busybox:1.3
Save:導出鏡像
docker save busybox:1.3>busybox1.3.tar
Load:導入鏡像
docker load -i busybox1.3.tar
Tag:鏡像打標籤
docker tag busybox:1.3 192.168.199.160/test/busybox:latest
Build:從dockerfile構建鏡像
FROM centos
ENV TZ "Asia/Shanghai"
ADD echo.sh /opt/echo.sh
RUN chmod +x /opt/echo.sh
CMD ["/opt/echo.sh"]
docker build -t centos:test -f Dockerfile .
Pull:從 registry拉取鏡像
docker pull nginx 從dockerhub上拉取
docker pull 192.168.199.160/test/nginx:latest 從內網harbor上拉取
Push:推送鏡像到倉庫[第一次需要輸入密碼,後續不需要了]
docker login 192.168.199.160
admin
Harbor12345
docker push 192.168.199.160/test/busybox:latest
Info、version、events
docker info 查看docker相關信息信息
Docker version 查看docker相關版本信息
Docker events 查看docker事件
【注】
1、創建容器後防火牆不要再動
2、cmd會被覆蓋的問題,需要注意,可能會導致/bin/bash 把啓動命令覆蓋了,啓動不了的問題例如
docker run -idt --restart=always --name nginx_con -v /tmp/:/mnt -p 88:80 -e arg1=arg1 nginx /bin/bash
3、cmd的命令都會在掛在後執行。