Docker所宣稱的用戶能夠爲所欲爲地「Build、Ship and Run」應用的能力,其核心是由Docker image來支撐的。Docker經過把應用運行時的環境和應用打包在一塊兒,解決了環境部署依賴的問題,經過引入分層文件系統的概念,解決了空間利用的問題。html
Docker 鏡像(Image)就是一個只讀的模板。例如:一個鏡像能夠包含一個完整的操做系統環境,裏面僅安裝了 Apache 或用戶須要的其它應用程序。鏡像能夠用來建立 Docker 容器,一個鏡像能夠建立不少容器。Docker 提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。node
Docker鏡像含有啓動容器所須要的文件系統及其內容,Docker採用分層構建機制,最底層爲bootfs,其之爲rootfs。nginx
bootfs:用於系統引導的文件系統,包括BootLoader和kernel,容器啓動完成後會被卸載以節約內存資源redis
rootfs:位於bootfs之上,表現爲Docker容器的根文件系統。傳統模式中,系統啓動時內核掛載rootfs時會首先將其掛載爲「只讀」模式,完整性自檢後將其從新掛載爲讀寫模式。Docker中,rootfs由內核掛載爲「只讀」模式,然後經過「聯合掛載」技術額外掛載一個「可寫」層。docker
倉庫(Repository)是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。倉庫的名字一般由兩部分組成,中間以斜線分開,斜線以前是用戶名,斜線以後是鏡像名。json
倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括阿里雲、網易雲 和時速雲等,能夠提供大陸用戶更穩定快速的訪問。固然,用戶也能夠在本地網絡內建立一個私有倉庫。服務器
Docker Registry 拉取鏡像網絡
當用戶建立了本身的鏡像以後就可使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另一臺機器上使用這個鏡像時候,只須要從倉庫上 pull 下來就能夠了。app
啓動容器時,docker daemon會試圖從本地獲取相關的鏡像,本地鏡像不存在時,其將從Registry中下載鏡像並保持到本地。curl
[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
[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
[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
[root@node101 ~]# docker run --name b2 –it –d --rm busybox / # ls bin dev etc home proc root sys tmp usr var
命令註釋:
[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>
命令註釋:
[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/進行查看。
[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
聯合文件系統這種思想由來已久,這類文件系統會把多個目錄(可能對應不一樣的文件系統—)掛載到同一個目錄,對外呈現這些目錄的聯合。
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和Device Mapper的應用最爲普遍,支持也相對成熟,推薦生產環境考慮。長期來看,OverlayFS將可能具備更好的特性。
寫時複製docker 鏡像使用了寫時複製(copy-on-write)的策略,在多個容器之間共享鏡像,每一個容器在啓動的時候並不須要單獨複製一份鏡像文件,而是將全部鏡像層以只讀的方式掛載到一個掛載點,再在上面覆蓋一個可讀寫的容器層。在未更改文件內容時,全部容器共享同一份數據,只有在 docker 容器運行過程當中文件系統發生變化時,纔會把變化的文件內容寫到可讀寫層,並隱藏只讀層中的老版本文件。寫時複製配合分層機制減小了鏡像對磁盤空間的佔用和容器啓動時間。