Docker Storage

文章目录

  • 存储持久化
  • 存储类型
    • Volumes
      • 使用场景
      • 管理Volume
      • 挂载Volume
      • 备份恢复Volume
    • Bind mounts
      • 使用场景
      • 挂载bind
    • tmpfs
      • 挂载tmpfs

存储持久化

在容器中所有创建的文件都是存储在容器可写层

  • 当容器不存在后数据不会持久化,并且如果另一个进程需要数据,很难将数据取出容器
  • 容器运行时可写层与宿主机是紧耦合的,无法移动数据到其他地方
  • 容器可写层需要存储驱动来管理文件系统,存储驱动使用linux 内核提供了一个联合文件系统,与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能

为了持久化文件,docker为容器在宿主机存储数据提供了两个选择,volumes和bind mounts。
docker也支持容器存储文件在宿主机的内存,但文件不能持久化。如果运行docker在linux上,tmpfs mount将文件存储在宿主机的系统内存。如果运行docker在windows,pipe将文件存储在宿主机的系统内存。

存储类型

Docker Storage_第1张图片

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进程可以随时修改它们。

使用场景

  1. 分享宿主机配置文件到容器。例如,dns解析配置文件/etc/resolv.conf
  2. 在Docker主机和容器上的开发环境之间共享源代码或构建工件。例如,您可以将Maven目标/目录挂载到容器中,并且每次在Docker主机上构建Maven项目时,容器都可以访问重新构建的工件。如果您以这种方式使用Docker进行开发,那么您的生产Dockerfile将直接将生产就绪的工件复制到映像中,而不是依赖于绑定挂载。
  3. 当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:latest
  
  
  docker run -d \
  -it \
  --name tmptest \
  --tmpfs /app \
  nginx:latest

你可能感兴趣的:(Docker,docker,容器,运维)