Docker - 存储
Docker - 存储(卷 Volumes 和绑定挂载 Bind Mounts)
Section titled “Docker - 存储(卷 Volumes 和绑定挂载 Bind Mounts)”默认情况下,容器是短暂易失的(ephemeral)。在容器的可写层(writable layer)中创建的文件会在容器被移除时丢失。为了持久化数据或在容器与宿主机之间共享数据,Docker 提供了存储机制:卷(Volumes)和绑定挂载(Bind Mounts)。
卷(Volumes)
Section titled “卷(Volumes)”卷是用于持久化由 Docker 容器生成和使用的数据的首选机制。主要特点如下:
- 由 Docker 管理: 卷由 Docker 创建和管理(在 Linux 上默认位于
/var/lib/docker/volumes/)。 - 独立的生命周期: 卷独立于容器而存在。即使使用它们的容器停止或移除,卷也会持久保存。
- 平台无关性: 卷在 Linux 和 Windows 容器上一致工作。
- 性能: 与从宿主机文件系统进行绑定挂载相比,卷通常能为 I/O 密集型工作负载提供更好的性能(尤其是在 Docker Desktop 上)。
- 特性: 支持卷驱动程序(volume drivers),允许在远程主机或云提供商上存储数据。
- 安全共享: 可以安全地在多个容器之间共享。
使用命名卷(Named Volumes)
Section titled “使用命名卷(Named Volumes)”你可以显式创建命名卷,或者让 Docker 在启动容器时自动创建它们。
# Create a named volume explicitlydocker volume create my-data-volume
# Run a container and mount the named volume to /app/datadocker run -d --name my-app -v my-data-volume:/app/data my-image
# If 'another-volume' doesn't exist, Docker creates it automatically heredocker run -d --name other-app -v another-volume:/var/log my-other-imagemy-app 写入 /app/data 的数据将存储在由 Docker 管理的、宿主机上的 my-data-volume 中。
管理卷(Managing Volumes)
Section titled “管理卷(Managing Volumes)”# List volumesdocker volume ls
# Inspect a volume (shows mount point on host, etc.)docker volume inspect my-data-volume
# Remove a volume (must not be in use by any container)docker volume rm my-data-volume
# Remove all unused volumes (dangling volumes)docker volume prune绑定挂载(Bind Mounts)
Section titled “绑定挂载(Bind Mounts)”绑定挂载将宿主机上的文件或目录直接映射到容器内部。宿主机上的路径是显式指定的。
- 直接访问宿主机: 允许容器直接访问和修改宿主机文件。
- 依赖于宿主机路径: 绑定到宿主机的特定目录结构,使得容器的可移植性较差。
- 性能: 可能存在性能问题,尤其是在文件数量多或 Docker Desktop 上频繁进行 I/O 操作时。
- 用途: 非常适合从宿主机向容器共享配置文件、在开发期间共享源代码以实现热重载,或者访问宿主机资源(例如 Docker socket)。
使用绑定挂载(Using Bind Mounts)
Section titled “使用绑定挂载(Using Bind Mounts)”# Mount local './src' directory into '/app' in the containerdocker run -d --name dev-container -v "${PWD}/src":/app my-dev-image
# Mount a single config file (read-only)docker run -d --name configured-app -v "${PWD}/config.yml":/etc/app/config.yml:ro my-app-image在 dev-container 内部对 /app 所做的更改将直接反映在宿主机上的 ./src 目录中,反之亦然。
tmpfs 挂载(tmpfs Mounts)
Section titled “tmpfs 挂载(tmpfs Mounts)”Tmpfs 挂载仅将数据存储在宿主机的系统内存中。它们是临时性的,永远不会写入宿主机文件系统或容器的可写层。对于不想持久保存的敏感数据或需要高性能的临时状态非常有用。
# Mount a tmpfs at /app/cache inside the containerdocker run -d --name temp-app --mount type=tmpfs,destination=/app/cache my-app-image# Or using the older --tmpfs flag# docker run -d --name temp-app --tmpfs /app/cache my-app-image存储驱动程序(Storage Drivers)
Section titled “存储驱动程序(Storage Drivers)”存储驱动程序管理镜像和可写容器层如何与宿主机文件系统交互。它们处理 Docker 镜像的分层架构(写时复制 copy-on-write)。
overlay2:大多数现代 Linux 发行版上的首选存储驱动程序。通常高效且性能良好。btrfs、zfs:使用底层文件系统特性。可以提供高级功能,但需要特定的宿主机文件系统设置。aufs:一个较旧的分层文件系统驱动程序,很大程度上已被overlay2取代。devicemapper:另一个较旧的驱动程序,常用于 RHEL/CentOS 7。vfs:简单但效率低下;不推荐用于生产环境。
除非遇到特定的兼容性或性能问题,否则通常无需更改默认存储驱动程序。使用 docker info 检查当前的驱动程序:
docker info | grep 'Storage Driver'存储驱动程序的配置是通过 Docker 守护进程配置文件 (/etc/docker/daemon.json) 完成的。