一 Docker volume形態 因為Docker 採用 AFUS 分層文件系統時,文件系統的改動都是發生在最上面的容器層,在容器的生命周期內,它是持續的,包括容器在被停止後。但是,當容器被刪除後,該數據層也隨之被刪除了。因此,Docker 採用 volume (捲)的形式來向容器提供持久化存儲。 ...
一 Docker volume形態
因為Docker 採用 AFUS 分層文件系統時,文件系統的改動都是發生在最上面的容器層,在容器的生命周期內,它是持續的,包括容器在被停止後。但是,當容器被刪除後,該數據層也隨之被刪除了。因此,Docker 採用 volume (捲)的形式來向容器提供持久化存儲。Docker volume 有如下幾種形態。- 預設,即無Docker volume
- Data volume (數據捲)
- data container(數據捲容器)
二 預設無volume
預設情況下,容器不使用任何 volume,此時,容器的數據被保存在容器之內,它只在容器的生命周期記憶體在,會隨著容器的被刪除而被刪除,此時若需要永久保存可使用 docker commit 命令將它持久化為一個新的鏡像。三 Data volume (數據捲)
一個 data volume 是容器中繞過 Union 文件系統的一個特定的目錄。被設計用來保存數據,而不管容器的生命周期。因此,當你刪除一個容器時,Docker 不會自動地刪除一個volume。3.1 -v掛載容器內目錄
數據捲特性:- 數據捲是目錄或文件,而非沒有格式化的磁碟(塊設備)
- 數據捲可以在容器之間共用和重用
- 對數據捲的修改會立馬生效
- 對數據捲的更新,不會影響鏡像
- 數據捲預設會一直存在,即使容器被刪除
- -d:後臺進程;
- -p:映射埠,物理機埠:容器埠;
- -v:物理機文件夾:容器的目錄(容器中目錄如果不存在,會自動創建,如果存在,會覆蓋掉),即將宿主機中的目錄掛載到鏡像中的目錄。
1 root@docker:~# docker inspect b7 | grep -A11 "Mounts" 2 root@docker:~# echo "Hello web01!" >/webroot/index.html 3 root@docker:~# echo "Hello web02!" >/var/lib/docker/volumes/725d7d76ec8eb10f5730fe5663cb1d1eb7481efaa2a5a790343dca5d0557564a/_data/index.html提示:若不指定本地目錄則會自動在宿主機/var/lib/docker/volumes下為其生成一個隨機目錄。 測試:瀏覽器訪問:http://172.24.8.90:8080/ 測試:瀏覽器訪問:http://172.24.8.90:9090/ 提示:採用volumes數據捲的情況下,當對應的容器被刪除時,其掛載的目錄會保留。主機上的目錄可以是一個本地目錄,也可以在一個 NFS share等形式。
3.2 -v掛載文件
1 root@docker:~# docker run --rm -it --name centos7-01 -v ~/.bashrc:/root/.bashrc centos:7
提示:本地主機文件作為數據捲掛載到容器中,不建議在容器中直接修改。
四 docker的數據共用
4.1 docker容器與宿主機共用數據
方式一:docker cp cp的用法如下:1 docker cp [OPTIONS] CONTAINER:PATH LOCALPATH|- 2 docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH 3 root@docker:~# docker cp /root/.vimrc centos7-01:/root/ #從宿主機拷貝至容器 4 root@docker:~# docker cp centos7-01:/root/.vimrc /root/.vimrc_bak #從容器拷貝至宿主機方式二:採用數據捲掛載形式,見3。
4.2 docker容器之間共用數據
情景一:共用host宿主機目錄 將同一個host目錄掛載到不同的容器即可。1 root@docker:~# docker run -d -p 1010:80/tcp --name web03 -v /webroot:/usr/local/apache2/htdocs httpd 2 root@docker:~# docker run -d -p 2020:80/tcp --name web04 -v /webroot:/usr/local/apache2/htdocs httpd 3 root@docker:~# echo "This is share file!" >/webroot/index.html測試:瀏覽器分別訪問http://172.24.8.90:1010和/http://172.24.8.90:2020/。
4.2 docker容器與容器共用數據
見5.data container(數據捲容器)。五 data container(數據捲容器)
data container中不會跑應用,而只是掛載一個捲,volume container是專門為其他容器提供volume的容器,它提供的捲的類型可以是bind mount,也可以是docker managed volume。5.1 創建數據捲容器
data container。這種 container 中不會跑應用,而只是掛載一個捲。1 root@docker:~# docker create --name sharefile01 -v /data:/usr/local/apache2/htdocs centos:7 2 root@docker:~# docker inspect sharefile01 | grep -A11 "Mounts"解釋:創建一個名為sharefile01的用於容器之間共用數據的數據捲容器,並將宿主機的/data目錄掛載至該容器的/usr/local/apache2/htdocs目錄。 提示:其他容器只需獲取數據捲容器的掛載點,因此可該容器可不運行。/usr/local/apache2/htdocs為容器中的目錄,並非宿主機本地目錄,當其他容器引用此容器時,會自動在容器中掛載此目錄。
5.2 引用數據捲容器
新建容器時可通過--volumes-from參數指定需要引用的數據捲容器。1 root@docker:~# docker run -d -p 3030:80/tcp --name web05 --volumes-from sharefile01 httpd 2 root@docker:~# docker run -d -p 4040:80/tcp --name web06 --volumes-from sharefile01 httpd 3 root@docker:~# echo "This is share file two!" >/data/index.html測試:瀏覽器分別訪問http://172.24.8.90:3030和/http://172.24.8.90:4040/。
六 volume管理
6.1 創建volume捲
1 root@docker:~# docker volume create --name data02 2 root@docker:~# docker volume inspect data02
6.2 使用volume捲
1 root@docker:~# docker run -d -p 5050:80/tcp --name web07 -v data02:/usr/local/apache2/htdocs httpd 2 root@docker:~# echo "Hello web07!" > /var/lib/docker/volumes/data02/_data/index.html測試:瀏覽器訪問http://172.24.8.90:5050。
6.3 查看volume捲
1 root@docker:~# docker volume ls #查看所有volume捲 2 root@docker:~# docker volume ls -qf dangling=true #查看所有孤兒捲提示:使用 docker run -v 啟動的容器被刪除以後,在主機上所掛載的捲不會刪除,即殘留孤兒捲。
6.4 刪除volume捲
1 root@docker:~# docker volume rm 95704ae78c05261a46d2dc1f2bf872a8c3dc634817e7c0db53e7e6d40f2dc8ea 2 root@docker:~# docker volume rm $(docker volume ls -qf dangling=true) #刪除孤兒捲
6.5 刪除容器時刪除 volume
1 root@docker:~# docker run -d -p 6060:80/tcp --name web08 -v /usr/local/apache2/htdocs httpd 2 root@docker:~# docker inspect web08
1 root@docker:~# docker rm -vf web08 2 root@docker:~# docker volume ls提示:若容器採用靜態固定掛載,則使用-vf也無法刪除volume捲。
七 volume數據備份及還原
7.1 備份
原理:將需要備份的容器,如web09,當做數據捲容器,以此容器創建一個mydatabackup臨時容器,並將宿主機/mybackup掛載到mydatabackup容器的/databack,併在該臨時容器中執行備份的打包命令,備份需要保存數據的目錄,如/usr/local/apache2到/databack,也就是備份到宿主機/mybackup目錄。1 root@docker:~# docker run -d -p 1111:80/tcp --name web09 -v /usr/local/apache2/htdocs httpd 2 root@docker:~# docker inspect web09 | grep -A11 "Mounts" 3 root@docker:~# echo "This is web09 backup test!">/var/lib/docker/volumes/16aa6956e7076ecb9f256c302833640880e3bb1b8602771cca378e7230975488/_data/index.html提示:創建用於備份的容器,並備份該文件。
1 root@docker:~# docker run --volumes-from web09 --name mydatabackup -v /mybackup:/databack httpd tar zcf /databack/http-backup.tar.gz /usr/local/apache2/htdocs
7.2 還原
原理:新建一個臨容器,如temp01,然後將容器需要保存的數據的目錄,如/usr/local/apache2掛載至宿主機,然後再並將宿主機/mybackup掛載到該容器的/databack,將temp01臨時容器當做數據捲容器新建web10容器,並將備份文件解壓恢復,則恢復至temp01容器所掛載的宿主機目錄,再以temp01為數據捲容器創建新的容器即可。1 root@docker:~# docker run -d -v /usr/local/apache2/htdocs --name temp01 httpd 2 root@docker:~# docker run --volumes-from temp01 --name web10 -v /mybackup:/databack httpd tar zxf /databack/http-backup.tar.gz 3 #此步驟執行完畢即將備份文件已經還原至容器的/usr/local/apache2/htdocs。 4 root@docker:~# docker run -d -p 2222:80/tcp --name web11 --volumes-from temp01 httpd測試:瀏覽器訪問http://172.24.8.90:2222。 參考鏈接:https://www.cnblogs.com/sammyliu/p/5932996.html https://www.cnblogs.com/shoufengwei/p/7259496.html