您好,登錄后才能下訂單哦!
一、Docker的基礎架構形式
客戶端(docker run |create等)通過httpd或https和一個運行了docker host守護進程的主機(docker daemon)通信。
docker daemon接收到了客戶端的創建或啟動容器的命令后,將在本地查找鏡像創建或啟動容器(在一個docker host上可以啟動多個容器)。
如果本地沒有鏡像,docker host會連接到配置的遠程repository(一般默認repo是docker hub)上下載鏡像到本地的一個專用的文件系統,在docker1.18使用的是overlay2,之前使用的是aufs/btrfs/lxc。鏡像本身是只讀的。
而后開始根據客戶端命令創建或運行容器。
1.1、docker鏡像
根據上面的架構,docker鏡像是docker運行容器的一個重要的組件。docker鏡像含有啟動容器所需要的文件系統及其內容。因此,鏡像的作用就是創建并啟動docker容器,其特點是;
1、采用分層構建機制,最底層為bootfs,其次為rootfs
bootfs:用于系統引導的文件系統,包括bootloader和kernel,容器系統啟動完成會被卸載以節約內存資源
rootfs:位于bootfs之上,表現為docker容器的根文件系統。每添加一個軟件,都是一個獨立的層
在linux傳統模式中,系統啟動時,內核掛載rootfs時,會首先將其掛載為“只讀”模式(為了避免自檢遇到錯誤而刪除文件),完整性自檢完成后再將其掛載為讀寫模式
在docker中,rootfs由內核掛載為“只讀模式”,而后通過“聯合掛載”技術額外掛載一個“可寫層“。
容器啟動時,必須按照層次加載,首先掛載bootfs,系統啟動之后,從內存中刪除bootfs,掛載rootfs,其次依次掛載上面的image層,每個應用都是一個層,這下面的所有層都是只讀的。而后,在最上層掛載一個可寫層。(對于一個容器來說,它的寫操作都只能在這個可寫層來實現)。他們是疊加在一起掛載的,所以稱之為聯合掛載。
當一個容器銷毀時(執行docker container rm操作)它的可寫層也將被刪除掉。
1.2、docker文件系統
1、docker鏡像的分層構建,聯合掛載依賴于專有文件系統的支撐才能實現,在早期用到的專有文件系統是aufs(advanced multi-layered unification filesystem):高級多層統一文件系統,aufs是最早被docker用來實現聯合掛載的linux文件系統,它是UnionFS的重新實現,2006年由junjiro Okajima開發。由于centos內核對aufs不支持,所以早期使用docker只能使用Ubuntu操作系統。
2、aufs的競爭產品是overlayfs,從3.18版本開始被合并到linux內核
3、除了aufs,docker還支持btrfs,devicemapper和vfs等
在Ubuntu系統下,docker默認使用aufs,而早期在centos7中,用的是devicemapper,現在最新版本的dockercentos用的是overlayfs第二個版本;overlay2(overlay2是一種抽象的二級文件系統,需要借助于本地文件系統;xfs)
1.3、docker registry
我們去構建鏡像時,鏡像做好之后應該有一個統一存儲的位置,這個位置叫docker registry
1、docker registry分類
Sponsor Registry:第三方的registry,供客戶和Docker社區使用
Mirror Registry:第三方的registry,只讓客戶使用,比如docker cn加速,阿里云的docker加速器
Vendor Registry:由發布Docker鏡像的供應商提供的registry,比如紅帽,只提供給買了服務了客戶使用
Private Registry:私有的docker倉庫,指用戶自己搭建的docker倉庫,只能供內部使用
public docker registry:公共的docker倉庫,一般沒有做額外的配置,指的就是docker hub
由于第三方registry的鏡像大部分都不符合我們的使用要求,所以我們都要自建registry
2、registry的組成
Registry:
由某特定的docker鏡像的所有迭代版本組成的鏡像倉庫,
一個Registry中可以存在多個Repository
Repository可分為“頂層倉庫”和“用戶倉庫”
用戶倉庫名稱格式為“用戶名/倉庫名”
每個倉庫可以包含多個Tag,每個Tag對應一個鏡像
Index:
維護用戶賬戶,鏡像的校驗以及公共命名空間的信息
相當于為Registry提供了一個完成用戶認證等功能的檢索接口
3、registry的拉取
拉取鏡像使用docker pull命令
docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
其中registry、port、namespace可省略
registry:是一個倉庫的web地址,如果不使用默認的docker hub倉庫,需要指明倉庫地址
port:是倉庫web地址的端口號,默認使用443
namespace:代表是哪個用戶的倉庫,如果鏡像是頂級倉庫,namespace就是可省略的,namespace分為三類
name:倉庫的名字,和tag一起標識了一個唯一的鏡像
tag:鏡像的標簽,沒有就代表是一個鏡像的最新版
其中,nginx為頂層倉庫,jwilder/nginx-proxy為用戶的倉庫
例如:
docker pull nginx:1.14 # 沒有指倉庫地址默認從docker hub上下載nginx1.14版本到本地 docker pull quay.io/coreos/flannel:v0.10.0-amd64 # 從quay上拉取鏡像,coreos是namespace,flannel是倉庫名,v0.10.0-amd64是tag
4、鏡像的制作
鏡像的生成途徑有三種
Dockerfile
基于容器制作
Docker Hub automated builds
4.1、基于容器制作鏡像(在一個centos鏡像中安裝httpd并設置啟動容器執行httpd命令)
首先要啟動一個容器,我去docker hub下載一個centos的鏡像
1、下載centos鏡像并運行
[root@localhost ~]# docker image pull centos:6.6 6.6: Pulling from library/centos f9f73d801f05: Pull complete Digest: sha256:74727b849f5169d0de21848f8da9d47ea241757d6f89434f312813f723451ebd Status: Downloaded newer image for centos:6.6 [root@localhost ~]# [root@localhost ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx stable ecc98fc2f376 2 weeks ago 109MB centos 6.6 4e1ad2ce7f78 3 weeks ago 203MB redis 4-alpine 05097a3a0549 4 weeks ago 30MB [root@localhost ~]# docker container run -p 5000:5000 --name centos1 -it centos:6.6 /bin/sh sh-4.1# sh-4.1#
2、在容器中安裝httpd
sh-4.1# yum install httpd ... ... ... Installed: httpd.x86_64 0:2.2.15-69.el6.centos Dependency Installed: apr.x86_64 0:1.3.9-5.el6_9.1 apr-util.x86_64 0:1.3.9-3.el6_0.1 apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 httpd-tools.x86_64 0:2.2.15-69.el6.centos mailcap.noarch 0:2.1.31-2.el6 redhat-logos.noarch 0:60.0.14-12.el6.centos Complete! sh-4.1#
3、編輯httpd主頁文件并啟動httpd
sh-4.1# echo "<h2>Welcom To My Httpd</h2>" >/var/www/html/index.html sh-4.1# /usr/sbin/apachectl -D FOREGROUND sh-4.1# curl 127.0.0.1 <h2>Welcom To My Httpd</h2>
4、修改容器啟動執行的命令并制作鏡像
[root@bogon ~]# docker commit -p -c 'CMD ["/usr/sbin/apachectl"," -D","FOREGROUND"]' centos1 httpd:1.1 sha256:bbffcf779dd42e070d52a4661dcd3eaba2bed898bed8bbfe41768506f063ad32 [root@bogon ~]# [root@bogon ~]# [root@bogon ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE httpd 1.1 bbffcf779dd4 6 seconds ago 264MB # 這是剛才制作的httpd鏡像 nginx stable ecc98fc2f376 2 weeks ago 109MB centos 6.6 4e1ad2ce7f78 3 weeks ago 203MB redis 4-alpine 05097a3a0549 4 weeks ago 30MB
5、直接啟動剛才制作的鏡像并驗證httpd是否可以訪問
[root@localhost ~]# docker container run --name centos2 -d httpd:1.1 868410465faaa3c3b89d84890e2fa8f76fe4d645075b6796299a24ccfb80be48 [root@bogon ~]# curl 172.17.0.2 <h2>Welcom To My Httpd</h2>
6、查看運行的centos2的容器的詳細信息
[root@localhost ~]# docker container inspect centos2 [ ... ... ... "Cmd": [ "/usr/sbin/apachectl", " -D", "FOREGROUND" ], "ArgsEscaped": true, "Image": "httpd:1.1", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, ... ... ... "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "bb55b61b005b7191dd2c5dc67f58dbf5be6cd7d2b29b01fc9cee56fc97166920", "EndpointID": "c4e1d785b5c463d9c99bf323ec07508fef364ff4be91f148e6f0ed7a9f96c4d6", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02", "DriverOpts": null } } } } ]
可以看到,CMD已經從運行/bin/sh變成了我改的運行httpd服務了。至此,基于容器的鏡像已經構建成功
5、鏡像的導入和導出
如果我們制作的鏡像無法push到registry,那么可以使用鏡像的導入和導出共享給其他人
5.1、打包鏡像
docker save命令可以將你的鏡像打包成壓縮文件,由此共享給其他人
[root@localhost ~]# docker image ls # 打包之前的鏡像 REPOSITORY TAG IMAGE ID CREATED SIZE httpd 1.1 bbffcf779dd4 19 minutes ago 264MB nginx stable ecc98fc2f376 2 weeks ago 109MB centos 6.6 4e1ad2ce7f78 3 weeks ago 203MB redis 4-alpine 05097a3a0549 4 weeks ago 30MB [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# docker save -o myimages.gz httpd:1.1 nginx:stable centos:6.6 redis:4-alpine [root@localhost ~]# ls myimages.gz myimages.gz
5.2、刪除現有的鏡像
[root@localhost ~]# docker image rm httpd:1.1 nginx:stable centos:6.6 redis:4-alpine Untagged: httpd:1.1 Deleted: sha256:bbffcf779dd42e070d52a4661dcd3eaba2bed898bed8bbfe41768506f063ad32 Deleted: sha256:dd73969752ff69c74c52136379013cff46f6cc2055e0bf46f64be5d336270dfd Untagged: nginx:stable Untagged: nginx@sha256:8b600a4d029481cc5b459f1380b30ff6cb98e27544fc02370de836e397e34030 Deleted: sha256:ecc98fc2f376d6560311b66d6958e4350a5a485ee07aa2d1235842d0bce440da Deleted: sha256:1113e327b1235b943bc1e68ae9afa1fb663b4eb7527759ed28af36e0d2c2943e Deleted: sha256:639da82d77d23ee8dedd6291b14f715af416d9cbf311b6f3ad982d7ce5a37c07 Deleted: sha256:237472299760d6726d376385edd9e79c310fe91d794bc9870d038417d448c2d5 Untagged: centos:6.6 Untagged: centos@sha256:74727b849f5169d0de21848f8da9d47ea241757d6f89434f312813f723451ebd Deleted: sha256:4e1ad2ce7f78a77d914f18887130acd55778fbdd1bd3288f026ebd29181ec365 Deleted: sha256:da6517724f67fd4133a5bf508f7c79e20d8e2741c5b3264790d49db5e97c0e2e [root@localhost ~]# [root@localhost ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE [root@localhost ~]#
5.3、重新load回剛才的鏡像
[root@localhost ~]# docker load -i myimages.gz da6517724f67: Loading layer [==================================================>] 213.2MB/213.2MB ddcb568d3d1e: Loading layer [==================================================>] 61.56MB/61.56MB Loaded image: httpd:1.1 237472299760: Loading layer [==================================================>] 58.44MB/58.44MB f4a5f8f59caa: Loading layer [==================================================>] 54.2MB/54.2MB 19c605f267f4: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: nginx:stable Loaded image: centos:6.6 df64d3292fd6: Loading layer [==================================================>] 4.672MB/4.672MB 04c8ef03e935: Loading layer [==================================================>] 11.78kB/11.78kB 169a281fff0f: Loading layer [==================================================>] 2.192MB/2.192MB 742e4d74cbf8: Loading layer [==================================================>] 24.32MB/24.32MB 9e8211b509e6: Loading layer [==================================================>] 1.536kB/1.536kB c51fc5b2384b: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: redis:4-alpine [root@localhost ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE httpd 1.1 bbffcf779dd4 28 minutes ago 264MB nginx stable ecc98fc2f376 2 weeks ago 109MB centos 6.6 4e1ad2ce7f78 3 weeks ago 203MB redis 4-alpine 05097a3a0549 4 weeks ago 30MB
5.4、重新運行鏡像驗證是否可以啟動容器
[root@localhost ~]# docker container run --name myhttpd -d httpd:1.1 ae29e544fbe614bca3109b94ec77afd55a29bd637280c88e703191edd80751fc [root@localhost ~]# [root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ae29e544fbe6 httpd:1.1 "/usr/sbin/apachectl?? 8 seconds ago Up 7 seconds 5000/tcp myhttpd [root@localhost ~]# curl 172.17.0.2 <h2>Welcom To My Httpd</h2>
鏡像的上傳到registry操作后續補上
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。