以下是一个完整的 Markdown(.md
)文档,详细描述了如何使用 Docker Compose 部署 MySQL 5.7 容器,并实现数据持久化与自动启动功能:
使用 Docker Compose 部署 MySQL 5.7 容器(含数据持久化与自启动)
目录
目标概述
通过 Docker Compose 快速部署一个 MySQL 5.7 容器,实现:
- 数据持久化(避免容器删除后数据丢失)
- 自动启动 MySQL 服务(容器重启策略)
- 可选的自定义配置和初始化脚本
前置条件
- 已安装 Docker 和 Docker Compose
- 基础 Linux 命令行操作知识
部署步骤
1. 创建项目目录
mkdir mysql57-docker-compose
cd mysql57-docker-compose
2. 编写 docker-compose.yml
创建文件 docker-compose.yml
,内容如下:
version: '3.8'
services:
mysql57:
image: mysql:5.7
container_name: mysql57
environment:
MYSQL_ROOT_PASSWORD: root # 设置root密码
ports:
- "3306:3306" # 端口映射
volumes:
- ./mysql_data:/var/lib/mysql # 数据持久化
restart: always # 自动重启策略
3. (可选)自定义 MySQL 配置
创建 my.cnf
文件配置字符集:
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
在 docker-compose.yml
的 volumes
部分添加挂载:
volumes:
- ./mysql_data:/var/lib/mysql
- ./my.cnf:/etc/mysql/conf.d/my.cnf # 挂载配置文件
4. (可选)初始化 SQL 脚本
创建 init.sql
初始化数据库:
CREATE DATABASE IF NOT EXISTS flaskblog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'flaskuser'@'%' IDENTIFIED BY 'flaskpass';
GRANT ALL PRIVILEGES ON flaskblog.* TO 'flaskuser'@'%';
FLUSH PRIVILEGES;
在 docker-compose.yml
中添加挂载:
volumes:
- ./mysql_data:/var/lib/mysql
- ./my.cnf:/etc/mysql/conf.d/my.cnf
- ./init.sql:/docker-entrypoint-initdb.d/init.sql # 初始化脚本
⚠️ 注意:初始化脚本仅在首次启动时执行一次!
5. 启动 MySQL 容器
docker-compose up -d
6. 验证 MySQL 运行状态
# 查看运行中的容器
docker ps
# 测试连接(需安装MySQL客户端)
mysql -h 127.0.0.1 -P 3306 -u root -p
# 或进入容器内部连接
docker exec -it mysql57 mysql -uroot -proot
关键配置说明
配置项 | 作用 |
---|---|
image: mysql:5.7 | 使用官方MySQL 5.7镜像 |
volumes | 数据持久化挂载 |
restart: always | 容器自动重启策略 |
environment | 设置环境变量(如密码) |
/docker-entrypoint-initdb.d/ | 初始化脚本自动执行目录 |
项目结构示例
mysql57-docker-compose/
├── docker-compose.yml # 主配置文件
├── my.cnf # (可选)MySQL配置文件
└── init.sql # (可选)初始化SQL脚本
└── mysql_data/ # 自动生成的数据卷目录
常见问题
Q1: 如何修改MySQL root密码?
A: 修改docker-compose.yml
中的MYSQL_ROOT_PASSWORD
后,需要删除旧容器和数据卷重新创建:
docker-compose down -v
docker-compose up -d
Q2: 初始化脚本没有执行?
A: 确保:
- 脚本已正确挂载到
/docker-entrypoint-initdb.d/
- 数据卷是新建的(未初始化过数据库)
Q3: 如何备份数据?
A: 直接备份mysql_data
目录即可:
tar -czvf mysql_backup.tar.gz mysql_data/
✅ 提示:生产环境建议使用MySQL 5.7+或8.0版本,并配置更安全的密码策略。