用戶在使用Docker的過程當中,每每須要能查看容器內應用產生的數據,或者須要把容器內的數據進行備份,甚至多個容器之間進行數據共享,這必然涉及到容器的數據管理操做。html
Docker提供三種方式將數據從宿主機掛載到容器中:
•volumes:Docker管理宿主機文件系統的一部分(/var/lib/docker/volumes)。保存數據的最佳方式。
•bind mounts:將宿主機上的任意位置的文件或者目錄掛載到容器中。
•tmpfs:掛載存儲在主機系統的內存中,而不會寫入主機的文件系統。若是不但願將數據持久存儲在任何位置,可使用tmpfs,同時避免寫入容器可寫層提升性能。nginx
建立數據卷web
[root@localhost ~]# docker volume create nginx-vol nginx-vol [root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/ _data
查看數據卷信息docker
[root@localhost ~]# docker volume ls DRIVER VOLUME NAME local nginx-vol
查看數據卷的詳細信息centos
[root@localhost ~]# docker volume inspect nginx-vol [ { "CreatedAt": "2018-11-20T15:58:54+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data", "Name": "nginx-vol", "Options": {}, "Scope": "local" } ]
使用已有鏡像建立容器,並掛載數據捲到容器裏的路徑/usr/share/nginx/htmlbash
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 62f816a209e6 13 days ago 109MB [root@localhost ~]# docker run -itd -p 80:80 --name=nginx-vol-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx f96f73d2688f398d5efeb3f466769fc9b11318a81248f263fabdaf63cb37a635 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f96f73d2688f nginx "nginx -g 'daemon of…" 20 seconds ago Up 19 seconds 0.0.0.0:80->80/tcp nginx-vol-test
在數據卷目錄準備一個測試頁app
[root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/_data/ 50x.html index.html [root@localhost ~]# echo "volume test111" > /var/lib/docker/volumes/nginx-vol/_data/test.html [root@localhost ~]# cat /var/lib/docker/volumes/nginx-vol/_data/test.html volume test111
訪問容器curl
刪除容器後數據卷裏數據還在,這樣的話再建立容器的時候指定數據卷路徑仍是能夠訪問tcp
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f96f73d2688f nginx "nginx -g 'daemon of…" 16 minutes ago Up 16 minutes 0.0.0.0:80->80/tcp nginx-vol-test
[root@localhost ~]# docker stop nginx-vol-test
nginx-vol-test
[root@localhost ~]# docker rm nginx-vol-test
nginx-vol-test
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
[root@localhost ~]# ls /var/lib/docker/volumes/nginx-vol/_data/
50x.html index.html test.htmlpost
多個容器共用一個數據卷的數據
[root@localhost ~]# docker run -itd -p 81:80 --name=volume-test1 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx bb2677a06385c5dd6750e947a495317baa7f7fcaa8731a84dc8b7a507065deba [root@localhost ~]# docker run -itd -p 82:80 --name=volume-test2 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx af2ab077bdaadf069da55b31cc40c879ea3f5c78461366c312feb13ce33688dd [root@localhost ~]# curl http://192.168.0.191:81/test.html volume test111 [root@localhost ~]# curl http://192.168.0.191:82/test.html volume test111
刪除數據卷命令
[root@localhost ~]# docker volume ls DRIVER VOLUME NAME local nginx-vol [root@localhost ~]# docker volume rm nginx-vol #確保該卷沒有容器正在使用才能刪除,因此先刪除容器 Error response from daemon: remove nginx-vol: volume is in use - [bb2677a06385c5dd6750e947a495317baa7f7fcaa8731a84dc8b7a507065deba, af2ab077bdaadf069da55b31cc40c879ea3f5c78461366c312feb13ce33688dd] [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES af2ab077bdaa nginx "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 0.0.0.0:82->80/tcp volume-test2 bb2677a06385 nginx "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 0.0.0.0:81->80/tcp volume-test1 [root@localhost ~]# docker stop `docker ps -aq` af2ab077bdaa bb2677a06385 [root@localhost ~]# docker container rm `docker ps -aq` af2ab077bdaa bb2677a06385 [root@localhost ~]# docker volume rm nginx-vol nginx-vol
建立容器時也能夠不指定數據卷,此時docker將自動建立一個匿名的volume
[root@localhost ~]# docker run -itd --name=myweb -v /data:/data nginx
eec4af49b3fd284d00eecbd85171130aefee5035ec982e697154c2ca22dc8948
[root@localhost ~]# ls /var/lib/docker/volumes/
3f8df059fd44c1e79cda37c5c9bdb754ad71937bfe1bb40e827589ee19ffe33f metadata.db
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 3f8df059fd44c1e79cda37c5c9bdb754ad71937bfe1bb40e827589ee19ffe33f
用卷建立一個容器: # docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx # docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx 驗證綁定: # docker inspect nginx-test 清理: # docker stop nginx-test # docker rm nginx-test 注意: 1.若是源文件/目錄沒有存在,不會自動建立,會拋出一個錯誤。 2.若是掛載目標在容器中非空目錄,則該目錄現有內容將被隱藏。
Volume特色:
•多個運行容器之間共享數據。
•當容器中止或被移除時,該卷依然存在。
•多個容器能夠同時掛載相同的卷。
•當明確刪除卷時,卷纔會被刪除。
•將容器的數據存儲在遠程主機或其餘存儲上
•將數據從一臺Docker主機遷移到另外一臺時,先中止容器,而後備份卷的目錄(/var/lib/docker/volumes/)
Bind Mounts特色:
•從主機共享配置文件到容器。默認狀況下,掛載主機/etc/resolv.conf到每一個容器,提供DNS解析。
•在Docker主機上的開發環境和容器之間共享源代碼。例如,能夠將Maven target目錄掛載到容器中,每次在Docker主機上構建Maven項目時,容器均可以訪問構建的項目包。
•當Docker主機的文件或目錄結構保證與容器所需的綁定掛載一致時
若是用戶須要在容器之間共享一些持續更新的數據,最簡單的方式是用數據卷容器。數據卷容器其實就是一個普通的容器,專門用它來提供數據卷供其餘容器掛載使用。
建立數據卷容器,並在其中建立一個數據卷掛載到/data
[root@localhost ~]# docker run -it -v /dbdata --name dbdata centos [root@8e6719c92634 /]# ls anaconda-post.log bin dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
建立容器,經過volume-from來掛載dbdata容器中的數據卷 (--volumes-from能夠屢次使用掛載多個卷)
[root@localhost ~]# docker run -it --volumes-from dbdata --name myweb nginx /bin/bash root@9fce51370304:/# ls /dbdata/ root@9fce51370304:/# touch /dbdata/test.txt
查看dbdata容器是否有數據
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fce51370304 nginx "/bin/bash" 5 minutes ago Exited (0) 3 minutes ago myweb
8e6719c92634 centos "/bin/bash" 12 minutes ago Up 13 seconds dbdata
[root@localhost ~]# docker exec -it 8e6719c92634 /bin/bash
[root@8e6719c92634 /]# ls /dbdata/
test.txt
利用數據卷容器遷移數據
備份
[root@localhost ~]# docker run --volumes-from dbdata -v /backup:/backup --name work centos tar cvf /backup/backup.tar /dbdata /dbdata/ /dbdata/test.txt tar: Removing leading `/' from member names [root@localhost ~]# ls /backup/ backup.tar [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES de52379b0635 centos "tar cvf /backup/bac…" 42 seconds ago Exited (0) 41 seconds ago work 9fce51370304 nginx "/bin/bash" 16 hours ago Exited (0) 16 hours ago myweb 8e6719c92634 centos "/bin/bash" 16 hours ago Up 16 hours dbdata
首先利用centos鏡像建立了一個容器work,使用--volumes-from dbdata參數來讓容器掛載dbdata容器的數據卷(即dbdata數據卷);
-v /backup:/backup參數來將本地的備份目錄(/backup)掛載到work容器的/backup目錄。work容器啓動後,使用了tar cvf /backup/backup.tar /dbdata命令來將/dbdata下的內容備份爲容器內的/backup/backup.tar,
即宿主機/backup目錄下的/backup/backup.tar
恢復
[root@localhost ~]# docker run -itd -v /dbdata --name db3 centos bash 100cacc5aa24ac39606b89c21dc9ef6ec010f4eb82ac666762546aadb827ad13 [root@localhost ~]# docker run --volumes-from db3 -v /backup:/backup --name db4 centos tar xvf /backup/backup.tar dbdata/ dbdata/test.txt [root@localhost ~]# docker exec -it db3 bash -c 'ls /dbdata' test.txt
首先利用centos鏡像新建一個db3的容器,而後經過--volumes-from參數掛載db3容器的數據卷(/dbdata)新建容器,並將本地的/backup目錄映射到db4容器中。然後對/backup/backup.tar進行解壓到/dbdata目錄下,從而實現db3恢復/dbdata數據