volume——如何讓容器中的一個目錄與宿主機的一個目錄進行綁定,實現容器與宿主機之間的文件共享?php
數據卷:是一個可供一個或多個容器使用的特殊目錄,實現讓容器中的一個目錄和宿主機中的一個文件或者目錄進行綁定。數據卷 是被設計用來持久化數據的
對於數據卷你能夠理解爲NFS中的哪一個分享出來的掛載點,指宿主機共享的目錄。
主要有以下的功能和特性
• 容器中數據的持久存儲
• 容器間的資源共享
• 容器的遷移(分佈式)
• 對數據卷的修改會立馬生效
• 對數據卷的更新,不會影響鏡像
• 數據卷默認會一直存在,即便容器被刪除 (注意docker自主管理的會被刪除,容器刪除前必定要對數據捲進行備份)
數據卷volume共享方式:
實現數據卷有以下三種方法
• Bind mount volume:用戶須要明確指定容器中的目錄和宿主機中的哪一個目錄進行綁定
• Docker Management Volume:docker daemon自行管理將容器中的目錄和宿主機中的哪一個目錄進行綁定
• 基於一個現有容器實現多個容器之間文件共享html
(本身建立文件夾)
第一步:在宿主機建立目錄並準備測試文件jquery
[root@ken ~]# mkdir /ken [root@ken ~]# echo "test for volumes by ken">/ken/index.html
第二步:啓動容器sql
[root@ken ~]# docker container run -it --name ken1 -p 7879:80 --rm -v /ken:/data/ busybox - it :互動模式登陸容器,並分配一個終端 - name :指定容器名稱 - p :小p指定容器的80端口映射爲宿主機的7879端口。 - rm :表示退出容器時,容器一塊兒刪除 - v :指定volumes,格式爲: 宿主機共享目錄:容器目錄 ,這樣宿主機的/ken目錄就被掛載到了容器的/data/目錄下了
第三步:查看掛載點
能夠發現容器內有了/data目錄並且還有了咱們建立測試文件
注意:若是容器內沒有咱們指定的掛載點,會自動建立docker
[root@ken ~]# docker container run -it --name ken -v /ken:/data/ busybox / # ls /data index.html / # cat /data/index.html test for volumes by ken
第四步:啓動容器的apacheapache
/ # httpd -h /data
第五步:查看端口
能夠發現如今宿主機已經有了7879端口了瀏覽器
[root@ken ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:111 *:* LISTEN 0 1024 127.0.0.1:8080 *:* LISTEN 0 511 *:80 *:* LISTEN 0 128 *:22 *:* LISTEN 0 1024 :::7879 :::* LISTEN 0 70 :::3306 :::* LISTEN 0 128 :::111 :::* LISTEN 0 128 :::22 :::*
第六步:瀏覽器進行訪問
如今咱們就可使用宿主機的IP地址加上咱們映射的端口就能夠訪問容器中的網站數據內容了tomcat
第七步:修改網站數據進行測試
如今咱們修改宿主機分享出去的目錄下的內容,檢查看容器內的內容是否會發生改變bash
[root@ken ~]# echo "this is the append line for ken">> /ken/index.html
第八步:瀏覽器刷新
能夠發現咱們追加的內容已經能夠看到了,說明容器中網站數據內容已經被成功修改了app
(系統本身建立文件夾,通常會在/var/lib/docker/volumes/下)
Docker Management Volume與Bind Mount Volume區別就是它會本身管理將會把容器中的目錄與宿主機哪一個目錄進行綁定
第一步:啓動容器
這個時候的-v後面只須要跟上容器內的一個目錄便可
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
第二步:查看容器的目錄
能夠發現目錄不存在也是自動建立
如今目錄下沒有任何文件
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox / # ls /data/ / #
第三步:查看掛載點
咱們檢查看下容器內的這個目錄被掛載到了那個宿主機的那個位置
能夠發現容器中的data目錄被掛載到了宿主機的以下目錄下
[root@ken ~]# docker container inspect ken1 | grep Source "Source": "/var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data",
第四步:宿主機建立文件進行測試
咱們能夠在宿主機的共享目錄中建立文件查看容器內是否有相同文件便可驗證
[root@ken ~]# cd /var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data [root@ken _data]# touch ken{1..5} [root@ken _data]# ls ken1 ken2 ken3 ken4 ken5
第五步:容器內查看
第二次查看/data目錄下便可發現咱們剛纔在宿主機內建立的文件了
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox / # ls /data/ / # ls /data/ ken1 ken2 ken3 ken4 ken5 / #
第一步:啓動容器
這個時候的-v後面只須要跟上容器內的一個目錄便可
[root@localhost game]# docker run -d --name http-test -p 90:80 -v /usr/local/apache2/htdocs httpd e60cdf12daa7450d3aaaf625dde3436e39ea15455bfb95c8fd6ae4a3b463ee25 [root@localhost game]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e60cdf12daa7 httpd "httpd-foreground" 12 seconds ago Up 11 seconds 0.0.0.0:90->80/tcp http-test 391afba79c84 httpd "httpd-foreground" 4 minutes ago Up 4 minutes 0.0.0.0:82->80/tcp httpd 9225fd6da0e2 tomcat:test "catalina.sh run" 53 minutes ago Up 53 minutes 0.0.0.0:86->8080/tcp tomcat
第二步:查看掛載點
咱們檢查看下容器內的這個目錄被掛載到了那個宿主機的那個位置
能夠發現容器中的data目錄被掛載到了宿主機的以下目錄下
[root@localhost game]# docker container inspect e60cdf12daa7 |grep -i "source" "Source": "/var/lib/docker/volumes/bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9/_data", [root@localhost game]# cd /var/lib/docker/volumes/bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9/ [root@localhost bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9]# ls _data [root@localhost bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9]# cd _data/ [root@localhost _data]# ls index.html [root@localhost _data]# cat index.html <html><body><h1>It works!</h1></body></html>
第四步:宿主機建立文件進行測試
咱們能夠在宿主機的共享目錄中放置遊戲文件
[root@localhost _data]# cp /game/* ./ -a [root@localhost _data]# rm -rf index.html [root@localhost _data]# ls game game.zip images jquery-1.8.3.min.js readme.xls sky_fight.html sky.php
第五步:容器內查看
查看是否有遊戲文件
[root@localhost _data]# docker exec -it e60cdf12daa7 bash root@e60cdf12daa7:/usr/local/apache2# ls bin build cgi-bin conf error htdocs icons include logs modules root@e60cdf12daa7:/usr/local/apache2# cd /usr/local/apache2/htdocs root@e60cdf12daa7:/usr/local/apache2/htdocs# ls game game.zip images jquery-1.8.3.min.js readme.xls sky.php sky_fight.html root@e60cdf12daa7:/usr/local/apache2/htdocs# exit
(容器與容器掛載,容器與宿主機掛載)
第一步:再次啓動一個容器
–volumes-from:後面指定容器名,上一個實驗我已經啓動了一個容器ken1
[root@ken ~]# docker run --name ken2 -it --volumes-from ken1 --rm busybox
第二步:查看新容器的文件
能夠在新建立的容器有了咱們以前建立容器的文件了
/ # ls /data/ ken1 ken2 ken3 ken4 ken5
第三步:在新容器內建立新的文件
以下我建立了一個kenken的文件
/ # cd /data
/data # touch kenken
/data # ls ./
ken1 ken2 ken3 ken4 ken5 kenken
第四步:查看ken1容器
在ken1容器內查看是否已經有了咱們建立的文件
能夠發如今ken1容器內也有了咱們在新容器內建立的文件了
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox / # ls /data/ / # ls /data/ ken1 ken2 ken3 ken4 ken5 / # ls /data ken1 ken2 ken3 ken4 ken5 kenken
第五步:查看宿主機
其實這個時候宿主機也應該有咱們剛纔建立的文件
這樣就實現了多臺容器之間以及和多臺容器和宿主機之間的文件共享
[root@ken ~]# ls /var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data ken1 ken2 ken3 ken4 ken5 kenken
第一步:再次啓動一個容器
–volumes-from:後面指定容器名
[root@localhost _data]# docker run -d --name httpd-test2 -it --volumes-from http-test -P httpd 0400349ee7c8c3286226b95bc993ac77ad6565fcb5dc24569710414f937c75de [root@localhost _data]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0400349ee7c8 httpd "httpd-foreground" 14 seconds ago Up 14 seconds 0.0.0.0:32768->80/tcp httpd-test2 e60cdf12daa7 httpd "httpd-foreground" 15 minutes ago Up 15 minutes 0.0.0.0:90->80/tcp http-test 391afba79c84 httpd "httpd-foreground" 19 minutes ago Up 19 minutes 0.0.0.0:82->80/tcp httpd 9225fd6da0e2 tomcat:test "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:86->8080/tcp tomcat
第二步:查看新容器的文件
[root@localhost _data]# docker exec -it 0400349ee7c8 bash root@0400349ee7c8:/usr/local/apache2# cd /usr/local/apache2/htdocs root@0400349ee7c8:/usr/local/apache2/htdocs# ls game game.zip images jquery-1.8.3.min.js readme.xls sky.php sky_fight.html root@0400349ee7c8:/usr/local/apache2/htdocs# exit exit
第三步:打開http-test和httpd-test2的掛載文件(同一個文件目錄)
[root@localhost _data]# docker container inspect 0400349ee7c8|grep -i "source" "Source": "/var/lib/docker/volumes/bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9/_data", [root@localhost _data]# docker container inspect e60cdf12daa7 |grep -i "source" "Source": "/var/lib/docker/volumes/bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9/_data", [root@localhost _data]#