前面一篇教程裡面,我們操練了一下如何在一臺伺服器上實際安裝和使用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": ["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的集羣環境管理就是另一個很大的話題了。

如果這篇文章對你有一點幫助,請點擊左下角的「贊同」。也歡迎留言和我交流。


推薦閱讀:
相關文章