Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。
数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用`mount`挂载一个文件系统。
Docker Volume数据卷可以实现:
1)绕过“拷贝写”系统,以达到本地磁盘IO的性能,(比如运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,所以是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步。)
2)绕过“拷贝写”系统,有些文件不需要在docker commit打包进镜像文件。
3)数据卷可以在容器间共享和重用数据
4)数据卷可以在宿主和容器间共享数据
5)数据卷数据改变是直接修改的
6)数据卷是持续性的,直到没有容器使用它们。即便是初始的数据卷容器或中间层的数据卷容器删除了,只要还有其他的容器使用数据卷,那么里面的数据都不会丢失。
Docker数据持久化:
容器在运行期间产生的数据是不会写在镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。
如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。
一、创建一个数据卷
查看镜像
[root@langzi01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/tomcat latest 168588387c68 2 weeks ago 463 MB
docker.io/ubuntu latest 47b19964fb50 3 weeks ago 88.1 MB
docker.io/registry latest d0eed8dad114 4 weeks ago 25.8 MB
创建
[root@langzi01 ~]# docker run --name ubuntu -v /opt/data -t -i ubuntu:latest /bin/bash
创建文件并追加内容
root@995048cfbebb:/# cd /opt/data/
root@995048cfbebb:/opt/data# ls
root@995048cfbebb:/opt/data# echo "123" > 123
root@995048cfbebb:/opt/data# echo "123456" > 123456
root@995048cfbebb:/opt/data# ls
123 123456
退出,查看本地的系统文件:
[root@langzi01 ~]# docker inspect ubuntu|grep /var/lib/docker/volumes
"Source": "/var/lib/docker/volumes/48acac93b3fc1d1060defe7c19f9f97ae601e24a8af99b7b9f26d632ac04a920/_data",
查看文件:
[root@langzi01 ~]# cd /var/lib/docker/volumes/48acac93b3fc1d1060defe7c19f9f97ae601e24a8af99b7b9f26d632ac04a920/_data
[root@langzi01 _data]# ls
123 123456
[root@langzi01 _data]# cat 123
123
[root@langzi01 _data]# cat 123456
123456
向文件追加内容:
[root@langzi01 _data]# echo "aaaaaaaaaaaaaa" >> 123
[root@langzi01 _data]# cat 123
123
aaaaaaaaaaaaaa
进入容器查看文件
[root@langzi01 _data]# docker exec -it 995048cfbebb /bin/bash
root@995048cfbebb:/# cd opt/data/
root@995048cfbebb:/opt/data# ls
123 123456
root@995048cfbebb:/opt/data# cat 123
123
aaaaaaaaaaaaaa
二、挂载宿主机文件或目录到容器数据卷
可以直接挂载宿主机文件或目录到容器里,可以理解为目录映射,这样就可以让所有的容器共享宿主机数据,从而只需要改变宿主机的数据源就能够影响到所有的容器数据。
[root@langzi01 ~]# docker images
docker.io/centos latest 1e1148e4cc2c 2 months ago 202 MB
内容:
[root@langzi01 ~]# pwd
/root
[root@langzi01 ~]# cat ip.list
192.168.1.100
192.168.1.101
192.168.1.103
创建数据卷:
[root@localhost ~]# docker run -t -i --name test -v /root/ip.list:/centos/ip.list:ro docker.io/centos /bin/bash
--name: 指定数据卷的名字:这里为 test
-v /root/ip.list:/centos/ip.list:
"宿主机文件/目录:容器里对应的文件/目录"
。
ro: read-only 只读: 挂载的数据默认为可读写权限,但也可以根据自己的需求,将容器里挂载共享的数据设置为只读,这样数据修改就只能在宿主机上操作。如下:
[root@f0ea32bad913 /]# cat /centos/ip.list
192.168.1.100
192.168.1.101
192.168.1.103
[root@f0ea32bad913 /]# echo "192.168.1.115" >> /centos/ip.list
bash: /centos/ip.list: Read-only file system
在宿主机上修改共享数据
[root@langzi01 ~]# echo "192.168.1.115" >> ip.list
容器里查看数据:
[root@f0ea32bad913 /]# cat /centos/ip.list
192.168.1.100
192.168.1.101
192.168.1.103
192.168.1.115
三、挂载宿主机目录到容器上
[root@localhost ~]# docker run -t -i --name test -v /etc:/centos/etc.list:ro docker.io/centos /bin/bash
四、挂载宿多个主机目录到容器上
[root@localhost ~]# docker run --name data -v /opt/data1:/var/www/data1 -v /opt/data2:/var/www/data2:ro -t -i docker.io/ubuntu /bin/bash
网友评论