文章首發於公衆號《程序員果果》 地址:mp.weixin.qq.com/s/qg8eXHobN…html
docker的理念之一就是將應用和運行的環境打包,所以docker容器的生存週期一般都是與在容器中運行的程序相同的,而咱們對數據的要求是持久化,docker容器之間也須要一個共享數據的渠道。這些需求就催生了docker數據卷的誕生。nginx
docker數據卷是通過特殊設計的目錄,能夠繞過聯合文件系統(UFS),爲一個或多個容器提供訪問。程序員
數據卷設計的目的,在於數據的永久化,它徹底獨立於容器的生命週期。所以,docker不會在容器刪除時刪除其掛在的數據卷,也不會存在相似的垃圾收集機制,對容器引用的數據進行處理docker
#爲容器添加數據卷使用-v選項
docker run -v ~/container_data:/data -it IMAGE /bin/bash
複製代碼
容器中shell
root@311b7376b879:/# ls
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@311b7376b879:/# cd data/
root@311b7376b879:/data# echo "hi , what's up man ?" > hi.txt
複製代碼
宿主機ubuntu
huanchu-mbp:~ huanchu$ docker run -it -d -v ~/Documents/ttt:/data --name test1 nginx /bin/bash
huanchu-mbp:~ huanchu$ cat Documents/ttt/hi.txt
hi , what's up man ?
複製代碼
掛載的數據默認爲可讀寫權限。 但也能夠根據本身的需求,將容器裏掛載共享的數據設置爲只讀,這樣數據修改就只能在宿主機上操做,用法以下:bash
#ro:指定爲只讀。
docker run -it -v ~/datavolume:/data:ro ubuntu /bin/bash
複製代碼
Dockerfile指令:
VOLUME [ "/data"]
複製代碼
在Dockerfile中 VOLUME 指令建立的掛載點,沒法指定主機上對應的目錄,是自動生成的微信
# Version: 0.0.1
FROM ubuntu:latest
VOLUME ["/data/volume1","/data/volume2"]
RUN apt-get update RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80
複製代碼
docker build -t="mynginx2" .
複製代碼
docker run -it --name mynginx_test mynginx2
複製代碼
root@e22ae166d8fa:/# ls
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@e22ae166d8fa:/# cd data/
root@e22ae166d8fa:/data# ls
volume1 volume2
root@e22ae166d8fa:/data#
複製代碼
咱們經過docker inspect 查看經過該dockerfile建立的鏡像生成的容器,能夠看到以下信息:ui
能夠看到兩個掛載點的信息。spa
"Mounts": [
{
"Type": "volume",
"Name": "596925f444bbcb7d3b75c3b844700ce8f43bd5fc8b18bb97f323e2825a1df13e",
"Source": "/var/lib/docker/volumes/596925f444bbcb7d3b75c3b844700ce8f43bd5fc8b18bb97f323e2825a1df13e/_data",
"Destination": "/data/volume1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "0a28aed7c33a588dd74ce008d78670a5ff01dbea17e659597ebd5506bf8824cb",
"Source": "/var/lib/docker/volumes/0a28aed7c33a588dd74ce008d78670a5ff01dbea17e659597ebd5506bf8824cb/_data",
"Destination": "/data/volume2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
複製代碼
命名的容器掛載數據卷,其餘容器經過掛載這個容器實現數據共享,掛載數據卷的容器,就叫作數據卷容器。
huanchu-mbp:Documents huanchu$ docker run -it -v ~/Documents/ttt:/data --name container_data ubuntu
root@832301c940b6:/# ls
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@832301c940b6:/# cd data/
root@832301c940b6:/data# ls
Dockerfile com hi.txt
root@832301c940b6:/data# echo
Dockerfile com/ hi.txt
root@832301c940b6:/data# echo
Dockerfile com/ hi.txt
root@832301c940b6:/data# echo "ha ha ha !" > ha.txt
root@832301c940b6:/data# ls
Dockerfile com ha.txt hi.txt
複製代碼
docker run --volumes-from [container name]
複製代碼
建立一個新的容器,並掛載剛纔建立的數據卷容器 container_data
huanchu-mbp:Documents huanchu$ docker run -it --name ubuntu_test --volumes-from container_data ubuntu /bin/bash
root@1d6b918c00e5:/# ls
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@1d6b918c00e5:/# cd data/
root@1d6b918c00e5:/data# ls
Dockerfile com ha.txt hi.txt
root@1d6b918c00e5:/data# cat ha.txt
ha ha ha !
root@1d6b918c00e5:/data#
複製代碼
使用inspect命令查看掛載細節
"Mounts": [
{
"Type": "bind",
"Source": "/Users/huanchu/Documents/ttt",
"Destination": "/data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
複製代碼
方法
docker run --volumes-from [container name] -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar
複製代碼
例如
docker run --volumes-from container_data -v ~/Documents/ttt:/backup --name ubuntu_test1 ubuntu tar cvf /backup/ubuntu_test1.tar /data
複製代碼
在宿主機上能夠查看到備份的數據
huanchu-mbp:ttt huanchu$ ls -l
total 1272
-rw-r--r-- 1 huanchu staff 191 12 24 15:48 Dockerfile
drwxr-xr-x 3 huanchu staff 96 12 12 14:45 com
-rw-r--r-- 1 huanchu staff 11 12 24 17:04 ha.txt
-rw-r--r-- 1 huanchu staff 21 12 24 14:26 hi.txt
-rw-r--r-- 1 huanchu staff 593920 12 24 18:09 ubuntu_test1.tar
複製代碼
方法
docker run --volumes-from [container name] -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar
複製代碼
例如
#第一步
docker run -v ~/Documents/ttt:/data --name ubuntu_test2 ubuntu tar xvf /data/ubuntu_test1.tar
#第二步
docker run -it --volumes-from ubuntu_test2 --name ubuntu_test3 ubuntu /bin/bash
複製代碼
歡迎掃碼或微信搜索公衆號《程序員果果》關注我,關注有驚喜~