3.Docker鏡像管理

本章所講內容

  • About Docker Images
  • Docker Registry
  • 鏡像製作
  • Docker Hub鏡像管理
  • aliyun平臺鏡像管理
  • 上傳鏡像到私有“Registry”

About Docker Images

Dcoker鏡像含有啓動容器所需要的文件系統及其內容,因此,其用於創建並啓動docker容器,其文件系統採用分層構建機制,最底層爲bootfs,其之爲rootfs。
>bootfs(引保文件系統):用於系統引導的文件系統,包括bootloader和kernel,容器啓動完成後被卸載以節約內存資源

>rootfs:位於bootfs之上,表現爲docker容器的根文件系統
>>rootfs傳統模式:傳統模式中,系統啓動時,內核掛載rootfs時會首先將其掛載爲“只讀”模式,完整性自檢完成後將其重新掛載爲讀寫模式。

>>rootfs Docker模式:rootfs由內核掛載爲“只讀”模式,而後通過“聯合掛載機制”技術額外掛載一個“可寫”層。

注意:聯合掛載機制解釋
    聯合掛載:如果docker需要產生臨時文件或者要寫入文件時,基於底層的鏡像是不給予寫入操作的,唯一能寫入的就是Docker容器層面的東西,就是上面說的到
“可寫層”,個人理解就像是把底層鏡像複製了一份,然後往裏面進行寫入或者更改操作。
    聯合掛載機制需要依賴於專門的文件系統,而在早期使用的Aufs文件系統,aufs前身是UnionFS,UnionFS代碼寫的很爛,被Aufs重寫之後代碼依然很爛,aufs
文件系統在2006年由Junjiro Okajima開發;是一位日本的工程師,他一直想把這套文件系統納入到linux內核中,但由於代碼寫的較爛,原本4000-5000行代碼可以
完成的文件,他寫了三萬行,連續四次向linux開源組織申請加入linux內核都被拒絕後,他放棄了!
    aufs的競爭產品是overlayfs(疊加文件系統),該文件系統從內核3.18版本開始就被合併到了Linux內核,現在CentOS7默認使用的內核都爲3.10,所以都還
是不支持的,如果想用,可以打個內核補丁到3.18版本。
    Docker的分層鏡像,除了aufs,docker還支持brtfs,devicemapper和vfs等。
    如果我們是新裝的docker版本,我們會發現它也已經使用了overlayfs文件系統了,但使用的是overlay的新版本叫overlay2,使用docker info命令可以看到
docker使用的overlay文件系統,但overlay2是一個抽象的二進制文件系統,需要建立在本地文件系統之上,所以下面出現的Backing Filesystem xfs就是本地文
件系統。

3.Docker鏡像管理

Docker Registry

    我們在docker上其實也是可以直接啓動容器的,容器的標籤名稱要指定對,啓動容器時,docker daemon首先會試圖從本地獲取到相關鏡像,也就是先看看本地是否已
經把該鏡像下載過了,如果沒有下載,則就會自動從Registry中下載該鏡像並保存到本地,Registry默認就是Docker Hub,如果我們搭建了docker私有Registry,並且
該私有Registry中有我們需要下載的鏡像,則通過修改pull路徑就可以從我們自己的私有Registry中下載。

Docker Registry分類

Sponsor Registry:第三方的registry,供客戶和docker社區使用

Mirror Registry:第三方的registry,只讓客戶使用。他們通常是由Docker Hub第三方提供

Vendor Registry:由發佈Docker鏡像的供應商提供的registry;比如某家公司所提供Registry,但並不開放給所有人使用,只開放給他們的客戶使用,例如花錢買了他們的產品、服務等的客戶使用

Private Registry:通過設有防火牆和額外的安全層的私有實體提供的Registry,就是我們自己搭建的私有Registry

Registry(repository and index)

一個Registry一般由兩部分組成分別爲repository和index

Repository:
    1.由某特定的docker鏡像,如Nginx的docker鏡像,這個nginx鏡像所有的迭代版本合起來組成的鏡像倉庫
    2.一個registry中可以存在多個repository
    3.repositry可分爲“頂層倉庫”和“用戶倉庫”
    4.用戶倉庫名稱格式爲“用戶名/倉庫名”
    5.每個倉庫可以包含多個tag(標籤),多個tag來表示多個Nginx鏡像,一個Nginx版本代表一個鏡像,每個標籤只能對應一個鏡像

Index:
    1.維護用戶賬戶、鏡像的校驗以及公共命名空間的信息
    2.相當於爲registry提供了一個完成用戶認證等功能的檢索接口
    Docker Registry中的鏡像通常由開發人員製作,而後推送到“公共”或者私有“Registry”上保存,供其他人員使用流程爲:開發人員使用docker pull從Docker
 Hub上下載最原始的鏡像,然後經過二次封裝,例如下載了個Nginx鏡像,開發人員經過了二次開發,增加了功能,然後再把經過二次開發的Nginx放到公司內部私有的
“Registry”上,一般僅供公司內部人員使用,例如“部署”到生產環境。

鏡像製作

鏡像的生成途徑通常有以下三種:
>Dockerfile

>基於容器製作

>Docker Hub automated builds

小結:Dockerfile是我們以後最常用的Docker鏡像製作方法,但本次我們使用“基於容器製作的方法制作鏡像”;基於容器製作,例如一個容器正在運行中,使用commit命令會把容器最上面的那個可寫層單獨創建一個鏡像,相當於克隆了容器最上面可寫入的那一層。

容器製作實例

