您好,登錄后才能下訂單哦!
本篇內容主要講解“docker鏡像管理基礎以及鏡像的制作方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“docker鏡像管理基礎以及鏡像的制作方法”吧!
首發:arppinging
在之前的文章我們提到過,容器是基于鏡像啟動的,鏡像的存儲驅動是overlay2
overlayFS
將單個Linux主機上的兩個目錄合成一個目錄,這些目錄稱為層
,統一過程被稱為聯合掛載。
下圖是一個docker鏡像和docke容器的分層圖,docker鏡像是lowdir,docker容器是upperdir。而統一的視圖層是merged層。
如果一個鏡像有多層的話,那么它的啟動過程需要進行聯合掛載
,如下圖,centos被稱為基礎鏡像(base image)
,在基礎鏡像上安裝了nginx,形成新的層
。如果基于鏡像進行啟動,啟動的順序應該為centos-->nginx,因為nginx的文件依賴于centos,如果基礎鏡像沒有啟動,那么上面的層就沒有可以使用的文件系統,所以,必須要centos啟動并掛載了文件系統之后,nginx才能啟動和使用文件系統。
鏡像的分層構建和聯合掛載都依賴于專用的文件系統支撐。
docker可使用的文件系統有:aufs
、overlayFS
、btrfs
、devicemapper(dm)
。
不同系統默認支持的文件系統也不一樣,比如ubuntu
默認使用的是aufs
,centos 7
上,使用的是devicemapper
,在內核版本為3.18之后,使用的是overlayfs
。其中devicemapper(dm)
也是linux中lvm使用的文件系統。
鏡像的本身時候只讀的
位于下層的鏡像稱為父鏡像(parent image)
,最底層的稱為基礎鏡像(base image)
,當基于鏡像運行容器的時候,最上層的為可寫層
,其下的均為只讀層
。所有的寫操作只能在最上面的wirtable
寫入,一旦刪除容器,可寫層 wirtable
的數據也會一并被刪除。
docker鏡像包含有啟動容器所需要的文件系統及其內容,因此,其用于創建并啟動docker容器。
docker采用分層的構建機制,最底層為bootfs
(引導文件系統),其之為rootfs
。
bootfs
:用于系統引導的文件系統,包括bootloader
和kernel
,容器啟動后會自動卸載(并非刪除)以節省資源。所以bootfs
僅僅用于引導文件系統。
rootfs
:位于bootfs之上,表現為docker容器的根文件系統(/目錄及其子目錄)
在傳統模式中(完整的操作系統),系統啟動時,內核掛載rootfs
時會首先掛載為只讀
模式,完整性自檢完成后將其重新掛載為讀寫
模式。而在docker中,rootfs
由內核掛載為只讀
模式,而后通過聯合掛載
技術額外掛載一個可寫層
。
鏡像制作的有automated build
、docker file
和基于容器制作等方式。
默認情況下,docker會在dockerhub.com獲取鏡像,如果我們要在別的網站獲取鏡像的話,需要指定。
格式:docker pull <registry>[:port]/[namespace]:<name>:<tag>
在quay.io獲取一個鏡像
[root@node1 /]# docker pull quay.io/coreos/flannel:v0.10.0-amd64 v0.10.0-amd64: Pulling from coreos/flannel ff3a5c916c92: Pull complete 8a8433d1d437: Pull complete 306dc0ee491a: Pull complete 856cbd0b7b9c: Pull complete af6d1e4decc6: Pull complete Digest: sha256:88f2b4d96fae34bfff3d46293f7f18d1f9f3ca026b4a4d288f28347fcb6580ac Status: Downloaded newer image for quay.io/coreos/flannel:v0.10.0-amd64 [root@node1 /]#
在容器上做符合需求的修改,然后構建成新的鏡像。
命令格式:docker commit [options] container [repository[:tag]]
常用option:-p
:在制作鏡像的過程中停止運行容器,以防在鏡像制作的過程中容器有新的文件寫入,導致文件不完整。-c
:修改基礎鏡像的參數-a
:作者
如果沒有填寫repository和tag,默認為Null
基于busybox鏡像運行容器b1,并在b1上創建新的文件。
[root@node1 /]# docker run --name b1 -it busybox / # ls bin dev etc home proc root sys tmp usr var / # mkdir /data/html/ / # mkdir -p /data/html/ / # vi /data/html/index.html / #
命令格式:docker commit [options] container [repository[:tag]]
打開另一個窗口,基于b1容器進行鏡像制作
[root@node1 ~]# docker commit -a arppinging -p b1 web1:v1 sha256:d63a2e64d5d84196356d8bbd9cf46c1e87b904cce3deef6fac2cae61f503b4a6 [root@node1 ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE web1 v1 d63a2e64d5d8 5 seconds ago 1.15MB nginx 1.14-alpine 77bae8d00654 5 weeks ago 17.7MB redis 4-alpine 05097a3a0549 2 months ago 30MB busybox latest 59788edf1f3e 2 months ago 1.15MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 10 months ago 44.6MB [root@node1 ~]#
基于新的鏡像運行容器,查看增加的文件是否存在。
[root@node1 ~]# docker run --name b2 -it web1:v1 / # cat /data/html/index.html <h2>welcome to arppinging.com<h2> / #
鏡像默認的執行命令類似于自啟動程序一樣,只要我們基于鏡像啟動容器,那么容器就會運行該命令。
需要注意的是:如果我們想要一個容器始終處于運行狀態,那么它必須有程序是在前臺運行的。
查看web1:v1 鏡像默認執行的命令
[root@node1 ~]# docker inspect web1:v1 | more [ { "Id": "sha256:d63a2e64d5d84196356d8bbd9cf46c1e87b904cce3deef6fac2cae61f503b4a6", "RepoTags": [ "web1:v1" ], "RepoDigests": [], "Parent": "sha256:59788edf1f3e78cd0ebe6ce1446e9d10788225db3dedcfd1a59f764bad2b2690", "Comment": "", "Created": "2018-12-16T03:43:22.600775608Z", "Container": "2e45357a5285dc8465c6273f9969f0168e55b03455e16c23a4793aef8cb811e7", "ContainerConfig": { "Hostname": "2e45357a5285", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "sh" ], "ArgsEscaped": true, "Image": "busybox", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "18.09.0", "Author": "arppinging", "Config": { "Hostname": "2e45357a5285", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "sh" ], "ArgsEscaped": true, "Image": "busybox", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "Architecture": "amd64", "Os": "linux", "Size": 1154454, "VirtualSize": 1154454, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/294014f41c7dd6e411b4dcf7cebfc8762cdf32b74d49ce58413ca311d21bf7b1 /diff", "MergedDir": "/var/lib/docker/overlay2/8afb453743527c6b9472a9d585d1725212d64fa582bcc58558e793dc01cb211 9/merged", "UpperDir": "/var/lib/docker/overlay2/8afb453743527c6b9472a9d585d1725212d64fa582bcc58558e793dc01cb2119 /diff", "WorkDir": "/var/lib/docker/overlay2/8afb453743527c6b9472a9d585d1725212d64fa582bcc58558e793dc01cb2119/ work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:8a788232037eaf17794408ff3df6b922a1aedf9ef8de36afdae3ed0b0381907b", "sha256:3b385ace78f4f55bf74f7c9964870173820b06bd1c0d5fbe55da9314d141c5cc" ] }, "Metadata": { "LastTagTime": "2018-12-16T11:43:22.602292651+08:00" } } ] [root@node1 ~]# docker inspect web1:v1 [ { "Id": "sha256:d63a2e64d5d84196356d8bbd9cf46c1e87b904cce3deef6fac2cae61f503b4a6", "RepoTags": [ "web1:v1" ], "RepoDigests": [], "Parent": "sha256:59788edf1f3e78cd0ebe6ce1446e9d10788225db3dedcfd1a59f764bad2b2690", "Comment": "", "Created": "2018-12-16T03:43:22.600775608Z", "Container": "2e45357a5285dc8465c6273f9969f0168e55b03455e16c23a4793aef8cb811e7", "ContainerConfig": { "Hostname": "2e45357a5285", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "sh" ], "ArgsEscaped": true, "Image": "busybox", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "18.09.0", "Author": "arppinging", "Config": { "Hostname": "2e45357a5285", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "sh" ], "ArgsEscaped": true, "Image": "busybox", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "Architecture": "amd64", "Os": "linux", "Size": 1154454, "VirtualSize": 1154454, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/294014f41c7dd6e411b4dcf7cebfc8762cdf32b74d49ce58413ca311d21bf7b1/diff", "MergedDir": "/var/lib/docker/overlay2/8afb453743527c6b9472a9d585d1725212d64fa582bcc58558e793dc01cb2119/merged", "UpperDir": "/var/lib/docker/overlay2/8afb453743527c6b9472a9d585d1725212d64fa582bcc58558e793dc01cb2119/diff", "WorkDir": "/var/lib/docker/overlay2/8afb453743527c6b9472a9d585d1725212d64fa582bcc58558e793dc01cb2119/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:8a788232037eaf17794408ff3df6b922a1aedf9ef8de36afdae3ed0b0381907b", "sha256:3b385ace78f4f55bf74f7c9964870173820b06bd1c0d5fbe55da9314d141c5cc" ] }, "Metadata": { "LastTagTime": "2018-12-16T11:43:22.602292651+08:00" } } ]
可以看到其“Cmd”為sh,那如果我們想要將鏡像默認的命令改為在前臺運行httpd服務的話,需要怎么做呢?
修改鏡像的默認命令(需要重新構建一個鏡像)
[root@node1 ~]# [root@node1 ~]# docker commit -a "arppinging <admin@arppinging.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html/"]' -p b1 web1:v2 sha256:1918f7fd1895f3535ab3b6a2a3c6411bdae4173cc85a962f09e07d7e13f9ea7d [root@node1 ~]#
httpd參數:
-f:在前端運行
-h:指定http的目錄
查看鏡像的默認命令是否被修改
[root@node1 ~]# docker inspect web1:v2 | less [ { "Id": "sha256:1918f7fd1895f3535ab3b6a2a3c6411bdae4173cc85a962f09e07d7e13f9ea7d", "RepoTags": [ "web1:v2" ], "RepoDigests": [], "Parent": "sha256:59788edf1f3e78cd0ebe6ce1446e9d10788225db3dedcfd1a59f764bad2b2690", "Comment": "", "Created": "2018-12-16T03:58:21.298236626Z", "Container": "2e45357a5285dc8465c6273f9969f0168e55b03455e16c23a4793aef8cb811e7", "ContainerConfig": { "Hostname": "2e45357a5285", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "sh" ], "ArgsEscaped": true, "Image": "busybox", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "18.09.0", "Author": "arppinging <admin@arppinging.com>", "Config": { "Hostname": "2e45357a5285", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/httpd", "-f", "-h", "/data/html/" ], "ArgsEscaped": true, "Image": "busybox", "Volumes": null, "WorkingDir": "",
可以看到cmd已經被修改為/bin/httpd -f -g /data/html
基于新的鏡像運行容器,并驗證httpd服務是否自動開啟。
[root@node1 ~]# docker run --name http_1 web1:v2
由于服務在前端運行,所以啟動了之后會發現命令行無反應。可以打開另一個窗口使用docker inspet http_1
查看IP,并使用curl驗證是否能獲取網頁信息。
[root@node1 ~]# curl 172.17.0.3 <h2>welcome to arppinging.com<h2> [root@node1 ~]#
鏡像制作完成之后,可以將鏡像推送到鏡像倉庫。
http://dev.aliyun.com/
[root@node1 ~]# docker login --username=tb7595138 registry.cn-hangzhou.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 [root@node1 ~]#
[root@node1 ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE web1 v2 1918f7fd1895 37 minutes ago 1.15MB web1 v1 d63a2e64d5d8 About an hour ago 1.15MB nginx 1.14-alpine 77bae8d00654 5 weeks ago 17.7MB redis 4-alpine 05097a3a0549 2 months ago 30MB busybox latest 59788edf1f3e 2 months ago 1.15MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 10 months ago 44.6MB [root@node1 ~]# docker tag 1918f7fd1895 registry.cn-hangzhou.aliyuncs.com/arppinging/web:v1 [root@node1 ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE web1 v2 1918f7fd1895 38 minutes ago 1.15MB registry.cn-hangzhou.aliyuncs.com/arppinging/web v1 1918f7fd1895 38 minutes ago 1.15MB web1 v1 d63a2e64d5d8 About an hour ago 1.15MB nginx 1.14-alpine 77bae8d00654 5 weeks ago 17.7MB redis 4-alpine 05097a3a0549 2 months ago 30MB busybox latest 59788edf1f3e 2 months ago 1.15MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 10 months ago 44.6MB [root@node1 ~]#
[root@node1 ~]# docker push registry.cn-hangzhou.aliyuncs.com/arppinging/web:v1 The push refers to repository [registry.cn-hangzhou.aliyuncs.com/arppinging/web] 3b385ace78f4: Pushed 8a788232037e: Pushed v1: digest: sha256:1ca7a59ca0a034a44be13bea08fbce5984a20f92cf0243c69984bbb5f84a22bb size: 734 [root@node1 ~]#
除了將鏡像推送到倉庫,還可以將鏡像導出,拷貝到另一臺主機后再進行導出。
導出格式:docker save [option] image [image]
-o
:打包為
[root@node1 ~]# docker save -o test.tar b1:v1.1 b1:v2 [root@node1 ~]# ls anaconda-ks.cfg initial-setup-ks.cfg test.tar 公共 模板 視頻 圖片 文檔 下載 音樂 桌面 [root@node1 ~]#
導入格式:docker load
-i
:input
到此,相信大家對“docker鏡像管理基礎以及鏡像的制作方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。