在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。
它的作用相当于生活中的活动硬盘,那么数据卷容器就相当于把多个活动硬盘再挂载到一个活动硬盘上,实现数据的传递依赖。
特点:
1:数据卷可以在容器之间共享或重用数据
2:数据卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止(只要有关联过的就会存在,即使父容器停止使用了关联依然存在)
Docker容器数据卷的使用操作
1、直接命令添加
(1)docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
若宿主机中无命令行输入的绝对路径目录,则自动创建目录,并使其两个目录之间产生关联,可以进行数据共享,可对文件进行读写操作。就算容器停止退出后,主机修改后的数据依然可以同步到容器内。
在宿主机上创建一个file1文件
查看到容器内的目录下也出现了file1文件
(2)docker run -it docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
给容器增加了权限,宿主机在关联的目录下可进行读写操作,而容器只能关联目录下的文件,而不能进行写操作。
2、通过Dockerfile构建
创建文件夹并在其内部编写Dockerfile
上述命令意思:
在当前的centos的根目录下面新建两个卷——dataVolumeContainer1和dataVolumeContainer2,输入命令行echo来输出"finished,-------success1"和打开中断后自动启动bash。
类似于:
docker run -it -v /host1:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 centos /bin/bash
构建Dockerfile文件生成镜像,镜像名为zzyy/centos
镜像构建完成并产生了两个卷,构建成功!
docker inspect a40bfde5eda1
使用inspect查看容器内部详细信息
其中Mounts下记录的是容器中卷的信息,Source记录对应的关联到的宿主机的地址。
在宿主机上输入地址并cd打开,可看到在容器中卷下写的文件被共享。
Config下的Volumes里记录容器中卷所在的地址。
注:
若Docker挂在主机目录Docker访问出现cannot open directory.:Permission denied。
解决办法:在挂在目录后多加一个–privileged=true参数即可
例如
docker run -it /myDataVolume:/dataVolumeContainer1 --privileged=true centos
3、数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称为数据卷容器。
通俗的讲就是可以将多个容器中的卷关联起来,进行数据共享。
运行zzyy/centos容器并命名为dc-1,在dataVolumeContainer2下新建一个文件。
Options:contianer2 --volumes-from container1
容器2从容器1中继承卷
打开dataVolume2发现可看到在dc-1容器中编写的文件
再建立dc-3容器继承dc-1的卷,可发现容器继承正确。
将dc-1(父容器)删除后,发现dc-2中之前继承dc-1卷中的文件依然存在,dc-3同理。
参考视频:尚硅谷Docker数据卷
5、docker volume ls
查看所有容器卷
6、docker volume inspect
查看指定卷中的信息。
7、docker volume rm
删除指定卷中的信息。
docker volume rm $(docker volume ls -q)
上述命令为删除所有卷
也可以使用-f或–force选项强行删除正在使用中的容器。然后再删除卷:
docker container rm –f $(docker container ls -aq)
docker volume rm my-data
参考文章:Docker数据卷之进阶篇