[root@docker-node1 /]# docker pull nginx:latest                 #下載最新版的Nginx鏡像,latest爲鏡像標籤
[root@docker-node1 /]# docker run -itd --name mynginx nginx:latest      #後臺運行,容器名稱爲“mynginx”
[root@docker-node1 /]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx                           #查看容器“mynginx”的IP地址
172.17.0.2
[root@docker-node1 /]# curl http://172.17.0.2 -I                #對Nginx進行訪問測試,默認應該爲"wlecom to nginx!"
HTTP/1.1 200 OK
Server: nginx/1.15.5
Date: Wed, 17 Oct 2018 07:35:17 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 02 Oct 2018 14:49:27 GMT
Connection: keep-alive
ETag: "5bb38577-264"
Accept-Ranges: bytes
[root@docker-node1 /]# docker exec -it mynginx /bin/bash        #進入容器“mynginx”修改網頁文件
root@32131d2cbaac:/# echo '<h1>hello kgbk!</h1>' > /usr/share/nginx/html/index.html 
root@32131d2cbaac:/# cat /usr/share/nginx/html/index.html 
<h1>hello kgbk!</h1>
root@32131d2cbaac:/# exit
[root@docker-node1 /]# curl http://172.17.0.2                   #修改過後再進行訪問測試
<h1>hello kgbk!</h1>                                            #注:這裏網頁文件已做修改,開始製作鏡像
語法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
語法說明:
         CONTAINER:指定鏡像名稱
         REPOSTTORY:該鏡像是製作完成後屬於哪個倉庫 ,該項爲可選,不加會生成在本地,也沒有任何標籤
         TAG:該鏡像的標籤是什麼
OPTIONS說明:
        --author, -a        #指定克隆該容器後的作者和郵箱等
        --change, -c        #修改原有鏡像的指令
        --message, -m       #製作信息
        --pause, -p         #製作之間暫停容器
[root@docker-node1 /]# docker commit -p mynginx nginx:v0.1
sha256:2fe112b2504e76a166609fefc8fa54c8adce9bbcfd4d98108af43b672c2ff07e
[root@docker-node1 /]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v0.1                2fe112b2504e        8 seconds ago       109MB
nginx               latest              dbfc48660aeb        26 hours ago        109MB

對以創建的鏡像進行驗證

[root@docker-node1 /]# docker run -itd --name mynginx_node2 nginx:v0.1 
dcd9f77fe0c412415c871780f056f9b9115e9b444f220681be81510cfcb054a3
[root@docker-node1 /]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx_
node2
172.17.0.3
[root@docker-node1 /]# curl http://172.17.0.3               
<h1>hello kgbk!</h1>

純淨鏡像驗證

[root@docker-node1 /]# docker run -itd --name mynginx_node3 nginx:latest
95f189cb5389dd1737ab4baa3b553c1ef499aa924a0f0dcbe467c0c9842335bc
[root@docker-node1 /]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx_node3
172.17.0.4
[root@docker-node1 /]# curl http://172.17.0.4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Docker Hub鏡像管理

Docker hub搜索鏡像

Docker Hub搜索鏡像地址:https://hub.docker.com/explore/

3.Docker鏡像管理

點擊進去可以看到Nginx的各個標籤標誌的版本號

3.Docker鏡像管理

Docker hub鏡像管理

Docker Hub鏡像管理地址:https://hub.docker.com/
Docker Hub需要註冊賬號然後登陸才能在上面創建Docker Registry
Create Repository可以創建鏡像倉庫

-3.Docker鏡像管理
3.Docker鏡像管理
3.Docker鏡像管理

aliyun平臺鏡像管理

阿里雲平臺網址: https://dev.aliyun.com/search.html

3.Docker鏡像管理
3.Docker鏡像管理

創建鏡像倉庫,填寫倉庫的詳細信息

3.Docker鏡像管理
3.Docker鏡像管理
3.Docker鏡像管理
3.Docker鏡像管理
3.Docker鏡像管理
3.Docker鏡像管理

上傳鏡像到私有“Registry”

上傳到aliyun容器平臺

[root@docker-node1 /]# docker image ls                      
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v0.1                2fe112b2504e        3 hours ago         109MB
nginx               latest              dbfc48660aeb        28 hours ago        109MB
[root@docker-node1 /]# docker login [email protected] registry.cn-shanghai.aliyuncs.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded                                             #登陸成功

注意:阿里雲平臺上傳鏡像必須要求把鏡像名稱寫爲他們規定的名字,所以使用了docker tag改了標籤
[root@docker-node1 /]# docker tag nginx:v0.1 registry.cn-shanghai.aliyuncs.com/kgbk/nginx:aliyun
[root@docker-node1 /]# docker image ls
REPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE
registry.cn-shanghai.aliyuncs.com/kgbk/nginx   aliyun              2fe112b2504e        3 hours ago         109MB
nginx                                          v0.1                2fe112b2504e        3 hours ago         109MB
nginx                                          latest              dbfc48660aeb        28 hours ago        109MB
[root@docker-node1 /]# docker push registry.cn-shanghai.aliyuncs.com/kgbk/nginx:aliyun  #上傳鏡像
The push refers to repository [registry.cn-shanghai.aliyuncs.com/kgbk/nginx]
331a147bb76b: Pushed 
86df2a1b653b: Pushed 
bc5b41ec0cfa: Pushed 
237472299760: Pushed 
aliyun: digest: sha256:607e4f6d654b959e3202b002a6eeeeb44b430002b39e38f88ffd809963f0c2bc size: 1155

3.Docker鏡像管理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章