docker入門之映象管理基礎
docker映象管理基礎
首發:arppinging
一、映象概述
1.1 聯合掛載
在之前的文章我們提到過,容器是基於映象啟動的,映象的儲存驅動是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使用的檔案系統。
1.3 映象分層
映象的本身時候只讀的
位於下層的映象稱為父映象(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
和基於容器製作等方式。
2.1 從指定網址獲取映象
預設情況下,docker會在dockerhub.com獲取映象,如果我們要在別的網站獲取映象的話,需要指定。
格式:docker pull <registry>[:port]/[namespace]:<name>:<tag>
在quay.io獲取一個映象
[[email protected] /]# 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
[[email protected] /]#
2.2 基於容器製作映象
在容器上做符合需求的修改,然後構建成新的映象。
命令格式:docker commit [options] container [repository[:tag]]
常用option:-p
:在製作映象的過程中停止執行容器,以防在映象製作的過程中容器有新的檔案寫入,導致檔案不完整。-c
:修改基礎映象的引數-a
:作者
如果沒有填寫repository和tag,預設為Null
2.1.1 基於busybox映象執行容器b1
基於busybox映象執行容器b1,並在b1上建立新的檔案。
[[email protected] /]# 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
/ #
2.1.2 基於容器製作映象
命令格式:docker commit [options] container [repository[:tag]]
開啟另一個視窗,基於b1容器進行映象製作
[[email protected] ~]# docker commit -a arppinging -p b1 web1:v1
sha256:d63a2e64d5d84196356d8bbd9cf46c1e87b904cce3deef6fac2cae61f503b4a6
[[email protected] ~]# 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
[[email protected] ~]#
2.1.3 基於新的映象執行容器
基於新的映象執行容器,檢視增加的檔案是否存在。
[[email protected] ~]# docker run --name b2 -it web1:v1
/ # cat /data/html/index.html
<h1>welcome to arppinging.com<h1>
/ #
2.2 修改映象預設執行命令
映象預設的執行命令類似於自啟動程式一樣,只要我們基於映象啟動容器,那麼容器就會執行該命令。
需要注意的是:如果我們想要一個容器始終處於執行狀態,那麼它必須有程式是在前臺執行的。
2.2.1 檢視映象預設執行的命令
檢視web1:v1 映象預設執行的命令
[[email protected] ~]# 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"
}
}
]
[[email protected] ~]# 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服務的話,需要怎麼做呢?
2.2.2 修改映象的預設命令
修改映象的預設命令(需要重新構建一個映象)
[[email protected] ~]#
[[email protected] ~]# docker commit -a "arppinging <[email protected]>" -c 'CMD ["/bin/httpd","-f","-h","/data/html/"]' -p b1 web1:v2
sha256:1918f7fd1895f3535ab3b6a2a3c6411bdae4173cc85a962f09e07d7e13f9ea7d
[[email protected] ~]#
httpd引數:
-f:在前端執行
-h:指定http的目錄
檢視映象的預設命令是否被修改
[[email protected] ~]# 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 <[email protected]>",
"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
2.2.3 基於新的映象執行容器
基於新的映象執行容器,並驗證httpd服務是否自動開啟。
[[email protected] ~]# docker run --name http_1 web1:v2
由於服務在前端執行,所以啟動了之後會發現命令列無反應。可以開啟另一個視窗使用docker inspet http_1
檢視IP,並使用curl驗證是否能獲取網頁資訊。
[[email protected] ~]# curl 172.17.0.3
<h1>welcome to arppinging.com<h1>
[[email protected] ~]#
三、推送映象
映象製作完成之後,可以將映象推送到映象倉庫。
3.1 阿里雲映象倉庫建立
3.2 根據操作指南將推送映象到阿里雲倉庫
3.2.1 登陸映象倉庫
[[email protected] ~]# 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
[[email protected] ~]#
3.2.2 給映象打符合上傳標準的tag
[[email protected] ~]# 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
[[email protected] ~]# docker tag 1918f7fd1895 registry.cn-hangzhou.aliyuncs.com/arppinging/web:v1
[[email protected] ~]# 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
[[email protected] ~]#
3.2.3 上傳映象
[[email protected] ~]# 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
[[email protected] ~]#
四、匯入和匯出映象
除了將映象推送到倉庫,還可以將映象匯出,拷貝到另一臺主機後再進行匯出。
匯出格式:docker save [option] image [image]
-o
:打包為
[[email protected] ~]# docker save -o test.tar b1:v1.1 b1:v2
[[email protected] ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg test.tar 公共 模板 視訊 圖片 文件 下載 音樂 桌面
[[email protected] ~]#
匯入格式:docker load
-i
:input