Docker的三种数据持久化方式

1、为什么要数据持久化

  Docker容器化部署后,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失。比如,使用docker部署的数据库服务,容器一删除,数据全丢了,这样显然不符合实际应用场景。所以,我们需要将数据持久化。

2、Docker数据持久化的三种方式

  Docker提供了三种不同的方式将数据从宿主机挂载到容器中:volumebind mountstmpfs mounts

  volume:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)

  bind mounts:可以存储在宿主机系统的任意位置

  tmpfs mounts:挂载存储在宿主机的内存中,不会写入宿主机的文件系统

3、volume(普通数据卷)

  3.1、创建docker volume

# 创建volume数据卷
docker volume create for_nginx
# 查看创建的volume
docker volume ls

    注意:创建数据卷后,会在本机的/var/lib/docker/volumes目录下创建相应的文件夹

    

   3.2、运行容器并挂载(nginx为例,我的nginx镜像tag为1.23.3)

# 运行容器并挂载(nginx为例)
docker run --name munginx -d -p 80:80 --mount type=volume,source=for_nginx,target=/usr/share/nginx/html nginx:1.23.3

    注意:运行完容器后,会在本机相应的目录中会将容器内相关目录中的文件挂载出来。

       如图,宿主机上出现了两个html文件,是创建nginx容器时生成的文件。

      

   3.3、测试修改挂载目录下的文件

    3.3.1、进入容器创建文件

# 进入容器内部
docker exec -it 84608669dfc0 /bin/bash
# cd到具体目录
cd usr/share/nginx/html/
# 创建一个test.html文件
echo "container write info" > test.html

      测试访问

      

    3.3.2、直接在宿主机上创建文件

# cd到宿主机相应目录
cd /var/lib/docker/volumes/for_nginx/_data
# 创建一个testhost.html文件
echo "host write info" > testhost.html

      测试访问:

      

     总结:不管是在容器内还是在宿主机上创建的文件,两者是互通的。

    宿主机上:

    容器内:

4、bind mounts(绑定数据卷)

  4.1、在宿主机上创建相应目录

    

  4.2、运行容器并挂载(nginx为例,我的nginx镜像tag为1.23.3)

# 运行容器并设置挂载(正常方式)
docker run --name mynginx1 -d -p 80:80 --mount type=bind,source=/home/docker/volumes/nginx,target=/usr/share/nginx/html nginx:1.23.3
# 运行容器并设置挂载(-v方式)简写
docker run --name mynginx1 -d -p 80:80 -v /home/docker/volumes/nginx:/usr/share/nginx/html nginx:1.23.3

  4.3、进入容器cd到相应目录并创建文件

# 进入容器内部
docker exec -it 969cb895b621 /bin/bash
# cd到具体目录
cd usr/share/nginx/html/
# 创建一个test.html文件
echo "container write info" > test.html

     进入到相应目录后会发现,没有任何文件

    注意:如果你使用bind mounts挂载宿主机目录到一个容器中的非空目录,那么此容器中非空目录中的文件会被清空,容器中访问的这个目录直接就是宿主机上的相应挂载目录。

  4.4、在宿主机上创建文件并测试

    这里就不演示了,效果和3.3.2里面的一样。

 5、tmpfs mounts(临时数据卷)

# 挂载方式运行容器
docker run --name mynginx -d --mount type=tmpfs,target=/usr/share/nginx/html nginx:1.23.3
# 进入容器
docker exec -it 969cb895b621 /bin/bash
# cd到具体目录
cd usr/share/nginx/html/
# 创建test.html文件
echo "container write info" > test.html

  注意:删除容器重新创建容器后发现数据丢失,临时卷无法持久化数据

6、总结

 volumes:

  • 需要创建docker volume,docker volume的存储是在docker安装目录内,卸载docker会丢失
  • 创建容器时会将容器内文件映射到docker volume的相应目录上,并且不管宿主机还是容器内操作挂载目录中的文件都是互通的。
  • 多个运行容器间共享数据,备份、恢复、或将数据从一个Docker主机迁移到另一个Docker主机时。

 bind mount:

  • 需要手动在宿主机上创建挂载的目录(或者利用现有的),数据直接存在了宿主机硬盘上,删除容器或者卸载docker,数据并不会消失
  • 创建容器时,会将宿主机上目录上的文件覆盖容器内的相应目录,所以此方法挂载需要预先将容器内相应被挂载目录的文件复制出来:详情见 Docker安装nginx中的4.3项
  • 主机与容器共享配置文件(Docker默认情况下通过这种方式为容器提供DNS解析,通过将/etc/resolv.conf挂载到容器中)
  • 命令有简写的 -v 方式,详情见4.2项

 tmpfs mount:

  • 既不想将数据存于主机,又不想存于容器中时(这可以是出于安全的考虑,或当应用需要写大量非持久性的状态数据时为了保护容器的性能)。
posted @ 2023-01-03 17:41  关心千九  阅读(2726)  评论(0编辑  收藏  举报