使用 Docker-Compose 安装 MySQL 8.0
本指南将帮助您使用 Docker-Compose 快速部署最新版本的 MySQL 8.0 数据库。
前置要求
- Docker 已安装并运行
- Docker-Compose 已安装
- 至少 2GB 可用内存
- 至少 10GB 可用磁盘空间
快速开始
1. 创建项目目录
mkdir mysql-docker
cd mysql-docker
2. 创建 docker-compose.yml 文件
创建 docker-compose.yml 文件:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql8-server
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_strong_password_here
MYSQL_DATABASE: myapp
MYSQL_USER: myuser
MYSQL_PASSWORD: myuser_password
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./mysql-init:/docker-entrypoint-initdb.d
command: --default-authentication-plugin=mysql_native_password
networks:
- mysql-network
volumes:
mysql_data:
driver: local
networks:
mysql-network:
driver: bridge
3. 创建初始化脚本(可选)
创建 mysql-init 目录并添加初始化 SQL 脚本:
mkdir mysql-init
在 mysql-init/init.sql 中添加:
-- 创建示例数据库和表
CREATE DATABASE IF NOT EXISTS sample_db;
USE sample_db;
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入示例数据
INSERT INTO users (username, email) VALUES
('admin', 'admin@example.com'),
('user1', 'user1@example.com');
4. 启动 MySQL 服务
# 启动服务(后台运行)
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs mysql
5. 连接到 MySQL
使用 MySQL 客户端:
# 安装 MySQL 客户端(如果尚未安装)
# Ubuntu/Debian: sudo apt-get install mysql-client
# macOS: brew install mysql-client
# 连接到 MySQL
mysql -h 127.0.0.1 -P 3306 -u root -p
进入容器内部:
# 进入 MySQL 容器
docker-compose exec mysql mysql -u root -p
# 或者进入容器 bash
docker-compose exec mysql bash
配置说明
环境变量
| 变量名 | 描述 | 默认值 |
|---|---|---|
MYSQL_ROOT_PASSWORD |
root 用户密码 | 必须设置 |
MYSQL_DATABASE |
启动时创建的数据库名 | 无 |
MYSQL_USER |
创建新用户名 | 无 |
MYSQL_PASSWORD |
新用户密码 | 无 |
MYSQL_ALLOW_EMPTY_PASSWORD |
允许 root 空密码 | no |
卷挂载说明
mysql_data:/var/lib/mysql: 持久化 MySQL 数据./mysql-init:/docker-entrypoint-initdb.d: 初始化脚本目录
网络配置
- 默认使用 bridge 网络
- 容器间可以通过服务名
mysql通信
常用命令
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 停止并删除数据卷(⚠️ 会删除所有数据)
docker-compose down -v
# 重启服务
docker-compose restart mysql
# 查看日志(实时)
docker-compose logs -f mysql
# 进入容器
docker-compose exec mysql bash
# 备份数据库
docker-compose exec mysql mysqldump -u root -p myapp > backup.sql
# 恢复数据库
docker-compose exec -T mysql mysql -u root -p myapp < backup.sql
生产环境配置
对于生产环境,建议使用以下增强配置:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql8-prod
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./mysql-prod.cnf:/etc/mysql/conf.d/custom.cnf
- ./mysql-backups:/backups
command: --default-authentication-plugin=mysql_native_password
networks:
- mysql-network
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
- /var/tmp
volumes:
mysql_data:
driver: local
networks:
mysql-network:
driver: bridge
创建环境变量文件 .env:
MYSQL_ROOT_PASSWORD=your_very_strong_password_here
MYSQL_DATABASE=production_db
MYSQL_USER=app_user
MYSQL_PASSWORD=app_user_password
创建 MySQL 配置文件 mysql-prod.cnf:
[mysqld]
# 性能优化
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 安全设置
skip-name-resolve
max_connections = 200
query_cache_size = 0
query_cache_type = 0
# 日志设置
log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
故障排除
常见问题
-
容器启动失败
# 检查日志 docker-compose logs mysql # 检查端口占用 lsof -i :3306 -
连接被拒绝
- 确认密码正确
- 检查防火墙设置
- 验证服务是否正在运行
-
数据丢失
- 确认使用持久化卷
- 检查卷挂载路径
性能调优
- 内存配置:根据服务器内存调整
innodb_buffer_pool_size - 连接数:根据应用需求调整
max_connections - 日志配置:适当配置日志避免性能影响
安全建议
- 使用强密码
- 限制数据库用户权限
- 定期备份数据
- 监控数据库性能和日志
- 定期更新 MySQL 版本
- 在生产环境中使用 SSL 连接
备份策略
#!/bin/bash
# 自动备份脚本 backup-mysql.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/path/to/backups"
CONTAINER_NAME="mysql8-server"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份所有数据库
docker exec $CONTAINER_NAME mysqldump -u root -p$MYSQL_ROOT_PASSWORD --all-databases > $BACKUP_DIR/mysql_backup_$DATE.sql
# 压缩备份文件
gzip $BACKUP_DIR/mysql_backup_$DATE.sql
# 删除 7 天前的备份
find $BACKUP_DIR -name "mysql_backup_*.sql.gz" -mtime +7 -delete
echo "备份完成: $BACKUP_DIR/mysql_backup_$DATE.sql.gz"
版本更新
# 1. 备份数据
docker-compose exec mysql mysqldump -u root -p --all-databases > full_backup.sql
# 2. 停止服务
docker-compose down
# 3. 拉取最新镜像
docker-compose pull
# 4. 启动服务
docker-compose up -d
# 5. 验证数据完整性
相关链接
注意:在生产环境中使用前,请务必测试配置并根据实际需求调整参数。
原创
Docker-compose 安装 Mysql8 最新版
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。




评论交流
欢迎留下你的想法