volume
容器中数据持久化主要有两种方式:
- 多个容器之间共享数据
- 宿主机不保证存在固定的目录结构
- 持久化数据到远程主机或者云存储而非本地
- 需要备份、迁移、合并数据时。停止container,将volume整体复制,用于备份、迁移、合并等。
数据卷
本质和bind mount的操作方式一样,只不过在volume这种方式中,宿主机目录是由docker进行管理的,然后再挂载到容器中,不会覆盖容器中的对应目录文件,是共享的。
数据卷是一个可供一个或多个容器使用的特殊目录,可以绕过UFS(Unix File System)。
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
- 一个容器可以挂载多个数据卷
注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount。
docker run --name nginx-data2 -v /tmp/html:/etc/nginx/html nginx
# 这样既可将宿主机的/tmp/html路径加载到容器的/etc/nginx/html中。
数据卷容器
如果有数据需要在多个容器之间共享,此时可考虑使用数据卷容器。
[root@docker ~]# docker run -it -d -v /data --name dbdata centos6 /bin/bash
bash-4.1# ls
bin dbdata etc lib media opt root selinux sys usr
boot dev home lib64 mnt proc sbin srv tmp var
在其他容器中使用-volumes-from 来挂载nginx-volume容器中的数据卷。
[root@docker ~]# docker run -it -d --volumes-from dbdata --name web1 centos6 /bin/bash
bash-4.1# ls
bin dbdata etc lib media opt root selinux sys usr
boot dev home lib64 mnt proc sbin srv tmp var
[root@docker ~]# docker run -it -d --volumes-from dbdata --name web2 centos6 /bin/bash
bash-4.1# ls
bin dbdata etc lib media opt root selinux sys usr
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也从系统中删除。