Docker 鏡像管理

1、概念

        Docker所宣稱的用戶能夠爲所欲爲地「Build、Ship and Run」應用的能力,其核心是由Docker image來支撐的。Docker經過把應用運行時的環境和應用打包在一塊兒,解決了環境部署依賴的問題,經過引入分層文件系統的概念,解決了空間利用的問題。html

       Docker 鏡像(Image)就是一個只讀的模板。例如:一個鏡像能夠包含一個完整的操做系統環境,裏面僅安裝了 Apache 或用戶須要的其它應用程序。鏡像能夠用來建立 Docker 容器,一個鏡像能夠建立不少容器。Docker 提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。node

1.一、docker鏡像文件系統

       image Docker鏡像含有啓動容器所須要的文件系統及其內容,Docker採用分層構建機制,最底層爲bootfs,其之爲rootfs。nginx

        bootfs:用於系統引導的文件系統,包括BootLoader和kernel,容器啓動完成後會被卸載以節約內存資源redis

        rootfs:位於bootfs之上,表現爲Docker容器的根文件系統。傳統模式中,系統啓動時內核掛載rootfs時會首先將其掛載爲「只讀」模式,完整性自檢後將其從新掛載爲讀寫模式。Docker中,rootfs由內核掛載爲「只讀」模式,然後經過「聯合掛載」技術額外掛載一個「可寫」層。docker

1.二、Docker Repository

         倉庫(Repository)是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。倉庫的名字一般由兩部分組成,中間以斜線分開,斜線以前是用戶名,斜線以後是鏡像名。json

         倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括阿里雲、網易雲 和時速雲等,能夠提供大陸用戶更穩定快速的訪問。固然,用戶也能夠在本地網絡內建立一個私有倉庫。image服務器

Docker Registry 拉取鏡像網絡

         當用戶建立了本身的鏡像以後就可使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另一臺機器上使用這個鏡像時候,只須要從倉庫上 pull 下來就能夠了。app

        啓動容器時,docker daemon會試圖從本地獲取相關的鏡像,本地鏡像不存在時,其將從Registry中下載鏡像並保持到本地。curl

2、Docker image操做

2.一、列出本機的鏡像

