如何自己用wordpress建網(wǎng)站黑龍seo網(wǎng)站優(yōu)化
docker分層結(jié)構(gòu)
如圖所示,容器是由最上面可讀可寫的容器層,以及若干個(gè)只讀鏡像層組成,創(chuàng)建容器時(shí),容器中的 數(shù)據(jù)都來(lái)自鏡像層。這樣的分層機(jī)構(gòu)最大的特點(diǎn)是寫時(shí)復(fù)制:
1、容器中新生成的數(shù)據(jù)會(huì)直接存放在容器層,也可以稱之為可寫層。
2、修改容器中現(xiàn)有的數(shù)據(jù)會(huì)先從鏡像層將數(shù)據(jù)復(fù)制到容器層,修改后的數(shù)據(jù)就會(huì)直接保存在容器層,而鏡像層數(shù)據(jù)不會(huì)有任何變化。
3、如果多個(gè)鏡像層中有相同的命名文件,在容器層只會(huì)看到最上面鏡像層的內(nèi)容。
聯(lián)合掛載技術(shù)?
Docke鏡像采用這種分層構(gòu)建設(shè)計(jì),能使鏡像結(jié)構(gòu)和容器的創(chuàng)建,共享和分發(fā)變得非常高效,每個(gè)鏡 像層可以稱之為layer,這些layer被存放在了/var/lib/docker/volume//目錄下,這里 的storage-driver可以有很多種,比如AUFS、OverlayFS、VFS、Brtfs等??梢酝ㄟ^(guò)docker info命令查 看存儲(chǔ)驅(qū)動(dòng),通常Ubuntu類的系統(tǒng)默認(rèn)采用的是AUFS,Centos7.1+系列采用的是OverlayFS。
OverlayFS是一種堆疊文件系統(tǒng),它依賴并建立在其它的文件系統(tǒng)之上(例如ext4fs和xfs等等),并 不直接參與磁盤空間結(jié)構(gòu)的劃分,僅僅將原來(lái)底層文件系統(tǒng)中不同的目錄進(jìn)行合并,然后向用戶呈現(xiàn),這 也就是聯(lián)合掛載技術(shù),如圖所示。 而Linux內(nèi)核為Docker提供的OverlayFS驅(qū)動(dòng)有兩種:overlay和 overlay2。而overlay2是相對(duì)于overlay的一種改進(jìn),在inode利用率方面比overlay更有效。但是overlay 有環(huán)境需求:Docker版本17.06.02+,宿主機(jī)文件系統(tǒng)需要是ext4或xfs格式。
data volume?
默認(rèn)情況下,在容器內(nèi)創(chuàng)建的所有文件都存儲(chǔ)在可寫容器層上。這意味著,當(dāng)該容器不再存在時(shí),數(shù) 據(jù)將不會(huì)持久保存,并且如果另一個(gè)進(jìn)程需要它,則可能很難從容器中取出數(shù)據(jù)。為了能夠保存持久化數(shù) 據(jù),Docker提出了volume的概念。
為了能夠保存持久化數(shù)據(jù),Docker提出了volume的概念。簡(jiǎn)單來(lái)說(shuō),volume就是目錄或者文件, 它可以繞過(guò)默認(rèn)的聯(lián)合文件系統(tǒng),而以正常的文件或者目錄的形式存在于Docker Host文件系統(tǒng)上。 Docker為容器提供了兩個(gè)選項(xiàng)來(lái)將文件存儲(chǔ)在主機(jī)中,以便即使容器停止后文件也可以持久存儲(chǔ)。
Volume類型: – Bind mounts 宿主機(jī)——》容器 – Docker managed volume 容器——》宿主機(jī)
?bind mounts
Bind mounts只需要在創(chuàng)建容器時(shí),使用-v參數(shù)指明Docker host目錄或文件和容器目錄或文件映射的對(duì)應(yīng)關(guān)系, 將本地的數(shù)據(jù)映射到容器內(nèi),可以使用多個(gè)-v映射多個(gè)目錄或文件,還需要注意的是目錄只能映射目錄,文件只能映射 文件,不然會(huì)報(bào)錯(cuò)。實(shí)例如下:
?1、在Docker host中創(chuàng)建目錄,與容器的/usr/share/nginx/html目錄做映射,在容器中/usr/share/nginx/html 目錄已經(jīng)存在,如果不存在,會(huì)自動(dòng)創(chuàng)建路徑,映射時(shí)會(huì)隱藏容器中原本的數(shù)據(jù),取而代之的是Docker host上的 /html目錄中的數(shù)據(jù)。
[root@docker ~]# mkdir /html [root@docker ~]# vim /html/index.html welcome to huayuedu!!! [root@docker ~]# docker run --name cynginx -itd -p 80:80 -v /html:/usr/share/nginx/html nginx:latest cc0c8d7ac53af8b29f32aae76b767e51e6c3358ed2b491bd1ef4e0b96e77f3e5 [root@docker ~]# curl http://127.0.0.1 welcome to huayuedu!!
bind mount?
2、當(dāng)Docker host上的數(shù)據(jù)發(fā)生了變化,容器中的數(shù)據(jù)也會(huì)隨著發(fā)生變化,示例如下
[root@docker ~]# echo hello huayu > /html/index.html [root@docker ~]# curl http://127.0.0.1 hello huay
3、就算是把容器刪除,也不會(huì)影響到Docker host上的數(shù)據(jù),示例如下。
[root@docker ~]# docker stop cynginx cynginx [root@docker ~]# docker rm cynginx cynginx [root@docker ~]# cat /html/index.html hello huay
bind mount?
4、此外,Bind mounts還可以指定數(shù)據(jù)的讀寫權(quán)限,默認(rèn)權(quán)限是可讀可寫,示例如下,在映射volume時(shí),指定 容器中的文件權(quán)限只讀,那么在容器內(nèi)該文件只能被讀取,無(wú)法修改,這樣也提高了容器的安全性
[root@docker ~]# docker run --name cynginx1 -itd -p 80:80 -v /html/index.html:/usr/share/nginx/html/ index.html:ro nginx:latest [root@docker ~]# curl http://127.0.0.1 hello huayu [root@docker ~]# docker exec -it cynginx1 /bin/bash root@0555f35f03e8:/# echo huayu123 > /usr/share/nginx/html/index.html bash: /usr/share/nginx/html/index.html: Read-only file system
通過(guò)上面的示例,我們已經(jīng)理解了Bind mounts的使用,但是它也有自身的不足之處,使用時(shí)需要指定Docker host上的文件或目錄為源數(shù)據(jù),這樣就限制了容器的可移植性。例如,當(dāng)需要把容器移動(dòng)到其他的Docker host上的時(shí) 候,如果對(duì)方Docker host上沒(méi)有源數(shù)據(jù)庫(kù),或者路徑不相同,操作會(huì)失敗
docker managed volum
?第二種volume類型是由Docker管理的volume,與Bind mounts相比,Docker管理的volume在使用時(shí)不需要指 定Docker host路徑,Docker管理的volume具有以下幾個(gè)優(yōu)點(diǎn):
1、與Bind mounts相比,Docker管理的volume更易于備份或遷移。
2、用戶可以使用Docker CLI命令或Docker API管理volume。
3、volume在Linux和Windows容器上均可工作。
4、可以在多個(gè)容器之間更安全地共享volume,提供volume加密功能。
6、可以通過(guò)容器預(yù)先填充新volume的內(nèi)容。
實(shí)例如下:
1、通過(guò)-v告訴Docker需要一個(gè)volume,并將其mount到/usr/share/nginx/html目錄,那么Docker會(huì)在 /var/lib/docker/volumes/目錄下創(chuàng)建volume。[root@docker ~]# docker run --name cynginx2 -itd -p 80:80 -v /usr/share/nginx/html/ nginx 22c875d19f3f12c8528e8f5316395305c04b3f127cdb5d877e57c055d1933fa7
2、使用docker inspect查看容器的mounts部分,可以看到docker host上的 /var/lib/docker/volumes/6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a410a5d55cd8e69c/_data目錄已經(jīng)掛在到容器中 /usr/share/nginx/html目錄下,但是查看Docker host的volume中內(nèi)容,內(nèi)容是容器中的數(shù)據(jù)。也就是說(shuō)使用Docker管理的volume,在做映射時(shí),會(huì)把容 器中的數(shù)據(jù)映射到Docker host
[root@docker ~]# docker inspect cynginx2 "Mounts": [ { "Type": "volume", "Name": "6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a410a5d55cd8e69c", "Source": "/var/lib/docker/volumes/6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a410a5d55cd8e69c/_data", "Destination": "/usr/share/nginx/html", ...... [root@docker ~]#ls /var/lib/docker/volumes/6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a4 10a5d55cd8e69c/_data 50x.html index.html
3、我們修改volume中的數(shù)據(jù),再訪問(wèn),發(fā)現(xiàn)volume中修改的數(shù)據(jù)會(huì)同步到容器中的。
[root@docker ~]# echo huayu1234 > /var/lib/docker/volumes/6adbe6c8051f58c1d5cc2e8a12faaf1e6aa6 0b1075433b33a410a5d55cd8e69c/_data/index.html [root@docker ~]# curl http://127.0.0.1 huayu1234
4、我們還可以是使用docker volume命令查看docker管理的有哪些volume,并且還可以創(chuàng)建volume,示例如 下,創(chuàng)建一個(gè)volume,名為cyhuayu。在創(chuàng)建新的容器時(shí),可以直接指定使用該volume。
[root@docker ~]# docker volume ls DRIVER VOLUME NAME local 6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a410a5d55cd8e69c [root@docker ~]# docker volume create cyhuayu cyhuayu [root@docker ~]# docker volume ls DRIVER VOLUME NAME local 6adbe6c8051f58c1d5cc2e8a12faaf1e6aa60b1075433b33a410a5d55cd8e69c local cyhuayu [root@docker ~]# docker run --name cynginx3 -itd -p 81:80 -v cyhuayu:/usr/share/nginx/html/ nginx:latest 072c6758e9a815f2421861a54bfc8168eaf286df66f1d3187bc3c4141880e52f
?兩種volume不同點(diǎn)
在使用docker volume命令創(chuàng)建volume時(shí),volume默認(rèn)都是存在在本地的,實(shí)際上本地的volume 就是一個(gè)目錄。除此之外Docker還支持在外部存儲(chǔ)系統(tǒng)上創(chuàng)建volume,比如:NFS、Ceph等。
目前我們已經(jīng)學(xué)習(xí)了Docker的兩種volume的理論和基本操作,它們兩者之間的相同點(diǎn)都是使用 Docker host文件系統(tǒng)中的某個(gè)路徑。不同點(diǎn)如下表所示:
容器之間數(shù)據(jù)共享
?實(shí)現(xiàn)容器間數(shù)據(jù)共享的方法如下:
– 第一種方法是將共享數(shù)據(jù)放在volume中,然后將其mount到多個(gè)容器。
– 第二種方法是使用volume container,volume container是用來(lái)為其他容器提供volume的容器。 這樣可以提高容器的可移植性。
– 第三種方法是將數(shù)據(jù)打包到鏡像中,然后通過(guò)--volumes-from共享
第一種方法?
第一種方法是將共享數(shù)據(jù)放在volume中,然后將其mount到多個(gè)容器。示例如下,創(chuàng)建由三個(gè)nginx容器組成的 web集群,使用相同的html文件。在使用-v指定volume時(shí),可以是Docker host的路徑或者是Docker創(chuàng)建的volume。
[root@docker ~]# docker run --name apache1 -itd -p 8081:80 -v /html:/usr/share/nginx/html/ nginx:latest [root@docker ~]# docker run --name apache2 -itd -p 8082:80 -v /html:/usr/share/nginx/html/ nginx:latest [root@docker ~]# docker run --name apache3 -itd -p 8083:80 -v /html:/usr/share/nginx/html/ nginx:latest [root@docker ~]# curl http://127.0.0.1:8081 hello huayu [root@docker ~]# curl http://127.0.0.1:8082 hello huayu [root@docker ~]# curl http://127.0.0.1:8083 hello huay
第二種方法?
第二種方法是使用volume container,volume container是用來(lái)為其他容器提供volume的容器。這樣可以提高容 器的可移植性。
創(chuàng)建volume container,容器名為cy_data,使用-v指定了volume,提供html文件。需要注意的是,這里使用的 是docker create創(chuàng)建的容器,也就是說(shuō)容器只是創(chuàng)建了,并未啟動(dòng),因?yàn)関olume container只是提供數(shù)據(jù),自身并不 需要運(yùn)行
[root@docker ~]# docker create --name cy_data -v /html:/usr/share/nginx/html busybox 創(chuàng)建新的nginx容器,使用參數(shù)--volumes-from指定使用cy_data容器提供的volume。 [root@docker ~]# docker run --name cynginx1 -itd -p 8081:80 --volumes-from cy_data nginx [root@docker ~]# docker run --name cynginx2 -itd -p 8082:80 --volumes-from cy_data nginx [root@docker ~]# docker run --name cynginx3 -itd -p 8083:80 --volumes-from cy_data ngin
通過(guò)docker inspect查看容器信息中的Mounts部分,可以看到新創(chuàng)建的nginx容器已經(jīng)使用了cy_data容器所提供 的volume。經(jīng)過(guò)驗(yàn)證三個(gè)nginx容器中的html文件一樣。
[root@docker ~]# docker inspect cynginx1 [root@docker ~]# echo welcome to huayuedu > /html/index.html [root@docker ~]# curl http://127.0.0.1:8081 welcome to huayuedu [root@docker ~]# curl http://127.0.0.1:8082 welcome to huayuedu [root@docker ~]# curl http://127.0.0.1:8083 welcome to huayued
與第一種實(shí)現(xiàn)數(shù)據(jù)共享的方法相比,不必再為每個(gè)容器指定volemu,所有volume都在volume container 中定義 好了,容器只需與volume container關(guān)聯(lián),實(shí)現(xiàn)了容器與Docker host的解
第三種方法
volume container的數(shù)據(jù)歸根到底還是在Docker host里,對(duì)容器的可移植性有一定的限制。這里可以使用data- packed volume container。其原理是將數(shù)據(jù)打包到鏡像中,然后通過(guò)--volumes-from共享。
示例如下,使用Dockerfile構(gòu)建鏡像,將Docker host中的數(shù)據(jù)進(jìn)行打包。ADD指令是將html目錄中的數(shù)據(jù)添加到 容器目錄/usr/share/nginx/html中。VOLUME指令的作用與-v效果相同,用來(lái)創(chuàng)建volume,并且會(huì)把 /usr/share/nginx /html目錄中的數(shù)據(jù)復(fù)制到volume中。
[root@docker ~]# mkdir html/ [root@docker ~]# echo huayu > index.html [root@docker ~]# vim Dockerfile FROM busybox:latest ADD html /usr/share/nginx/html VOLUME /usr/share/nginx/html CMD [“/bin/bash”] [root@docker ~]# docker build -t cy_hy /roo
?使用新構(gòu)建的鏡像創(chuàng)建data-packed volume container,創(chuàng)建新的nginx容器,使用參數(shù)--volumes-from 指定使用cy_data123容器提供的volume
[root@docker ~]# docker create --name cy_data123 cy_hy [root@docker ~]# docker run --name cynginx7 -itd -p 8087:80 --volumes-from cy_data123 nginx [root@docker ~]# docker inspect cynginx7 [root@docker ~]# curl http://127.0.0.1:8087 huayu
容器能夠正確讀取volume中的數(shù)據(jù)。data-packed volume container是自包含的,不依賴Docker host 提供數(shù)據(jù),具有很強(qiáng)的移植性,非常適合只使用靜態(tài)數(shù)據(jù)的場(chǎng)景,比如應(yīng)用的配置信息、web server的靜態(tài)文 件等
總結(jié)
1、實(shí)現(xiàn)數(shù)據(jù)共享的方法有:容器指定同一個(gè)volume、volume contauner和data-packed volume contauner。
2、volume分為兩類:Bind mounts和Docker managed volume。
3、創(chuàng)建容器時(shí),使用-v參數(shù)可以實(shí)現(xiàn)容器數(shù)據(jù)持久化存儲(chǔ),volume分為兩類:Bind mounts類型是 將volume中的數(shù)據(jù)復(fù)制到容器中,Docker managed volume是將容器中的數(shù)據(jù)復(fù)制到volume中?