Docker鏡像基本原理


前言

Docker系列文章:

如果沒有安裝過Docker請參考本文最后部分,大家從現在開始一定要按照我做的Demo都手敲一遍,印象會更加深刻的,加油!

什么是鏡像

  1. 鏡像就是一個可執行獨立運行的軟件包。包含應用運行所必須的文件和依賴包;
  2. 鏡像可以理解為類或者模板,只要在容器的環境下開箱即用;

Docker鏡像加載原理

什么是UnionFS

在介紹UnionFS之前我們先來了解一下bootfs和rootfs:

bootfs(boot file system)

bootfs包含操作系統boot loader 和 kernel。用戶不會修改這個文件系統。bootloader主要引導kernel,Linux剛啟動的時候會加載bootfs文件系統,啟動完成后,整個Linux內核加載進內存,之后bootfs會被卸載掉,從而釋放出內存。

rootfs(root file system)

rootfs包含典型的目錄結構,包括 /dev, /proc, /bin, /etc, /lib, /usr, and /tmp等再加上要運行用戶應用所需要的所有配置文件,二進制文件和庫文件。這個文件系統在不同的Linux 發行版中是不同的。而且用戶可以對這個文件進行修改,Linux 系統在啟動時,roofs 首先會被掛載為只讀模式,然后在啟動完成后被修改為讀寫模式,隨后它們就可以被修改了。

UnionFS(Union File System)

UnionFS翻譯為聯合文件系統,2004年由紐約州立大學石溪分校開發,它可以把多個目錄(也叫分支)內容聯合掛載到同一個目錄下,而目錄的物理位置是分開的。UnionFS允許只讀和可讀寫目錄並存。UnionFS應用的地方很多,比如在多個磁盤分區上合並不同文件系統的主目錄,或把幾張CD光盤合並成一個統一的光盤目錄(歸檔)。另外,具有寫時復制(copy-on-write)功能UnionFS可以把只讀和可讀寫文件系統合並在一起,虛擬上允許只讀文件系統的修改可以保存到可寫文件系統當中。

Docker鏡像加速原理

Docker鏡像實際上是由一層一層文件系統組成,這種層級文件系統就是UnionFS,如下圖所示:


當用docker run啟動這個容器時,實際上在鏡像的頂部添加了一個新的可寫層。這個可寫層也叫容器層。

這里我們通過案例來證明一下,這是我本地已經下載好的鏡像包,大家可以看到centos這個鏡像包的大小才209M,平時我們安裝的虛擬機上的centos都是幾個G,這個里為什么200M就可以?這里我們的centos鏡像文件只是一個最精簡的rootfs版本,與底層系統共用了kernel,所以才200M就可以將一個centos跑起來,對於不同發行版本可能這個大小會略微有所不同。

我們總結下鏡像加速的原理,因為Docker鏡像是分層的,因此在加載一個鏡像的時候,會按照從底層到高層的順序依次加載該鏡像所需要的鏡像層。在加載的過程中,如果當前鏡像層已經存在,則會跳過當前鏡像層。比如:已經下載過MySQL鏡像,現在要下載Tomcat鏡像,而這兩個鏡像都需要CentOS鏡像層,那么下載Tomcat鏡像的時候,就會跳過下載CentOS鏡像層。

分層理解

當我們使用docker pull下載鏡像的時候,我們可以看到都是一層一層下載的,如下圖所示:


我們也可以使用docker image inspect elasticsearch查看elasticsearch的分層,如下圖所示:

Docker鏡像層如下圖所示:

Docker負責堆疊這些鏡像層,每個 Docker 鏡像都起始於一個基礎鏡像層,當進行修改或增加新的內容時,就會在當前鏡像層之上,創建新的鏡像層,如下圖所示:

實戰

提交鏡像

原始的Docker的Centos鏡像是沒VIM命令的,我們制作一個帶有VIM的Centos鏡像。

  1. 拉取鏡像,這里會發現鏡像也是一層一層拉取的;
docker pull centos
  1. 守護進程的模式啟動centos的鏡像;
#查看所有的鏡像
docker images
#后台模式啟動centos
docker run -d -it --name centos01 centos:latest
  1. 進入容器內部,查看原始鏡像是否支持vim命令;
#查看容器信息
docker ps
#交互方式進入容器
docker exec -it d86647f84f18 /bin/bash
#驗證
vim
  1. 在容器中安裝VIM命令,退出交互模式;
#安裝VIM命令;
yum -y install vim
#退出交互模式
exit
  1. 制作帶VIM的Centos的鏡像,並啟動驗證;
#docker commit -m="描述的信息"   -a="作者"  容器Id  TAG標簽
#提交一個名字叫vimcentos版本1.0的鏡像
docker commit -m="帶VIMCentos鏡像" -a="wtz" d86647f84f18 vimcentos:1.0
#啟動鏡像驗證是否支持VIM命令
docker run -d -it --name vimcentos vimcentos:1.0
推送鏡像到阿里雲鏡像倉庫
  1. 創建命名空間;
  2. 登錄阿里雲鏡像;
docker login --username=17177****@qq.com registry.cn-shanghai.aliyuncs.com
  1. 給鏡像打個標簽;
docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/wtzdockerhub/wtzdockerhub:[鏡像版本號]
  1. 上傳鏡像;
docker push registry.cn-shanghai.aliyuncs.com/wtzdockerhub/wtzdockerhub:[鏡像版本號]

Docker安裝

系統要求

Docker支持64位版本CentOS 7/8,並且要求內核版本不低於3.10。 CentOS7滿足最低內核的要求,但由於內核版本比較低,部分功能(如overlay2存儲層驅動)無法使用,並且部分功能可能不太穩定。

卸載舊版本

舊版本的Docker稱為docker或者docker-engine,使用以下命令卸載舊版本:

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
使用yum安裝

資源准備

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

資源配置

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

docker安裝

sudo yum -y install docker-ce

docker啟動

sudo systemctl enable docker
sudo systemctl start docker
鏡像包加速

鑒於國內網絡問題,后續拉取 Docker 鏡像十分緩慢,我們可以需要配置加速器來解決,國內可采用以下三種鏡像配置:

  • 阿里雲加速器(點擊管理控制台 -> 登錄賬號(淘寶賬號) -> 右側鏡像中心 -> 鏡像加速器 -> 復制地址)
  • 網易雲加速器https://hub-mirror.c.163.com
  • 百度雲加速器https://mirror.baidubce.com

檢查是否在 docker.service 文件中配置過鏡像地址;

systemctl cat docker |grep'\-\-registry\-mirror'

如果該命令有輸出,執行 systemctl cat docker 查看 ExecStart= 出現的位置,修改對應的文件內容去掉 --registry-mirror 參數及其值,並按接下來的步驟進行配置。
如果以上命令沒有任何輸出,那么就可以在 /etc/docker/daemon.json 中寫入如下內容(如果文件不存在請新建該文件):

cd  /etc/docker/
touch daemon.json
{
"registry-mirrors":[
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}

重啟服務

sudo systemctl daemon-reload
sudo systemctl restart docker

結束

歡迎大家點點關注,點點贊 !


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM