?Docker 數(shù)據(jù)卷的管理及自動構(gòu)建docker鏡像
掛載時創(chuàng)建卷
[root@docker01?~]#?docker?run?-d?-p?80:80?-v?/data:/usr/share/nginx/html?nginx:latest
079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09
容器內(nèi)站點目錄:?/usr/share/nginx/html
[root@docker01?~]#?echo?"http://www.nmtui.com"?>/data/index.html
[root@docker01?~]#?curl?10.0.0.100
http://www.nmtui.com
設(shè)置共享卷,使用同一個卷啟動一個新的容器
[root@docker01?~]#?docker?run?-d?-p?8080:80?-v?/data:/usr/share/nginx/html?nginx:latest?
351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42
[root@docker01?~]#?curl?10.0.0.100:8080
http://www.nmtui.com
[root@docker01?~]#?docker?volume?ls
DRIVER??????????????VOLUME?NAME
創(chuàng)建卷后掛載
[root@docker01?~]#?docker?volume?create?
f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
[root@docker01?~]#?docker?volume?ls?
DRIVER??????????????VOLUME?NAME
local???????????????f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
[root@docker01?~]#?docker?volume?ls?
DRIVER??????????????VOLUME?NAME
local???????????????clsn
local???????????????f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
[root@docker01?~]#?docker?volume?inspect?clsn?
[
????{
????????"CreatedAt":?"2018-02-01T00:39:25+08:00",
????????"Driver":?"local",
????????"Labels":?{},
????????"Mountpoint":?"/var/lib/docker/volumes/clsn/_data",
????????"Name":?"clsn",
????????"Options":?{},
????????"Scope":?"local"
????}
]
[root@docker01?~]#?docker?run?-d?-p?9000:80?-v?clsn:/usr/share/nginx/html?nginx:latest?
1434559cff996162da7ce71820ed8f5937fb7c02113bbc84e965845c219d3503
#?宿主機測試
[root@docker01?~]#?echo?'blog.nmtui.com'?>/var/lib/docker/volumes/clsn/_data/index.html?
[root@docker01?~]#?curl?10.0.0.100:9000
blog.nmtui.com
[root@docker01?~]#?docker?run??-d??-P??--volumes-from?079786c1e297?nginx:latest?
b54b9c9930b417ab3257c6e4a8280b54fae57043c0b76b9dc60b4788e92369fb
[root@docker01?~]#?netstat?-lntup?
Active?Internet?connections?(only?servers)
Proto?Recv-Q?Send-Q?Local?Address???????????Foreign?Address?????????State???????PID/Program?name????
tcp????????0??????0?0.0.0.0:22??????????????0.0.0.0:*???????????????LISTEN??????1400/sshd???????????
tcp????????0??????0?10.0.0.100:2375?????????0.0.0.0:*???????????????LISTEN??????26218/dockerd???????
tcp6???????0??????0?:::9000?????????????????:::*????????????????????LISTEN??????32015/docker-proxy??
tcp6???????0??????0?:::8080?????????????????:::*????????????????????LISTEN??????31853/docker-proxy??
tcp6???????0??????0?:::80???????????????????:::*????????????????????LISTEN??????31752/docker-proxy??
tcp6???????0??????0?:::22???????????????????:::*????????????????????LISTEN??????1400/sshd???????????
tcp6???????0??????0?:::32769????????????????:::*????????????????????LISTEN??????32300/docker-proxy??
[root@docker01?~]#?curl?10.0.0.100:32769
http://www.nmtui.com
手動將容器保存為鏡像
本次是基于docker官方centos 6.8?鏡像創(chuàng)建
官方鏡像列表:
https://hub.docker.com/explore/
[root@docker01?~]#?docker?pull??centos:6.8
[root@docker01?~]#?docker?run?-it?-p?1022:22?centos:6.8??/bin/bash
#?在容器種安裝sshd服務(wù),并修改系統(tǒng)密碼
[root@582051b2b92b?~]#?yum?install??openssh-server?-y?
[root@582051b2b92b?~]#?echo?"root:123456"?|chpasswd
[root@582051b2b92b?~]#??/etc/init.d/sshd?start
[root@docker01?~]#?docker?commit?brave_mcclintock??centos6-ssh
[root@docker01?~]#?docker?run?-d??-p?1122:22??centos6-ssh:latest??/usr/sbin/sshd?-D?
5b8161fda2a9f2c39c196c67e2eb9274977e7723fe51c4f08a0190217ae93094
[root@5b8161fda2a9?/]#??yum?install?httpd?-y
[root@5b8161fda2a9?/]#?cat??init.sh?
#!/bin/bash?
/etc/init.d/httpd?start?
/usr/sbin/sshd?-D
[root@5b8161fda2a9?/]#?chmod?+x?init.sh?
#?注意執(zhí)行權(quán)限
[root@docker01?~]#?docker?commit??5b8161fda2a9?centos6-httpd?
sha256:705d67a786cac040800b8485cf046fd57b1828b805c515377fc3e9cea3a481c1
[root@docker01?~]#?docker?run?-d?-p?1222:22?-p?80:80??centos6-httpd?/init.sh?
46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c
Dockerfile自動構(gòu)建docker鏡像
官方構(gòu)建dockerffile文件參考
https://github.com/CentOS/CentOS-Dockerfiles
Dockerfile指令集
基礎(chǔ)鏡像信息?FROM centos:6.8 制作鏡像操作指令RUN yum insatll openssh-server -y 容器啟動時執(zhí)行指令?CMD ["/bin/bash"]
dockerfile常用指令:
FROM 這個鏡像的媽媽是誰?(指定基礎(chǔ)鏡像) MAINTAINER 告訴別人,誰負(fù)責(zé)養(yǎng)它?(指定維護(hù)者信息,可以沒有) RUN?你想讓它干啥(在命令前面加上RUN即可) ADD?給它點創(chuàng)業(yè)資金(COPY文件,會自動解壓) WORKDIR?我是cd,今天剛化了妝(設(shè)置當(dāng)前工作目錄) VOLUME?給它一個存放行李的地方(設(shè)置卷,掛載主機目錄) EXPOSE?它要打開的門是啥(指定對外的端口) CMD 奔跑吧,兄弟?。ㄖ付ㄈ萜鲉雍蟮囊傻氖虑椋?/span>
COPY?復(fù)制文件 ENV??環(huán)境變量 ENTRYPOINT??容器啟動后執(zhí)行的命令
創(chuàng)建一個Dockerfile
#?創(chuàng)建目錄
[root@docker01?base]#?cd?/opt/base
#?創(chuàng)建Dcokerfile文件,注意大小寫
[root@docker01?base]#?vim?Dockerfile
FROM?centos:6.8
RUN?yum?install?openssh-server?-y?
RUN?echo?"root:123456"?|chpasswd
RUN?/etc/init.d/sshd?start?
CMD?["/usr/sbin/sshd","-D"]
[root@docker01?base]#?docker?image?build??-t?centos6.8-ssh?.?
-t?為鏡像標(biāo)簽打標(biāo)簽??.?表示當(dāng)前路徑
[root@docker01?base]#?docker?run??-d?-p?2022:22?centos6.8-ssh-b?
dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a
使用Dcokerfile安裝kodexplorer
FROM?centos:6.8
RUN?yum?install?wget?unzip?php?php-gd?php-mbstring?-y?&&?yum?clean?all
#?設(shè)置工作目錄,之后的操作都在這個目錄中
WORKDIR?/var/www/html/
RUN?wget?-c?http://static.kodcloud.com/update/download/kodexplorer4.25.zip
RUN?unzip?kodexplorer4.25.zip?&&?rm?-f?kodexplorer4.25.zip
RUN?chown?-R?apache.apache?.
CMD?["/usr/sbin/apachectl","-D","FOREGROUND"]
更多的Dockerfile可以參考官方方法。
Docker中的鏡像分層
參考文檔:
http://www.maiziedu.com/wiki/cloud/dockerimage/
Docker 支持通過擴展現(xiàn)有鏡像,創(chuàng)建新的鏡像。實際上,Docker Hub 中 99%?的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構(gòu)建出來的。