[root@node101 ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.2                bf9bf96e4572        25 hours ago        1.16MB
yxr877431436/httpd       v0.1                a257de8b352a        25 hours ago        1.16MB
nginx                    1.14-alpine         14d4a58e0d2e        6 days ago          17.4MB
redis                    latest              e1a73233e3be        13 days ago         83.4MB
nginx                    latest              06144b287844        13 days ago         109MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB

2.二、建立一個鏡像

[root@node101 ~]# docker pull nginx   #能夠直接pull鏡像,默認pull的版本是latest版本
Using default tag: latest
latest: Pulling from library/nginx
802b00ed6f79: Already exists 
e9d0e0ea682b: Pull complete 
d8b7092b9221: Pull complete 
Digest: sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
Status: Downloaded newer image for nginx:latest
[root@node101 ~]# docker pull nginx:1.14-alpine
1.14-alpine: Pulling from library/nginx
c67f3896b22c: Pull complete 
428de5b8d58a: Pull complete 
7efd417f3e28: Pull complete 
61a56b170416: Pull complete 
Digest: sha256:f87de4bf7449cd23fd484a130e5b1b329ae75dd736576550f9bdff0d70bc3dcb
Status: Downloaded newer image for nginx:1.14-alpine

2.三、刪除一個鏡像

[root@node101 ~]# docker image rm nginx 
Untagged: nginx:latest
Untagged: nginx@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
Deleted: sha256:06144b2878448774e55577ae7d66b5f43a87c2e44322b3884e4e6c70d070b262
Deleted: sha256:824a442ee3c96744d75be3737a22cc6a47aebad1b30be67f3c2f8f29cb0aa879
Deleted: sha256:8e3d1e9e4945f930c93c30617512998437f6edafd86676770d29b1581f2520bb
[root@node101 ~]# docker image rm nginx:1.14-alpine 
Untagged: nginx:1.14-alpine
Untagged: nginx@sha256:f87de4bf7449cd23fd484a130e5b1b329ae75dd736576550f9bdff0d70bc3dcb
Deleted: sha256:14d4a58e0d2e63431ccac050e4294bd92df76aba8864f5f201ee293797febf79
Deleted: sha256:e14286135e32e2b62ac9781215a212834d212e3c106c5b2afd28a099448e5ae6
Deleted: sha256:e6b2d19e9d67586b7562c319716029b04d5817bbd2716031e99a1147e6a9cb56
Deleted: sha256:6298dc8d140a4afb31b20b40e5f39955986aae3b744b3f372d1bd2c8a724954a
Deleted: sha256:ebf12965380b39889c99a9c02e82ba465f887b45975b6e389d42e9e6a3857888

2.四、建立一個容器

[root@node101 ~]# docker run --name b2 –it –d --rm busybox 
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var

命令註釋

  • -it : 進行交互式操做
  • -d : 等同於 -d=true,容器將會在後臺運行,否則執行一次命令後,退出後,即是exit狀態了。
  • --name : 容器啓動後的名字,默認不指定,將會隨機產生一個名字。或者使用 -name="containers_name"
  • --rm:退出刪除容器
  • busybox:使用的鏡像名稱

2.五、基於容器製做鏡像

[root@node101 ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
nginx                    1.14-alpine         14d4a58e0d2e        5 days ago          17.4MB
redis                    latest              e1a73233e3be        12 days ago         83.4MB
nginx                    latest              06144b287844        12 days ago         109MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
[root@node101 ~]# docker run --name b1 -it busybox
/ # mkdir /data/html -p
/ # vi data/html/index.html
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # read escape sequence
[root@node101 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fb101638ecd7        busybox             "sh"                5 minutes ago       Up 5 minutes                            b1
[root@node101 ~]# docker commit -p b1 yxr877431436/httpd:v0.1 
sha256:a257de8b352a1cb7f42232360ccc1ae93b5149d5e0320b95b7cef9e28ec0e05e
[root@node101 ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.1                a257de8b352a        10 seconds ago      1.16MB
nginx                    1.14-alpine         14d4a58e0d2e        5 days ago          17.4MB
redis                    latest              e1a73233e3be        12 days ago         83.4MB
nginx                    latest              06144b287844        12 days ago         109MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
[root@node101 ~]# docker commit -a "Saviorsyang <Saviorsyang@Gmail.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 yxr877431436/httpd:v0.2
sha256:bf9bf96e457276b504151736b59356a9355e606840c5d978e88342f5ce0f6aa1
[root@node101 ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.2                bf9bf96e4572        4 seconds ago       1.16MB
yxr877431436/httpd       v0.1                a257de8b352a        12 minutes ago      1.16MB
nginx                    1.14-alpine         14d4a58e0d2e        5 days ago          17.4MB
redis                    latest              e1a73233e3be        12 days ago         83.4MB
nginx                    latest              06144b287844        12 days ago         109MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
[root@node101 ~]# docker run --name t1 yxr877431436/httpd:v0.2
[root@node101 ~]# docker inspect t1
[root@node101 ~]# curl 172.17.0.3
<h1>Welcome to busybox...</h1>

命令註釋:

  • -a :提交的鏡像做者;
  • -c :使用Dockerfile指令來建立鏡像;
  • -m :提交時的說明文字;
  • -p :在commit時,將容器暫停。

2.六、鏡像上傳至docker hub

[root@node101 ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: yxr877431436
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
[root@node101 ~]# docker push yxr877431436/httpd:v0.2
The push refers to repository [docker.io/yxr877431436/httpd]
7a6545b4aa0f: Pushed 
f9d9e4e6e2f0: Mounted from library/busybox 
v0.2: digest: sha256:6aedc15d85442cb7b054d582a1518d22bd95c5a4716dfce88271c300b010df51 size: 734

       上傳成功以後,能夠登陸https://hub.docker.com/進行查看。

image

2.七、鏡像導入和導出

[root@node101 ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.2                bf9bf96e4572        25 hours ago        1.16MB
yxr877431436/httpd       v0.1                a257de8b352a        25 hours ago        1.16MB
redis                    latest              e1a73233e3be        13 days ago         83.4MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
[root@node101 ~]# docker save -o redis.gz redis
[root@node101 ~]# ls
anaconda-ks.cfg  redis.gz  
[root@node101 ~]# docker image rm redis
Untagged: redis:latest
Untagged: redis@sha256:b77926b30ca2f126431e4c2055efcf2891ebd4b4c4a86a53cf85ec3d4c98a4c9
Deleted: sha256:e1a73233e3beffea70442fc2cfae2c2bab0f657c3eebb3bdec1e84b6cc778b75
Deleted: sha256:f9db21ff8c82fc37f90caf90a7aee8155217522ad8c59fbfe370a3e3875e3ba8
Deleted: sha256:e8237a63680e91814c2187d36bf877b77bcdbe32f039e3830b971899ba3d9066
Deleted: sha256:ee3e8a7f98978d885f024af810e81c5111010a5ad04a506e108b8164c14ecc53
Deleted: sha256:19261f688dac95e95c456e918a4374328ce0f6e3fbccd8b8bf2aaf7fa64caf8f
Deleted: sha256:8a43eb91122ffb8c673e3c1c8191ef02af80d23b14758d3be28a09631bb8ec14
Deleted: sha256:8b15606a9e3e430cb7ba739fde2fbb3734a19f8a59a825ffa877f9be49059817
[root@node101 ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.2                bf9bf96e4572        25 hours ago        1.16MB
yxr877431436/httpd       v0.1                a257de8b352a        25 hours ago        1.16MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
[root@node101 ~]# docker load -i redis.gz 
8b15606a9e3e: Loading layer [==================================================>]  58.44MB/58.44MB
d98fb630fb3b: Loading layer [==================================================>]  338.4kB/338.4kB
714e32c05337: Loading layer [==================================================>]  3.033MB/3.033MB
a3514b4102be: Loading layer [==================================================>]  24.84MB/24.84MB
21497520b817: Loading layer [==================================================>]  1.536kB/1.536kB
685379d1594c: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: redis:latest
[root@node101 ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.2                bf9bf96e4572        25 hours ago        1.16MB
yxr877431436/httpd       v0.1                a257de8b352a        25 hours ago        1.16MB
redis                    latest              e1a73233e3be        13 days ago         83.4MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB

3、Docker image擴展知識

3.一、聯合掛載

        聯合文件系統這種思想由來已久,這類文件系統會把多個目錄(可能對應不一樣的文件image系統—)掛載到同一個目錄,對外呈現這些目錄的聯合。

        Docker聯合文件系統Union File System,它是實現Docker鏡像的技術基礎,是一種輕量級的高性能分層文件系統,支持將文件系統中的修改進行提交和層層疊加,這個特性使得鏡像能夠經過分層實現和繼承。同時支持將不一樣目錄掛載到同一個虛擬文件系統下。在Docker鏡像分爲基礎鏡像和父鏡像,沒有父鏡像的鏡像被稱爲基礎鏡像。用戶是基於基礎鏡像來製做各類不一樣的應用鏡像。這些應用鏡像共享同一個基礎鏡像層,提升了存儲效率。

        Docker 中使用的 AUFS(AnotherUnionFS)就是一種聯合文件系統。 AUFS 支持爲每個成員目錄(相似 Git 的分支)設定只讀(readonly)、讀寫(readwrite)和寫出(whiteout-able)權限, 同時 AUFS 裏有一個相似分層的概念, 對只讀權限的分支能夠邏輯上進行增量地修改(不影響只讀部分的)。

Docker目前支持的聯合文件系統種類包括AUFS、OverlayFS、btrfs、vfs、zfs和Device Mapper等。

  • AUFS:最先支持的文件系統,對Debian/Ubuntu支持好,雖然沒有合併到Linux內核中,但成熟度很高;
  • OverlayFS:相似於AUFS,性能更好一些,已經合併到內核,將來會取代AUFS,但成熟度有待提升;
  • Device Mapper:Redhat公司和Docker團隊一塊兒開發用於支持RHEL的文件系統,內核支持,性能略慢,成熟度高;
  • btrfs:參考zfs等特性設計的文件系統,由Linux社區開發,試圖將來取代Device Mapper,成熟度有待提升;
  • vfs:基於普通文件系統(ext、nfs等)的中間層抽象,性能差,比較佔用空間,成熟度也通常。
  • zfs:最初設計爲Solaris 10上的寫時文件系統,擁有很多好的特性,但對Linux支持還不夠成熟。
  • 總結一下,AUFS和Device Mapper的應用最爲普遍,支持也相對成熟,推薦生產環境考慮。長期來看,OverlayFS將可能具備更好的特性。

    3.二、寫時複製(COW)

      寫時複製docker 鏡像使用了寫時複製(copy-on-write)的策略,在多個容器之間共享鏡像,每一個容器在啓動的時候並不須要單獨複製一份鏡像文件,而是將全部鏡像層以只讀的方式掛載到一個掛載點,再在上面覆蓋一個可讀寫的容器層。在未更改文件內容時,全部容器共享同一份數據,只有在 docker 容器運行過程當中文件系統發生變化時,纔會把變化的文件內容寫到可讀寫層,並隱藏只讀層中的老版本文件。寫時複製配合分層機制減小了鏡像對磁盤空間的佔用和容器啓動時間。

    相關文章
    相關標籤/搜索