【Docker进阶篇】Docker 容器数据持久化

Docker的镜像是只读的,但是容器是可写的,我们可以将数据写入到容器,不过一旦容器删除数据将会丢失,所以需要将容器数据进行持久化存储。

文章目录

  • 1、容器数据持久化--bind mount
    • - 理论
    • - 实例
  • 2、容器数据持久化--Volumes
    • - 理论
    • - 实例
    • - docker volume管理命令
  • 3、tmpfs mounts
    • - 理论
    • - 实例
  • 4、三种方式的区别与联系
  • 5、docker volume数据共享
    • - 理论
    • - 实例
  • 6、docker volume备份
  • 7、docker volume使用NFS存储

【Docker进阶篇】Docker 容器数据持久化_第1张图片

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

【Docker进阶篇】Docker 容器数据持久化_第2张图片
以上,即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进阶篇】Docker 容器数据持久化_第3张图片
【Docker进阶篇】Docker 容器数据持久化_第4张图片

修改容器中的数据,查看宿主机表现:
【Docker进阶篇】Docker 容器数据持久化_第5张图片


不指定挂载目录:

//不指定挂载目录,宿主机中创建/docker/volumes/id号/_data

docker run -itd --name c4 -v volume01 busybox

容器c4的/volume01数据卷挂载到宿主机的Source后的目录下:
【Docker进阶篇】Docker 容器数据持久化_第6张图片
修改容器中的数据,查看宿主机:
【Docker进阶篇】Docker 容器数据持久化_第7张图片
总结就是注意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}

如下图中查看容器inspect信息中的挂载信息和删除容器
【Docker进阶篇】Docker 容器数据持久化_第8张图片


3、tmpfs mounts

- 理论

tmpfs是将文件写到内存中,所以这样做不到数据持久化,但可以避免写数据到容器层增加容器大小。但tmpfs有缺点:只能在Linux Host上使用且不能在多个容器间共享。

- 实例

docker run -dit --name c5 --tmpfs /test busybox

查看容器c5元信息:
【Docker进阶篇】Docker 容器数据持久化_第9张图片


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已共享
【Docker进阶篇】Docker 容器数据持久化_第10张图片
–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服务上

【Docker进阶篇】Docker 容器数据持久化_第11张图片

你可能感兴趣的:(Docker学习笔记,docker,容器)