volume

容器中数据持久化主要有两种方式:

  1. 数据卷(Data Volumes)
  2. 数据卷容器(Data Volumes Dontainers)

    适用场景

  • 多个容器之间共享数据
  • 宿主机不保证存在固定的目录结构
  • 持久化数据到远程主机或者云存储而非本地
  • 需要备份、迁移、合并数据时。停止container,将volume整体复制,用于备份、迁移、合并等。

    数据卷

    本质和bind mount的操作方式一样,只不过在volume这种方式中,宿主机目录是由docker进行管理的,然后再挂载到容器中,不会覆盖容器中的对应目录文件,是共享的。
    数据卷是一个可供一个或多个容器使用的特殊目录,可以绕过UFS(Unix File System)。
  1. 数据卷可以在容器之间共享和重用
  2. 对数据卷的修改会立马生效
  3. 对数据卷的更新,不会影响镜像
  4. 数据卷默认会一直存在,即使容器被删除
  5. 一个容器可以挂载多个数据卷

注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount。

  1. docker run --name nginx-data2 -v /tmp/html:/etc/nginx/html nginx
  2. # 这样既可将宿主机的/tmp/html路径加载到容器的/etc/nginx/html中。

数据卷容器

如果有数据需要在多个容器之间共享,此时可考虑使用数据卷容器。

  1. [root@docker ~]# docker run -it -d -v /data --name dbdata centos6 /bin/bash
  2. bash-4.1# ls
  3. bin dbdata etc lib media opt root selinux sys usr
  4. boot dev home lib64 mnt proc sbin srv tmp var

在其他容器中使用-volumes-from 来挂载nginx-volume容器中的数据卷。

  1. [root@docker ~]# docker run -it -d --volumes-from dbdata --name web1 centos6 /bin/bash
  2. bash-4.1# ls
  3. bin dbdata etc lib media opt root selinux sys usr
  4. boot dev home lib64 mnt proc sbin srv tmp var
  5. [root@docker ~]# docker run -it -d --volumes-from dbdata --name web2 centos6 /bin/bash
  6. bash-4.1# ls
  7. bin dbdata etc lib media opt root selinux sys usr
  8. boot dev home lib64 mnt proc sbin srv tmp var

web1、web2两个容器即可共享dbdata这个容器中的文件。即使nginx-volume停止,也不会有任何影响。

bind mount

如果bind mount一个非空目录或者文件,则容器目录中的原始内容将被遮蔽,当解决挂载时则自动恢复。

适用场景

  • container共享宿主机配置文件。比如docker会将宿主机文件/etc/resov.conf文件bind mount到容器上,两者会使用相同的DNS服务器。
  • 开发环境中宿主机与container之间共享源代码、构建构件等。比如将整个build过程container化,将宿主机上的源代码文件夹bind mount到build container中。修改代码后,运行build container的build命令,build container则将build结构写入另一个bind mount的文件夹中。
  • 一些监控类container,通过读取宿主机固定文件中的数据实现监控等。


tmpfs mount

将宿主机的内存挂载到容器中。它能被容器用来存放非持久化的状态或敏感信息,有特定的应用场景。比如docker可将用户名与密码等敏感数据保存在某个数据库中,当启动需要访问这些敏感数据的container或者service时,docker会在宿主机上创建一个tmpfs,然后将敏感数据从数据库读出写到tmpfs中,再将tmpfs mount到container中,安样能保证数据安全。当容器停止运行时,则相应的tmpfs也从系统中删除。