绑定挂载(Bind Mount)
命名卷(Data Volume)
区别 | 绑定挂载(Bind Mount) | 命名卷(Data Volume) |
---|---|---|
存储位置 | 直接映射到宿主机文件系统的指定路径(如 /Users/name/data:/var/lib/postgresql/data);数据完全由用户控制,路径可见。 | 存储在 Docker 管理的 /var/lib/docker/volumes/ 目录下,路径由 Docker 自动分配。;数据由 Docker 管理,路径不直接暴露(需 docker volume inspect 查看)。 |
创建方式 | 在 docker run -v 或 docker-compose.yml 中(也就是services中指定volumes选项)指定宿主机路径:-v /host/path:/container/path;如果宿主机目录不存在,Docker 不会自动创建(可能导致错误)。 | 先显式创建卷(可选):docker volume create my_volume再挂载:-v my_volume:/container/path;在docker-compose.yml 中和services平齐额外的volumes选项;如果卷不存在,Docker 会自动创建匿名卷或命名卷。 |
数据生命周期 | 数据随宿主机目录存在而存在,删除容器不影响数据 | 数据独立于容器,删除容器后卷仍保留(需手动 docker volume rm 删除 |
性能与功能 | 性能更高(直接读写宿主机文件系统);适合开发调试(快速修改代码或配置文件);支持挂载单个文件(如 -v /host/config.yml:/app/config.yml | 性能略低(经过 Docker 存储驱动层)。;适合生产环境(数据隔离、备份方便);只能挂载目录,不能单独挂载文件 |
权限管理 | 继承宿主机的文件权限(可能导致容器内权限问题,需 chmod 调整)。 | Docker 自动设置合理的权限(通常更兼容容器内应用)。 |
典型使用场景 | 开发时挂载源代码目录;挂载配置文件(如 nginx.conf);需要直接访问宿主机文件(如备份恢复) | 数据库持久化(如 PostgreSQL、MySQL 数据目录); 多个容器共享数据(如日志集中存储);生产环境需要数据隔离和自动管理 |
总结 | 灵活、直接,适合开发和明确路径的场景 | 自动化,适合生产环境和数据库持久化 |