docker compose部署mysql

以下是使用 Docker Compose 部署 MySQL 的完整方案,包含最佳实践配置:

1. 创建 docker-compose.yml 文件

yaml 复制代码
version: '3.8'

services:
  mysql:
    image: mysql:8.0.34  # 建议指定具体版本
    container_name: mysql-server
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-StrongPassword123!}  # 从环境变量读取,默认值作为后备
      MYSQL_DATABASE: ${DB_NAME:-myapp_db}
      MYSQL_USER: ${DB_USER:-app_user}
      MYSQL_PASSWORD: ${DB_PASSWORD:-UserPassword123!}
      TZ: Asia/Shanghai  # 设置时区
    ports:
      - "${DB_PORT:-3306}:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql/conf.d:/etc/mysql/conf.d  # 自定义配置
      - ./mysql/initdb:/docker-entrypoint-initdb.d  # 初始化SQL脚本
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
    restart: unless-stopped
    networks:
      - backend-network
    command: 
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --max_connections=200
      --default-authentication-plugin=mysql_native_password

volumes:
  mysql_data:  # 命名卷实现数据持久化

networks:
  backend-network:
    driver: bridge

2. 创建配置文件目录结构

bash 复制代码
mkdir -p {mysql/conf.d,mysql/initdb}

3. 添加自定义配置 (可选)

mysql/conf.d/my-custom.cnf 中添加:

ini 复制代码
[mysqld]
skip-name-resolve
innodb_buffer_pool_size = 256M
log-error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2

4. 添加初始化脚本 (可选)

mysql/initdb/01-create-tables.sql 中添加:

sql 复制代码
CREATE TABLE IF NOT EXISTS users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

5. 使用环境变量文件 (推荐)

创建 .env 文件:

ini 复制代码
# MySQL 配置
DB_ROOT_PASSWORD=YourSecureRootPassword
DB_NAME=production_db
DB_USER=admin_user
DB_PASSWORD=Admin@1234
DB_PORT=3307  # 避免与宿主机MySQL冲突

6. 启动服务

bash 复制代码
docker-compose up -d  # 后台启动

7. 管理命令

bash 复制代码
# 查看日志
docker-compose logs -f mysql

# 进入容器
docker-compose exec mysql bash

# 连接MySQL
docker-compose exec mysql mysql -u root -p

# 安全关闭
docker-compose down --volumes  # 警告:这会删除数据卷

8. 备份方案

创建 backup.sh 脚本:

bash 复制代码
#!/bin/bash
BACKUP_DIR=/path/to/backups
DATE=$(date +%Y%m%d_%H%M%S)

docker-compose exec -T mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > $BACKUP_DIR/full_backup_$DATE.sql

高级功能扩展

  1. 主从复制配置:可扩展为多节点集群
  2. 监控集成:添加Prometheus监控
  3. PHPMyAdmin:添加管理界面服务
  4. 连接池:配合ProxySQL使用

💡 提示:生产环境建议使用 secrets 管理密码,可通过 docker-compose secrets 配置

相关推荐
程序新视界33 分钟前
详解MySQL两种存储引擎MyISAM和InnoDB的优缺点
数据库·后端·mysql
半路_出家ren41 分钟前
设计一个学生管理系统的数据库
linux·数据库·sql·mysql·网络安全·数据库管理员
莫陌尛.2 小时前
docker安装中间件
docker·中间件·容器
枫叶梨花3 小时前
实战:将 Nginx 日志实时解析并写入 MySQL,不再依赖 ELK
mysql·nginx·elk
那我掉的头发算什么3 小时前
【数据库】navicat的下载以及数据库约束
android·数据库·数据仓库·sql·mysql·数据库开发·数据库架构
tuokuac4 小时前
虚拟机挂起,重启后主机连接不上虚拟机docker中的mysql?(docker网络状态假死)
网络·mysql·docker
2301_772093565 小时前
高并发webserver_interview
运维·服务器·数据库·后端·网络协议·mysql·wireshark
大G的笔记本6 小时前
MySQL 大表查询优化、超大分页处理、SQL 慢查询优化、主键选择
数据库·sql·mysql
集智飞行6 小时前
docker login方法
运维·docker·容器
爱考证的小刘7 小时前
MySQL OCP认证、Oracle OCP认证
mysql·oracle·oracle数据库·oracle认证·mysql自学·mysql题库·oracle学习