重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
文章首发于公众号《程序员果果》
创新互联是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十载时间我们累计服务了上千家以及全国政企客户,如成都橡塑保温等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致赞扬。
地址:https://mp.weixin.qq.com/s/qg8eXHobNxzfPAaHB3U9cw
docker的理念之一就是将应用和运行的环境打包,因此docker容器的生存周期通常都是与在容器中运行的程序相同的,而我们对数据的要求是持久化,docker容器之间也需要一个共享数据的渠道。这些需求就催生了docker数据卷的诞生。
docker数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或多个容器提供访问。
数据卷设计的目的,在于数据的永久化,它完全独立于容器的生命周期。因此,docker不会在容器删除时删除其挂在的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据进行处理
#为容器添加数据卷使用-v选项
docker run -v ~/container_data:/data -it IMAGE /bin/bash
容器中
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
宿主机
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 ?
挂载的数据默认为可读写权限。
但也可以根据自己的需求,将容器里挂载共享的数据设置为只读,这样数据修改就只能在宿主机上操作,用法如下:
#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创建的镜像生成的容器,可以看到如下信息:
可以看到两个挂载点的信息。
"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
欢迎关注我的公众号《程序员果果》,关注有惊喜~~
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。