四种方式区别
- docker四种方式:默认、volumes数据卷、bind mounts挂载、tmpfs mount(仅在linux环境中提供),其中volumes、bind mounts两种实现持久化容器数据;
- 默认:数据保存在运行的容器中,容器删除后,数据也随之删除;
- volumes:数据卷,数据存放在主机文件系统/var/lib/docker/volumes/目录下,该目录由docker管理,其它进程不允许修改,推荐该种方式持久化数据;
- Bind mounts:直接挂载主机文件系统的任何目录或文件,类似主机和容器的共享目录,主机上任何进程都可以访问修改,容器中也可以看到修改,这种方式最简单。
- tmpfs:数据暂存在主机内存中,不会写入文件系统,重启后,数据删除。
默认方式
默认方式,容器本身管理自己的数据,容器文件系统实际是一系列只读的文件层和最上层的容器可写文件层组成,最上层的容器可写文件层保留容器运行过程中产生的所有数据修改,这些层的管理是利用容器的Storage drivers实现(默认是Overlay2,可以通过docker的dameon.json配置文件修改),对容器内部文件系统是透明的。
由于容器在文件系统之上又封装了一层storage drivers,性能比不上bind或volumes,不建议生产环境使用。
volumes
简单理解,volumes是由docker创建和管理,存放在主机文件系统的某个目录,linux下面就在/var/lib/docker/volumes/.
要点:
- 适用于多个容器之间共享数据,特别是Bind mounts无法使用时;
- docker volume create命令创建或者docker run启动容器时选项 --volume 或者–mount 时创建;
- 同一个volume可以同时被多个容器挂载,当没有容器使用该volume,也不会自动删除;
- 空volume挂载到容器已有文件的目录,容器目录的文件则会被拷贝到该volume;
- bind mount或者非空volume被挂载到容器已有文件的目录,则容器已有的文件被隐藏,无法访问,直到unmount;
- 支持volume drivers选项,可以存储数据在本机、远程主机、或云平台;
- 方便备份:/var/lib/docker/volumes/ 备份即可
Bind mounts
直接将主机的目录挂载到容器内部,容器内部的操作会影响宿主机的文件,docker无法管理,依赖主机文件系统管理。
要点:
- 适合主机和容器间共享配置文件,例如docker默认将主机的/etc/resolv.conf共享给每个容器,提供dns服务;
- 主机开发环境和容器共享源代码或构件组件,例如将本机的Maven 的target/目录挂载进入容器,每次本机构建完毕,容器即可看到最新的版本;
- 挂载的目录必须在主机上存在,容器中则会根据需要创建;
tmpfs mounts
直接将数据临时存放在主机内存中,在容器运行期间有