?
從上圖可以看到,新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個軟件,就在現(xiàn)有鏡像的基礎(chǔ)上增加一層。
Docker?鏡像為什么分層
鏡像分層最大的一個好處就是共享資源。
比如說有多個鏡像都從相同的 base 鏡像構(gòu)建而來,那么 Docker Host 只需在磁盤上保存一份 base 鏡像;同時內(nèi)存中也只需加載一份 base 鏡像,就可以為所有容器服務(wù)了。而且鏡像的每一層都可以被共享。
如果多個容器共享一份基礎(chǔ)鏡像,當(dāng)某個容器修改了基礎(chǔ)鏡像的內(nèi)容,比如?/etc 下的文件,這時其他容器的?/etc 是不會被修改的,修改只會被限制在單個容器內(nèi)。這就是容器 Copy-on-Write 特性。
可寫的容器層
當(dāng)容器啟動時,一個新的可寫層被加載到鏡像的頂部。這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。

?
所有對容器的改動?-?無論添加、刪除、還是修改文件都只會發(fā)生在容器層中。只有容器層是可寫的,容器層下面的所有鏡像層都是只讀的。
容器層的細(xì)節(jié)說明
鏡像層數(shù)量可能會很多,所有鏡像層會聯(lián)合在一起組成一個統(tǒng)一的文件系統(tǒng)。如果不同層中有一個相同路徑的文件,比如?/a,上層的?/a 會覆蓋下層的?/a,也就是說用戶只能訪問到上層中的文件?/a。在容器層中,用戶看到的是一個疊加之后的文件系統(tǒng)。
文件操作的

只有當(dāng)需要修改時才復(fù)制一份數(shù)據(jù),這種特性被稱作 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會對鏡像本身進(jìn)行任何修改。
這樣就解釋了我們前面提出的問題:容器層記錄對鏡像的修改,所有鏡像層都是只讀的,不會被容器修改,所以鏡像可以被多個容器共享。
