Docker的镜像是只读的,但是容器是可写的,我们可以将数据写入到容器,不过一旦容器删除数据将会丢失,所以需要将容器数据进行持久化存储。
文章目录
1、容器数据持久化–bind mount
– 理论
将宿主机中的目录(文件)挂载到容器上。其上的数据可以被宿主机读写,也可以被mount它的所有容器读写。
对挂载陌生的跳这里–>mount
– 实例
//创建测试用的挂载目录/data/mount
mkdir /data/mount
echo 'bind mount' > /data/mount/mount.txt
//创建容器,-v指定主机目录和容器目录的挂载关系
docker run -itd --name c1 -v /data/mount:/docker busybox
//查看容器中文件mount的内容
docker exec c1 cat /docker/mount.txt
//容器中更改mount.txt文件的内容
docker exec c1 echo "bind mount test" >> /docker/mount.txt
//在宿主机查看mount.txt文件的内容,看到已被更改
cat /data/mount/mount.txt
以上,即bind mount的数据可以被mount它的所有容器读写。
//在host中编辑mount.txt文件,写入it is host's writing
//在容器中查看mount.txt文件
docker exec c1 cat /docker/mount.txt
以上,即bind mount的数据可以被宿主机读写。
2、容器数据持久化–Volumes
– 理论
volume由Docker来管理,如创建卷、删除卷。volume的存储空间来自于宿主机文件系统中的某个目录,如/var/lib/docker/volumes/,docker系统之外的程序不应该修改其中的数据。volume是官方推荐的持久化方案。
– 实例
指定挂载目录:
//-v指定挂载目录,宿主机目录/docker/volumes/volume_name/_data
docker run -itd --name c3 -v volume01:/dir/c3 busybox
将容器c3的/dir/c3数据卷挂载到宿主机/docker/volumes/volume_name/_data目录下
不指定挂载目录:
//不指定挂载目录,宿主机中创建/docker/volumes/id号/_data
docker run -itd --name c4 -v volume01 busybox
容器c4的/volume01数据卷挂载到宿主机的Source后的目录下:
修改容器中的数据,查看宿主机:
总结就是注意Source后的目录(对应宿主机)和Destination后的目录(对应容器数据卷)。
– docker volume管理命令
#创建volume
docker volume create volume_test
#查看卷的参数信息
docker inspect volume_test(和docker volume inspect xxx一样)
#查看docker数据卷
docker volume ls
#删除不用的数据卷
docker volume prune
#删除一个或多个数据卷
docker volume rm xxx
#使用卷-v指定
docker run -itd –name c1 -v volume_test busybox
#查看容器卷信息
docker inspect 容器名 |grep -i volume
或docker inspect -f {{.Mount}} 容器名
TIP: Docker指令中使用{ }
eg1:
docker inspect 容器名 | grep -i xx -A5
等价于docker inspect 容器名 -f {{.xx}}eg2:
删除多个容器名相似的容器,如容器c1、c2、c3、c4
docker rm -f c{1,2,3,4}
3、tmpfs mounts
– 理论
tmpfs是将文件写到内存中,所以这样做不到数据持久化,但可以避免写数据到容器层增加容器大小。但tmpfs有缺点:只能在Linux Host上使用且不能在多个容器间共享。
– 实例
docker run -dit --name c5 --tmpfs /test busybox
4、三种方式的区别与联系
- volume与bind mounts相比,后者依赖于 Host 上有特定的目录结构,而前者不需要,使用 volume 时文件的管理由 Docker 主导而不是 Host
- volume映射的文件/文件夹不需要存在于 Host 上,它们是按需生成的,即可以被自动创建,不需要实现在 Host 上创建。但bind mounts 依赖 Host 上存在特定的目录结构,这对于部署到新主机上显然不是一件好事
- 若容器产生的数据不需要持久化,可以考虑使用tmpfs来避免持久化数据和写入容器层(writable layer),从而提高性能
5、docker volume数据共享
– 理论
- 挂载相同的目录
- 使用容器数据卷,–volumes-from 容器名,就会传递容器的挂载目录
– 实例
//创建容器c6
//--volumes-from 使用其它容器的volume
docker run -itd --name c6 --volumes-from c5 busybox
查看c6容器的数据卷信息,可以看到和c3一样。文件c3.txt已共享
–volumes-from可以有多个,即共享多个容器的数据
docker run -itd --name c7 --volumes-from c1 busybox --volumes-from c2 busy
6、docker volume备份
- 备份实例:
docker run --rm --name test_container --volumes-from c3 -v $(pwd):/backup busybox tar cvf /backup/backup.tar /dir/c3
- 实现思路:
docker run后加–rm,创建一个测试容器(退出后自动删除该容器)。–volumes-from 后为要加载容器卷的容器,并从本地主机挂载当前到容器的 /backup 目录。测试容器启动后,使用了 tar 命令来将要备份的卷备份为本地的 backup.tar。
7、docker volume使用NFS存储
NFS看这里here
//NFS服务端,配置nfs共享
yum install nfs-utils rpcbind -y
mkdir -p /data/nfs/docker
echo "/data/nfs *(rw,no_root_squash,sync)">>/etc/exports
exportfs -r
systemctl start rpcbind nfs-server
systemctl enable rpcbind nfs-server
showmount -e localhost
//安装nfs客户端
yum install -y nfs-utils rpcbind
//创建volume 连接 xx.xx.xx.xx:/data/nfs
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=xx.xx.xx.xx,rw \
--opt device=:/data/nfs \
volume-nfs
//查看
docker volume ls
docker volume inspect volume-nfs
//容器使用volume-nfs
docker run -dit --name test_container -v volume-nfs:/nfs busybox
//查看容器挂载信息
docker inspect -f {{.Mounts}} test_container
df -h |grep /data/nfs
//volume目录/var/lib/docker/volumes/volume-nfs/_data自动挂载到了nfs服务上
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/146185.html