Docker入門(2)——鏡像結構和私有鏡像庫

在這裏插入圖片描述
前面一篇教程裏面,我們操練了一下如何在一臺服務器上實際安裝和使用docker。接下來我們來討論一下和鏡像有關的話題。

Docker鏡像的分層結構

前面我們也提到過,docker在宿主機上面並不是以一個單獨的文件保存一個鏡像,而是有一套複雜的類似數據庫的數據結構來保存所有的鏡像。
這個數據結構,是一個分層的結構。藉助網上找來的一張圖來解說一下吧。
在這裏插入圖片描述
對於如圖所示的這樣一個鏡像,在docker環境裏面是以4個層來存儲的。而這四個層,以構建這個鏡像的dockerfile裏面的操作一一對應。
也就是說,我們在build一個鏡像的時候,在dockerfile裏面寫入的from某個基礎鏡像,在這個基礎鏡像的基礎上做1,2,3幾個操作。對應到這個構建好的鏡像,就是分爲基礎鏡像一層,123每個操作一層,一共四層存儲。Dockerfile裏面的每條命令都會添加一個數據層,最終的image是以若干層疊加存儲在宿主機上。

如果另外有一個鏡像,和之前的鏡像只在最後一層不一樣,那麼docker系統只保存最後一層的數據,也就是其中的差值。

這樣做的好處在於:

  1. docker images看到的鏡像大小並不是實際佔用的磁盤空間,實際空間佔用要小得多
  2. 保存大量的image也不會佔用大量的磁盤空間
  3. 拉取同一個鏡像的不同版本的時候,除了第一次之外,不會佔用大量的帶寬

這都是因爲同一個鏡像的不同版本,甚至不同鏡像,都有可能共享大量相同的數據層,因此在存儲和數據傳輸時,大量的數據是可以複用的。

save/load鏡像

一般來說我們的鏡像的來源,要麼是自己build,要麼就是從鏡像庫裏面拉取回來。但是總會有一些意外情況,我們需要能用文件傳輸的方式來操作鏡像,docker也有提供類似的機制。

可以先在一臺可以pull的服務器上pull image,然後使用命令sudo docker save -o 鏡像名.tar 鏡像ID予以導出成文件,將文件通過scp或ftp傳輸到Private Registry上,再使用命令sudo docker load 鏡像名.tar進行導入。這也是用文件傳輸鏡像的辦法。

私有鏡像庫

docker安裝了之後,默認就可以從docker公司提供的公共鏡像庫拉取鏡像,也可以提交自己的鏡像。這樣方便是方便,但是有兩個問題。首先docker鏡像庫在國外,雖然國內有不少公司也幫忙做了mirror,但是畢竟還是不方便。其次,如果是商業使用,沒人願意把自己的產品打包的鏡像放在別人的服務器上。
私有鏡像庫就是用來解決這個問題的。這裏也來實際操作一下私有鏡像庫的安裝和使用。既然這個文章是介紹docker的,我們當然是用docker來安裝私有鏡像庫。

安裝

啓動私有鏡像庫:docker run -d -p 5000:5000 -v /data/registry:/var/lib/registry --name registry --restart=always registry
5000端口是registry需要用到的端口,所以需要暴露出來。
數據文件夾照慣例我們也暴露出來,以便後期備份和數據遷移。

使用

假設我們已經build了一個自己的鏡像,叫做testhelloworld。
上傳之前需要把本地的鏡像以及版本號和registry裏面對應
docker tag testhelloworld:0.2 localhost:5000/testhelloworld:0.2

然後纔可以上傳
docker push localhost:5000/testhelloworld:0.2

上傳了之後就可以下載了
docker pull localhost:5000/testhelloworld:0.2

在遠端的服務器上下載

假設安裝了docker registry的服務器ip是192.168.20.5,如果要在其他的服務器上下載,需要執行
docker pull 192.168.20.5:5000/testhelloworld:0.2

這裏要注意一點,docker registry默認是https訪問,所以正常情況下沒有用域名+證書的方式訪問是不行的。解決方法是申明這個registry爲不安全的,方法是編輯docker的配置文件,CentOS下面配置文件在/etc/docker/daemon.json。斜粗體的是需要添加的內容:
{“registry-mirrors”: [“http://86d2a50b.m.daocloud.io”]***,“insecure-registries”: [“192.168.20.5:5000”]***}

介紹一下Portainer

通常使用Linux的人一般都習慣了用命令行操作,但還是有人覺得圖形界面操作起來方便。實際上在一臺安裝好了docker環境的服務器上,日常我們要進行的操作也就查看容器運行狀態,拉取鏡像,運行容器等操作,如果可以圖形化方式執行也挺方便的。Portainer就是這樣的一個工具。
照慣例,用docker的方式來安裝這個工具吧。
docker run --name yportainer -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer:/data portainer/portainer -H unix:///var/run/docker.sock
具體的使用方法網上到處都是,這裏就不細說了。需要強調的是,Portainer只能做單機的docker環境管理,而docker的集羣環境管理就是另一個很大的話題了。

如果這篇文章對你有一點幫助,請點擊右上角的“贊同”。也歡迎留言和我交流。

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