docker——數據卷volume:文件共享


volume——如何讓容器中的一個目錄與宿主機的一個目錄進行綁定,實現容器與宿主機之間的文件共享?

數據卷volume功能特性 

數據卷:是一個可供一個或多個容器使用的特殊目錄,實現讓容器中的一個目錄和宿主機中的一個文件或者目錄進行綁定。數據卷 是被設計用來持久化數據的
對於數據卷你可以理解為NFS中的哪個分享出來的掛載點,指宿主機共享的目錄。
主要有如下的功能和特性
• 容器中數據的持久存儲
• 容器間的資源共享
• 容器的遷移(分布式)
• 對數據卷的修改會立馬生效
• 對數據卷的更新,不會影響鏡像
• 數據卷默認會一直存在,即使容器被刪除 (注意docker自主管理的會被刪除,容器刪除前一定要對數據卷進行備份)
 
數據卷volume共享方式:
實現數據卷有如下三種方法
• Bind mount volume:用戶需要明確指定容器中的目錄和宿主機中的哪個目錄進行綁定
• Docker Management Volume:docker daemon自行管理將容器中的目錄和宿主機中的哪個目錄進行綁定
• 基於一個現有容器實現多個容器之間文件共享

數據卷volume文件共享之Bind Mount Volume

(自己創建文件夾)
第一步:在宿主機創建目錄並准備測試文件

[root@ken ~]# mkdir /ken
[root@ken ~]# echo "test for volumes by ken">/ken/index.html

第二步:啟動容器

[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目錄而且還有了我們創建測試文件
  注意:如果容器內沒有我們指定的掛載點,會自動創建

[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
 

第四步:啟動容器的apache

/ # 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地址加上我們映射的端口就可以訪問容器中的網站數據內容了

第七步:修改網站數據進行測試
  現在我們修改宿主機分享出去的目錄下的內容,檢查看容器內的內容是否會發生改變

[root@ken ~]# echo "this is the append line for ken">> /ken/index.html 

第八步:瀏覽器刷新
可以發現我們追加的內容已經可以看到了,說明容器中網站數據內容已經被成功修改了

 

數據卷volume文件共享之Docker Management Volume:

(系統自己創建文件夾,一般會在/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

數據卷volume文件共享之基於一個現有容器:

(容器與容器掛載,容器與宿主機掛載)

實例一、

第一步:再次啟動一個容器
  –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]# 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM