docker數據卷——數據卷管理(bind mount+docker managed volume )

1.docker數據卷的介紹

1.爲什麼用數據卷?
docker分層文件系統性能差,生命週期與容器相同(容器刪除,文件也丟失)
而docker數據卷是mount到宿主機中,繞開了分層文件系統,和主機磁盤性能相同,容器刪除後依然保留,但是僅限本地磁盤,不能隨容器遷移。

docker官方提供兩種卷:
1.bind mount
2.docker managed volume

2.bind mount

bind mount:將主機上的目錄或文件直接mount到容器裏,使用直接,高效

2.1 bind mount掛載文件到容器

docker run -d --name web1 -p 80:80 -v /opt/website: /usr/share/nginx/html nginx容器裏/usr/share/nginx/html是nginx 的默認發佈目錄
curl localhost
docker exec web1 mount 在容器裏執行mount命令
看到/dev/mapper/rhel-root,也就是我們的根目錄,掛接到容器的/usr/share/nginx/html
vim /opt/website/index.html 編輯nginx 的默認發佈主頁
curl localhost


在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述


2.2 在容器內修改掛載內容

docker container attach web1 應用容器不能這樣,這樣操作會卡住,ctrl+c後容器會自動退出
docker start web1開啓web1容器
docker exec -it web1 bash -it是exec的選項,bash表示在容器內執行的操作,打開一個bash ,在容器中修改
curl localhost 數據也已經更改


在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
在容器內更改的數據其實就是宿主機上的數據。
這種方式,不存在的目錄會自動新建(無論容器還是宿主機),但是會以宿主機爲準,綁定掛接到容器後,容器中的對應目錄如果有數據,就會被覆蓋。


2.3 只讀掛載

bind mount方式掛載時默認權限是rw,可以在掛載時指定只讀(ro)
docker run -it --name vm1 -v/ opt/data1:/data1 -v /opt/data2:/data2:ro ubuntu 這些目錄在宿主機和容器內都是沒有的 ,data1讀寫掛載,data2只讀掛載
cd /opt/data2
touch file2可以建立文件
docker container attach vm1 可以看到 file2

在這裏插入圖片描述


2.4 掛載yum源

docker run -it --name vm2 -v /etc/yum.repos.d/source.repo:/etc/yum.repos.d/source.repo rhel7 bash 掛載yum源,注意要給一個 bash
也可以
docker run -it --name vm2 -v /etc/yum.repos.d/source.repo:/etc/yum.repos.d/source.repo:ro rhel7 bash 加上只讀選項,讓yum源不能被更改

在這裏插入圖片描述


3.docker managed volume(docker管理卷)

bind mount必須指定宿主機文件系統路徑,移植性差(如果容器在A主機上crash掉,B主機上如果沒有對應路徑,無法進行移植)

docker managed volume不需要指定宿主機文件系統路徑,docker自動爲容器創建,默認數據卷目錄都在 /var/lib/docker/volumes
如果掛載時指向容器內已有的目錄,原數據會被複制到volume中

3.1 docker managed volume掛載文件

docker run -d --name web1 -p 80:80 -v /usr/share/nginx/html nginx
curl localhost 發現可以訪問,看到nginx主頁
docker inspect web1

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述


3.2 指定數據卷目錄

docker run -d --name web2 -p 80:80 -v website2:/usr/share/nginx/html nginx
curl localhost
docker inspect web2
在這裏插入圖片描述
在這裏插入圖片描述


3.3 刪除容器及數據卷

docker rm -f web2 刪除之前的容器
docker volume ls查看卷,發現容器刪除了,數據還在
docker volume rm b29ea012d9b02b3fc410834c6da4d0bd4bca3e1cf4ae95e5b3bda71cfe0e85a1刪除
docker volume prune 刪除所有沒有被容器使用的卷,如果容器較多,一個一個刪除麻煩

在這裏插入圖片描述


3.4 刪除容器恢復數據卷

docker run -d --name web2 -p 80:80 -v website2:/usr/share/nginx/html nginx
docker rm -f web2 刪除之前的容器
docker volume ls查看卷,發現容器刪除了,數據還在
docker volume create webdata 創建一個數據卷
cp /var/lib/docker/volumes/website2/_data/* /var/lib/docker/volumes/webdata/_data/拷貝數據
docker run -d --name web2 -p 80:80 -v webdata:/usr/share/nginx/html nginx創建web2依然可以使用web1的數據
curl localhost 可以訪問
echo linux > /var/lib/docker/volumes/webdata/_data/index.html更改發佈面也可以訪問

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述


3.5 多個容器掛載同一個目錄

還可以使用這種方式讓多個容器掛載同一個目錄
docker run -d --name web3 -v webdata:/usr/share/nginx/html nginx再新建一個容器,去掉端口映射
docker inspect web3
curl 172.17.0.3

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述只要數據卷在,再次啓動容器數據依然保留。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章