docker數據管理

用戶在使用Docker的過程當中,每每須要能查看容器內應用產生的數據,或者須要把容器內的數據進行備份,甚至多個容器之間進行數據共享,這必然涉及到容器的數據管理操做。html

Docker提供三種方式將數據從宿主機掛載到容器中:
•volumes:Docker管理宿主機文件系統的一部分(/var/lib/docker/volumes)。保存數據的最佳方式。
•bind mounts:將宿主機上的任意位置的文件或者目錄掛載到容器中。
•tmpfs:掛載存儲在主機系統的內存中,而不會寫入主機的文件系統。若是不但願將數據持久存儲在任何位置,可使用tmpfs,同時避免寫入容器可寫層提升性能。nginx

volumes

建立數據卷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

bind mount

用卷建立一個容器:
# 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數據

相關文章
相關標籤/搜索