version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
volumes:
- dbdata:/var/lib/mysql
ports:
- "3306:3306"
volumes:
dbdata:
有些新手同学又问到详细的docker应用映射文件详解,我这里再说一下
以上面的compose代码为例
容器和宿主机(nas)之间的数据交换有2种形式,分别是“绑定挂载”(Bind Mounts)和“卷”(Volumes)
1、绑定挂载 (Bind Mounts)定义:
绑定挂载将宿主机(nas)上的任意文件或目录挂载到容器内(部分nas没有给文件绑定挂载的权限)。这种方式允许你直接访问宿主机(nas)上的文件系统。
特点:
灵活性:可以直接指定宿主机(nas)上的任何文件或目录。
实时更新:宿主机(nas)上的文件更改会立即反映到容器中,反之亦然。
路径依赖:绑定挂载的路径必须在宿主机(nas)上存在,并且路径是固定的,更换宿主机时需要重新配置路径。
权限问题:需要确保宿主机(nas)和容器之间的文件权限匹配(这个是界面直接源代码部署docker应用时必须注意的)
举例,在web容器配置中:
volumes: 将宿主机(nas)的 ./html 目录绑定挂载到容器的 /usr/share/nginx/html 目录,这样可以在宿主机(nas)上编辑静态文件并实时看到效果。
volumes:
- ./html:/usr/share/nginx/html
2、卷 (Volumes)定义:
卷是由 Docker 管理的数据存储空间,可以独立于容器的生命周期存在。卷可以被多个容器共享,并且可以被持久化保存,即使容器被删除,卷中的数据仍然保留。
特点:
数据持久化:即使容器被删除,卷中的数据仍然保留。
共享和重用:多个容器可以同时使用同一个卷。
更好的隔离性:卷只对 Docker 可见,对外界更加安全。
支持备份或恢复:可以方便地备份和恢复卷中的数据。
路径独立:卷的路径由 Docker 管理,不需要关心具体的宿主机(nas)路径。
举例,在db容器配置中:
volumes: 使用一个命名卷 dbdata 来持久化 MySQL 的数据
volumes:
- dbdata:/var/lib/mysql
同时在最后volumes: 定义了一个命名卷 dbdata,用于持久化 MySQL 的数据
volumes:
dbdata:
区别总结
数据管理:
绑定挂载:数据管理由宿主机(nas)负责,路径固定,需要手动管理文件权限。
卷:数据管理由 Docker 负责,路径独立,Docker 自动处理文件权限。
持久化:
绑定挂载:数据持久化取决于宿主机(nas)上的文件系统,如果宿主机(nas)上的文件被删除,数据也会丢失。
卷:数据持久化由 Docker 管理,即使容器被删除,卷中的数据仍然保留。
灵活性:
绑定挂载:可以直接访问宿主机(nas)上的任意文件或目录,适合开发环境。
卷:更适合生产环境,因为卷提供了更好的隔离性和安全性。
迁移:
绑定挂载:迁移数据需要手动复制文件。
卷:可以使用 docker volume 命令轻松备份和恢复卷中的数据。
选择建议
开发环境:如果你需要频繁修改文件并且希望这些更改立即反映到容器中,绑定挂载是一个不错的选择。
生产环境:如果你需要数据持久化和更好的隔离性,建议使用卷。