1. 项目目录规范 (跨平台)
良好的目录结构是环境迁移的基础。无论是在 Windows 的盘符下,还是 Unix 系的家目录中,建议统一采用如下组织方式:
my-dev-env/ # 本地开发环境总目录
├── mysql/ # MySQL 服务专用目录
│ ├── docker-compose.yml # 核心编排文件
│ ├── data/ # 数据库持久化目录 (自动生成)
│ └── conf/ # 自定义配置文件挂载点 (可选)
└── ... # 其他服务 (Redis, Nginx等)
2. 编写高性能 Docker Compose 配置
在 mysql 目录下创建 docker-compose.yml。本配置集成了资源配额、健康检查与日志管理,确保数据库在全平台运行的稳定性。
version: '3.8'
services:
db:
image: mysql:8.0.33
container_name: mysql-server
restart: always
ports:
- "3306:3306"
volumes:
# 挂载数据目录,实现数据持久化
- ./data:/var/lib/mysql
# (可选) 挂载自定义配置文件
- ./conf:/etc/mysql/conf.d
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: "YourSecurePassword"
MYSQL_DATABASE: "app_db"
MYSQL_USER: "dev_user"
MYSQL_PASSWORD: "DevPassword"
# 核心性能调优:支持 utf8mb4 并解决旧版客户端连接兼容性
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password
- --innodb_buffer_pool_size=512M # 建议设为系统可用内存的 10%-25%
- --max_connections=500
# 资源配额:防止本地开发时异常查询榨干宿主机内存
deploy:
resources:
limits:
memory: 1024M
# 健康检查:确保容器状态对外部链路透明
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
timeout: 10s
retries: 5
# 日志轮转:防止 Docker 日志撑爆磁盘空间
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
3. 跨平台部署细节解析
3.1 路径处理的艺术
在 YAML 中使用相对路径 ./data。
- Windows/macOS:路径会被自动映射到 Docker 虚拟化后端的对应位置。
- Linux:直接映射到当前 Shell 工作目录。
这种写法保证了你直接将
my-dev-env文件夹通过 Git 或云盘同步后,在任何系统都能“一键启动”。
3.2 MySQL 8.0 身份验证升级
MySQL 8.0 默认使用 caching_sha2_password。如果你的连接工具(如旧版 Navicat、DBeaver 或老旧的 JDBC 驱动)报错,配置中的 --default-authentication-plugin=mysql_native_password 是最有效的“救命稻草”。
3.3 内存限制 (Limit) 的重要性
- Windows/macOS:Docker 运行在受控的虚拟化环境中,不加限制可能导致虚拟机内存膨胀,间接让宿主机卡顿。
- Linux:Docker 原生运行,不加限制可能导致 OOM Killer 误杀系统关键进程。
4. 管理指令 (现代语法)
推荐使用 Docker V2 引入的 docker compose 指令(不再需要连字符):
# 1. 启动服务 (后台运行)
docker compose up -d
# 2. 实时查看启动日志
docker compose logs -f
# 3. 确认容器健康状态
docker compose ps
# 4. 停止并清理容器 (保留数据)
docker compose down
◎ 查询示例结语
跨平台的环境一致性是 Docker 的灵魂。通过这份配置,你可以在 Windows 开发、macOS 演示、Linux 部署。下一篇我们将引入 Redis,并展示如何利用 Docker Bridge Network 实现多容器间的“零延迟”通信。