一、基本了解
- 鏡像可以理解為應用程序的集裝箱,而docker用來裝卸集裝箱。
- docker鏡像含有啟動容器所需要的文件系統(tǒng)及其內(nèi)容,所以鏡像是用于創(chuàng)建并啟動容器。
1.1 鏡像結(jié)構(gòu)
- docker鏡像采用分層構(gòu)建機制,最底層為bootfs,其上為rootfs。
- bootfs:用于系統(tǒng)引導的文件系統(tǒng),包括bootloader和kernel,容器啟動完成后會被卸載以節(jié)約內(nèi)存資源。
- rootfs:位于bootfs之上,表現(xiàn)為docker容器的根文件系統(tǒng)。
- 傳統(tǒng)模式中,系統(tǒng)啟動之時,內(nèi)核掛載rootfs會首先將其掛載為“只讀”模式,完整性自檢完成后將其重新掛載為讀寫模式。
- docker中,rootfs由內(nèi)核掛載為“只讀”模式,而后通過“聯(lián)合掛載”技術(shù)額外掛載一個“可寫”層。
- 當刪除容器時,這個容器自有的“可寫”層會一起被刪除。
![]()
docker鏡像層:
- 位于下層的鏡像稱為父鏡像(parrent image),最底層的稱為基礎(chǔ)鏡像(base image)。
- 最上層為“可讀寫”層,其下的均為“只讀”層。
![]()
1.2 docker存儲驅(qū)動
- docker提供多種存儲驅(qū)動來實現(xiàn)不同的方式存儲鏡像,比如 AUFS、OverlayFS、Devicemapper、Btrfs、VFS。
- OverlayFS是文件級存儲,Device mapper是塊級存儲。塊級存儲是直接訪問邏輯盤,適合IO密集場景;對于程序內(nèi)部復雜,大并發(fā)但少IO的場景,Overlay的性能相對要強一些。
1.2.1 AUFS
- AUFS(AnotherUnionFS)是一種Union FS,是文件級的存儲驅(qū)動,是一個能透明覆蓋一個或多個現(xiàn)有文件系統(tǒng)的層狀文件系統(tǒng),把多層合并成文件系統(tǒng)的單層表示。
- 這種文件系統(tǒng)可以一層一層地疊加修改文件,只有最上層的文件系統(tǒng)可寫,底下層都是只讀的。
- 當需要修改一個文件時,AUFS創(chuàng)建該文件的一個副本,CoW將文件從只讀層復制到可寫層進行修改,結(jié)果也保存在可寫層。
- 在Docker中,底下的只讀層是image,可寫層是Container。
- 目前已基本被淘汰。
1.2.2 OverlayFS
- Overlay是Linux內(nèi)核3.18后支持的,也是一種Union FS,和AUFS的多層不同的是Overlay只有兩層:一個upper文件系統(tǒng)和一個lower文件系統(tǒng),分別代表Docker的鏡像層和容器層。
- 當需要修改一個文件時,CoW將文件從只讀的lower復制到可寫的upper進行修改,結(jié)果也保存在upper層。
- 在Docker中,底下的只讀層是image,可寫層就是Container,目前最新的OverlayFS為Overlay2。
1.2.3 DeviceMapper
- Device mapper是Linux內(nèi)核2.6.9后支持的,提供的一種從邏輯設備到物理設備的映射框架機制,是塊級存儲,所有操作都是直接對塊進行操作,而不是文件。
- Device mapper驅(qū)動會先在塊設備上創(chuàng)建一個資源池,然后在資源池上創(chuàng)建一個帶有文件系統(tǒng)的基本設備,所有鏡像都是這個基本設備的快照,而容器則是鏡像的快照。所以在容器里看到文件系統(tǒng)是資源池上基本設備的文件系統(tǒng)的快照,并沒有為容器分配空間。
- 當要寫入一個新文件時,在容器的鏡像內(nèi)為其分配新的塊并寫入數(shù)據(jù),這個叫用時分配。當要修改已有文件時,再使用CoW為容器快照分配塊空間,將要修改的數(shù)據(jù)復制到在容器快照中新的塊里再進行修改。
1.3 鏡像倉庫
- 啟動容器時,docker daemon守護進程會試圖從服務器本地獲取相關(guān)鏡像,本地鏡像不存在時,再從Registry中下載該鏡像并保存到本地。
- Registry用于保存docker鏡像,包括鏡像的層次結(jié)構(gòu)和元數(shù)據(jù)。用戶可以自建Registry,亦可使用官方的Docker Hub。
![]()
docker registry分類:
- Sponsor Registry:第三方的Registry,供客戶和Docker社區(qū)使用。
- Mirror Registry:第三方的Registry,只讓客戶使用。
- Vendor Registry:由發(fā)布docker鏡像的供應商提供的registry。
- Private Registry:通過設有防火墻和額外的安全層的私有實體提供的registry
docker registry組成:
- Repository:
- 由某特定的docker鏡像的所有迭代版本組成的鏡像倉庫。
- 一個Registry中可以存在多個Repository。
- Repository可分為“頂層倉庫”和“用戶倉庫”。頂層倉庫基于各個官方發(fā)布的,建議使用。
- 用戶倉庫名稱格式為“用戶名/倉庫名”。
- 每個倉庫可包含多個Tag(標簽),每個標簽對應一個鏡像。
- Index:
- 維護用戶帳戶、鏡像的檢驗以及公共命名空間的信息。
- 相當于為Registry提供了一個完成用戶認證等功能的檢索接口
二、鏡像制作
鏡像的生成途徑:
- Dockerfile。
- 基于容器制作。
- Docker Hub automated builds
![]()
docker鏡像的制作:
- 多數(shù)情況下,我們做鏡像是基于別人已存在的某個基礎(chǔ)鏡像來實現(xiàn)的,我們把它稱為base image。比如一個純凈版的最小化的centos、ubuntu或debian。
- 拉取鏡像命令,鏡像倉庫地址+倉庫名稱+鏡像名稱+鏡像版本
docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
2.1 基于容器制作鏡像
- docker commit 命令是根據(jù)已存在的鏡像進行修改生成新鏡像。
- 命令格式:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
參數(shù) | 釋義 |
---|---|
-a | 提交的鏡像作者。 |
-c | 使用Dockerfile指令來創(chuàng)建鏡像。 |
-m | 提交時的說明文字。 |
-p | 在commit時,將容器暫停。 |
1.拉一個系統(tǒng)鏡像作為基礎(chǔ)鏡像,并創(chuàng)建一個臨時運行容器qingjun。
docker run --name qingjun -it --rm busybox /bin/sh
2.將容器qingjun保存為新的鏡像,指定新鏡像存儲庫名稱+版本。
docker commit -p qingjun baimu:v1
3.遠程倉庫創(chuàng)建存儲庫,名稱需要與新鏡像的庫名一致。
4.本地登錄docker遠程倉庫。可以是docker hub官方倉庫,也可以是自己搭建的私有倉庫harbor。
5.推送鏡像。
//給鏡像打標簽,標簽需要與遠程倉庫對應。
docker tag baimu:v1 baimuqingjun/baimu:v1
//推送鏡像。
docker push baimuqingjun/baimu:v1
6.docker hub倉庫查看推送結(jié)果。
7.將本地的原鏡像刪除,拉取剛剛推送上去的鏡像,并創(chuàng)建臨時容器制作第二個鏡像。
//刪除本地v1鏡像。
docker rmi baimuqingjun/baimu:v1
//拉取v1鏡像啟動容器。
docker run --name qingjun -it --rm baimuqingjun/baimu:v1 /bin/sh
/ # cd /data/
/data # rm -f text
/data # echo 'haha' > index.html
//使用dockerfile命令制作v2鏡像。
//-c指定運行httpd服務,-f前臺運行,-h指定網(wǎng)站目錄。
docker commit -c 'CMD ["/bin/httpd","-f","-h","/data"]' -p qingjun baimuqingjun:v2
docker tag baimuqingjun:v2 baimuqingjun/baimu:v2
docker push baimuqingjun/baimu:v2
8.使用v2鏡像運行容器,獲取容器ip。
//-d指定容器后臺運行,需要有個前臺進程,這里指定睡眠時間。
docker run --name qingjun baimuqingjun/baimu:v2
三、鏡像導入與導出
1.將第一臺機器上的鏡像進行打包,并將鏡像包傳到第二臺機器上。
docker save -o baimu_v2.image.gz baimuqingjun/baimu:v2
2.在第二臺機器上對鏡像包進行導入。文章來源:http://www.zghlxwxcb.cn/news/detail-722861.html
docker load -i baimu_v2.image.gz
文章來源地址http://www.zghlxwxcb.cn/news/detail-722861.html
到了這里,關(guān)于docker基礎(chǔ)3——制作鏡像(基于容器)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!