文章目录
- 存储持久化
- 存储类型
- Volumes
- 使用场景
- 管理Volume
- 挂载Volume
- 备份恢复Volume
- Bind mounts
- 使用场景
- 挂载bind
- tmpfs
- 挂载tmpfs
存储持久化
在容器中所有创建的文件都是存储在容器可写层
- 当容器不存在后数据不会持久化,并且如果另一个进程需要数据,很难将数据取出容器
- 容器运行时可写层与宿主机是紧耦合的,无法移动数据到其他地方
- 容器可写层需要存储驱动来管理文件系统,存储驱动使用linux 内核提供了一个联合文件系统,与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能
为了持久化文件,docker为容器在宿主机存储数据提供了两个选择,volumes和bind mounts。
docker也支持容器存储文件在宿主机的内存,但文件不能持久化。如果运行docker在linux上,tmpfs mount将文件存储在宿主机的系统内存。如果运行docker在windows,pipe将文件存储在宿主机的系统内存。
存储类型
Volumes
Volumes:被存储在docker管理的宿主机文件系统的一部分(/var/lib/docker/volumes/),非docker进程不应该能修改这部分目录。在docker中,volumes是最好的持久化数据的方式。
Volumes:
- 被docker创建和管理在宿主机文件系统的一部分(/var/lib/docker/volumes/)
- 可以使用docker volume命令单独创建,也可以在创建容器和服务时创建。volume被创建后,被存储在宿主机的一个目录。当挂载volume到容器时,该目录也会挂载到容器。这和bind mount的工作方式是相似的,除了volumes是被docker管理。
- 一个volume可以同时被挂载到多个容器。
- 没有运行的容器使用时,volume不会被删除,仍然可用。可以通过docker volume prune命令手动删除未使用的volume。
- 挂载volume时,可以是命名的和匿名的,匿名的volume被第一次挂载时,docker会生成一个随机的命令来保证它在宿主机上是唯一的。volumes也支持使用volume drivers来存储数据到远程机器或者云上。
使用场景
1.在多个运行的容器中分享数据。容器停止或删除时,volume仍然存在,除非手动删除volume。
2.当宿主机不能保证给定的目录和文件结构,volumes将宿主机的配置与容器运行时解耦合。
3.当想要存储容器数据到远程主机或云上时。
4.当需要将数据从一个宿主机备份、恢复或迁移到另一台。
相比bind mount好处:
volumes可以更简单的备份和迁移数据
可以使用Docker CLI命令和Docker API来管理
在多个容器之间使用更安全
可以使用volumes drivers存储数据到远程主机和云上
管理Volume
#创建volume
docker volume create my-vol
#查看volume
docker volume ls
#查看volume信息
docker volume inspect my-vol
[{"Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/my-vol/_data","Name": "my-vol","Options": {},"Scope": "local"}
]
#删除volume
docker volume rm my-vol
挂载Volume
# --mount 多个key-value对,以逗号分隔
# 类型{type=(bind、volume、tmpfs)},名字{(source,src)=},挂载的容器路径{(dst、target)=},权限(可选,例如read-only),volume-opt(可选,指定多个配置)docker run -d \--name devtest \--mount source=myvol2,target=/app \nginx:latest# -v 三个参数以:分隔 volume的名字:挂载的容器路径:权限(可选,例如ro)docker run -d \--name devtest \-v myvol2:/app \nginx:latest
备份恢复Volume
#创建容器
docker run -d -v test:/nginx_backup --name test_store nginx
#备份 启动一个新的容器 使用tar命令备份test_store容器的volume数据到本地/root
docker run --rm --volumes-from test_store -v /root:/backup nginx tar cvf /backup/backup.tar /nginx_backup
#恢复 启动一个新的容器 解压本地/root目录的备份文件 恢复到volume
docker run --rm --volumes-from test_store -v /root:/backup nginx bash -c "cd /nginx_backup && tar xvf /backup/backup.tar --strip 1"
Bind mounts
Bind mounts:可以存储在宿主机的任何地方。它们甚至可能是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程可以随时修改它们。
使用场景
- 分享宿主机配置文件到容器。例如,dns解析配置文件/etc/resolv.conf
- 在Docker主机和容器上的开发环境之间共享源代码或构建工件。例如,您可以将Maven目标/目录挂载到容器中,并且每次在Docker主机上构建Maven项目时,容器都可以访问重新构建的工件。如果您以这种方式使用Docker进行开发,那么您的生产Dockerfile将直接将生产就绪的工件复制到映像中,而不是依赖于绑定挂载。
- 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时。
Bind mounts:docker早期的使用方式。相比较volumes功能有限。当使用bind mount,宿主机上的文件和目录会被挂载到容器。在宿主机上文件和目录通过全路径名来引用。文件和目录可以不存在,如果不存在会按需创建。bind mounts性能很好,但是它依赖于宿主机特定目录结构的文件系统。不能使用dockr cli命令直接管理bind mounts。使用bind mounts,可以通过容器中运行的进程来更改主机文件系统,可能会影响到宿主机的其他进程,会有安全隐患。
挂载bind
# --mount 多个key-value对,以逗号分隔
# 类型{type=(bind、volume、tmpfs)},宿主机路径{(source,src)=},挂载的容器路径{(dst、target)=},权限(可选,例如read-only),bind-propagation(可选,指定多个配置)docker run -d \-it \--name devtest \--mount type=bind,source="$(pwd)"/target,target=/app \nginx:latest# -v 三个参数以:分隔 宿主机路径:挂载的容器路径:(可选,逗号分隔的多个选项)docker run -d \-it \--name devtest \-v "$(pwd)"/target:/app \nginx:latest
tmpfs
tmpfs mounts:
- 仅仅存储在宿主机的系统内存中,不会持久化存储到宿主机的文件系统。
- 在容器的生命周期内,可以用来存储非持久化的数据和敏感信息。例如,swarm service使用tmpfs mount来挂载secrets到服务容器。
挂载tmpfs
# --mount 多个key-value对,以逗号分隔
# 类型{type=(bind、volume、tmpfs)},挂载的容器路径{(dst、target)=},大小限制,可选,单位比特,默认无限制{(tmpfs-size)=},文件模式,可选{(tmpfs-mode)=}docker run -d \-it \--name tmptest \--mount type=tmpfs,destination=/app \nginx:latestdocker run -d \-it \--name tmptest \--tmpfs /app \nginx:latest