容器中管理數據主要有兩種方式 數據捲:容器內的數據直接映射到本地主機目錄。 數據捲容器:使用特定的容器維護數據捲。 Docker提供三種不同的方式將數據從宿主機掛載到容器中:volumes,bind mounts和tmpfs。 1)volumes:Docker管理宿主機文件系統的一部分(/var/l ...
容器中管理數據主要有兩種方式
數據捲:容器內的數據直接映射到本地主機目錄。
數據捲容器:使用特定的容器維護數據捲。
Docker提供三種不同的方式將數據從宿主機掛載到容器中:volumes,bind mounts和tmpfs。
1)volumes:Docker管理宿主機文件系統的一部分(/var/lib/docker/volumes)。
2)bind mounts:可以存儲在宿主機系統的任意位置。
3)tmpfs:掛載存儲在宿主機系統的記憶體中,而不會寫入宿主機的文件系統。
數據捲
1、volumes
數據捲是一個可供容器使用的特殊目錄,有如下特性:
1)數據捲可以在容器之間共用和重用
2)數據捲修改會立即生效
3)數據捲的更新不會影響鏡像
4)如果有容器使用數據捲,該捲會一直存在
1.在容器內創建一個數據捲
[root@docker01 ~]# docker volume create nginx-vol nginx-vol [root@docker01 ~]# docker volume ls DRIVER VOLUME NAME local 01da511ea2d414af458ab07e8c2364408206599d05f4f395d9c1da7e148d42af local 0bddbe54988d963500402a02ec50530d8ea0b3999ac2aa40814cd54a5360cb8f local nginx-vol [root@docker01 ~]# ll /var/lib/docker/volumes/ drwxr-xr-x 3 root root 19 Feb 22 08:49 01da511ea2d414af458ab07e8c2364408206599d05f4f395d9c1da7e148d42af drwxr-xr-x 3 root root 19 Feb 22 09:10 0bddbe54988d963500402a02ec50530d8ea0b3999ac2aa40814cd54a5360cb8f drwxr-xr-x 3 root root 19 Mar 12 08:47 nginx-vol [root@docker01 ~]# docker volume inspect nginx-vol [ { "CreatedAt": "2019-03-12T08:47:17+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data", "Name": "nginx-vol", "Options": {}, "Scope": "local" } ]
2.用捲創建一個容器:
# docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
# docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
沒有創建容器之前volume裡面沒有內容,創建完成後:
[root@docker01 ~]# docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
ce12107a9ef40f26499d083c4f6b6200b3263d30f272144ff0f031670a9fe142
[root@docker01 ~]# ls /var/lib/docker/volumes/nginx-vol/_data/
50x.html index.html
我們可以看到容器內的對應目錄內容會自動映射到主機目錄,由此可見數據捲是一個可供容器使用的特殊目錄,它將主機操作系統目錄直接映射進容器,類似於Linux中的mount操作。
停止並刪除容器,修改index.html的內容,再創建一個可以對外訪問的容器。
[root@docker01 ~]# docker rm -f nginx-test nginx-test [root@docker01 ~]# ls /var/lib/docker/volumes/nginx-vol/_data/ 50x.html index.html [root@docker01 ~]# echo "hello docker" >/var/lib/docker/volumes/nginx-vol/_data/index.html [root@docker01 ~]# cat /var/lib/docker/volumes/nginx-vol/_data/index.html hello docker [root@docker01 ~]# docker run -d --name=nginx-test -p 88:80 -v nginx-vol:/usr/share/nginx/html nginx 8a4bb5c618993fbdcc171bdbcd782476e15532ec38cb956d2a3719f821a47373 [root@docker01 ~]# curl 10.0.0.99:88 hello docker
很明顯,此種方式,數據捲的內容覆蓋容器中對應的預設數據,數據捲可以在容器之間共用和重用。
註意:如果沒有指定捲,會自動創建
[root@docker01 ~]# docker run -d --name=nginx-test2 -v nginx-test:/usr/share/nginx/html nginx af521547cbc090268dd3151ceefa07660b918760ac2bd9170b6c9bbae7cb1d0b [root@docker01 ~]# docker volume ls DRIVER VOLUME NAME local 01da511ea2d414af458ab07e8c2364408206599d05f4f395d9c1da7e148d42af local 0bddbe54988d963500402a02ec50530d8ea0b3999ac2aa40814cd54a5360cb8f local nginx-test local nginx-vol
清理:
[root@docker01 ~]# docker rm -f `docker ps -aq`
2、bind mounts:
用捲創建一個容器:
第一種方式:指定的src目錄必須存在,否則將報錯
# docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
[root@docker01 ~]# docker run -d -it --name=nginx-test --mount type=bind,src=/test/app,dst=/usr/share/nginx/html nginx
docker: Error response from daemon: invalid mount config for type "bind": bind mount source path does not exist: /test/app.
第二種方式:如果沒有指定捲,會自動創建
# docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
[root@docker01 ~]# docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
6000fe0e1e8a49f2ad6a34cb2bef78c064ad4090c06de4ebc12619da1727f7d9
[root@docker01 ~]# ls /app/wwwroot/
[root@docker01 ~]# docker exec -it nginx-test bash
root@6000fe0e1e8a:/# ls /usr/share/nginx/html/
root@6000fe0e1e8a:/#
由此可見,bind mounts方式,掛載一個主機目錄作為數據捲,無論主機目錄是否為空則都會覆蓋容器內對應的目錄。
清理:
# docker stop nginx-test
# docker rm nginx-test
數據捲容器
數據捲容器用於用戶需要在容器間共用一些持續更新的數據,數據捲容器專門提供數據捲供其它容器掛載使用。
1.數據捲容器創建
創建數據捲容器dbdata,並查看/dbdata目錄。
[root@docker01 ~]# docker run -itd --name dbdata -v /dbdata centos
0a886be8adcad08eabf407bf8c862044a35bf592373068aed1dbc313ff9b785b
[root@docker01 ~]# docker exec -it dbdata bash
[root@0a886be8adca /]# ls
anaconda-post.log bin dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
創建容器db1與db2共用dbdata的數據,需要使用--volumes-from來掛載dbdata容器中的數據捲。
[root@docker01 ~]# docker run -itd --name db1 --volumes-from dbdata centos
12d0bb5e53051ecc17c660533e9f66ee0f57d93891851699c08321433ebdfc65
[root@docker01 ~]# docker run -itd --name db2 --volumes-from dbdata centos
3e9292a1edc77016e5574c8efdb906f9f67f2b3426cedbd0dfd4667a06798bf5
此時,容器db1和容器db2都掛載同一個數據捲到相同的/dbdata目錄。三個容器任意一個容器修改dbdata的內容,其他容器內均生效
在dbdata內創建一個test文件,其他都能看見:
[root@docker01 ~]# docker exec -it dbdata bash
[root@0a886be8adca /]# cd /dbdata/
[root@0a886be8adca dbdata]# ls
[root@0a886be8adca dbdata]# touch test
[root@0a886be8adca dbdata]# ls
test
[root@0a886be8adca dbdata]# exit
exit
[root@docker01 ~]# docker exec -it db1 bash
[root@12d0bb5e5305 /]# ls dbdata/
test
[root@12d0bb5e5305 /]# exit
exit
[root@docker01 ~]# docker exec -it db2 bash
[root@3e9292a1edc7 /]# ls dbdata/
test
[root@3e9292a1edc7 /]#
2.數據捲容器的刪除
如果刪除了掛載的容器,數據捲並不會被自動刪除,如果要刪除一個數據捲,必須在刪除最後一個還掛載它的容器時顯示使用docker rm -v 命令指定同時刪除關聯的容器。
3.數據遷移:
可以利用數據捲容器對其中的數據捲進行備份、恢復,以實現數據的遷移。
1)備份:
使用下麵的命令來備份dbdata數據捲容器內的數據捲:
docker run --volumes-from dbdata -v /root:/backup --name worker centos tar cvf /backup/backup.tar /dbdata [root@docker01 ~]# docker run --volumes-from dbdata -v /root:/backup --name worker centos tar cvf /backup/backup.tar /dbdata tar: Removing leading `/' from member names /dbdata/ /dbdata/test [root@docker01 ~]# ls backup.tar
說明:
利用centos鏡像創建一個容器worker。使用--volumes-from dbdata參數來讓worker容器掛載dbdata的數據捲;使用/root:/backup參數來掛載本地目錄到worker容器的/backup目錄。
worker啟動後,使用tar命令將/dbdata下的內容備份為容器內的/backup/backup.tar,即宿主機root目錄下的backup.tar。
2)恢復:
如果恢複數據到一個容器,可以參照下麵的操作。
首先創建一個帶有數據捲的容器dbdata2,然後創建另一個新的容器,掛載dbdata2的容器,並使用tar命令解壓備份文件到掛載的容器捲中即可:
[root@docker01 ~]# docker run -itd -v /dbdata --name dbdata2 centos
9f79dad9170e2b99d1e661ce57279495dc2e3afe1e65d42890406a2a65b65c6e
[root@docker01 ~]# docker run --volumes-from dbdata2 -v /root:/backup centos tar xvf /backup/backup.tar
dbdata/
dbdata/test
[root@docker01 ~]# docker exec -it dbdata2 bash
[root@9f79dad9170e /]# ls dbdata/
test