0
点赞
收藏
分享

微信扫一扫

企业级Docker MySQL部署方案:生产环境配置、数据持久化与网络隔离实践

使用 Docker 启动 MySQL 是一个非常常见且高效的部署方式。下面为您提供一份从基础到高级的完整指南。

一、基础启动方法

1. 最简单的启动方式

# 拉取最新版 MySQL 镜像(可选,run 时会自动拉取)
docker pull mysql:8.0

# 启动 MySQL 容器
docker run -d \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -p 3306:3306 \
  mysql:8.0

2. 推荐的生产环境启动方式

docker run -d \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=YourStrongPassword123! \
  -e MYSQL_DATABASE=myapp \
  -e MYSQL_USER=app_user \
  -e MYSQL_PASSWORD=AppUserPass123! \
  -p 3306:3306 \
  -v mysql_data:/var/lib/mysql \
  -v /host/mysql/conf:/etc/mysql/conf.d \
  --restart=unless-stopped \
  mysql:8.0

二、环境变量配置

核心环境变量

变量名

说明

示例

MYSQL_ROOT_PASSWORD

必需 root用户密码

MyRootPass123!

MYSQL_DATABASE

自动创建的数据库

myapp

MYSQL_USER

自动创建的用户

app_user

MYSQL_PASSWORD

自动用户的密码

AppUserPass123!

MYSQL_ALLOW_EMPTY_PASSWORD

允许空密码

yes

MYSQL_RANDOM_ROOT_PASSWORD

生成随机root密码

yes

高级配置变量

docker run -d \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=securepassword \
  -e MYSQL_INITDB_SKIP_TZINFO=1 \
  -e MYSQL_CHARSET=utf8mb4 \
  -e MYSQL_COLLATION=utf8mb4_unicode_ci \
  -p 3306:3306 \
  mysql:8.0

三、数据持久化

1. 使用 Docker Volume(推荐)

# 创建 volume
docker volume create mysql_data

# 启动容器并使用 volume
docker run -d \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=password \
  -v mysql_data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0

2. 使用主机目录

# 创建主机目录
mkdir -p /docker/mysql/data
mkdir -p /docker/mysql/conf

# 启动容器并挂载目录
docker run -d \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=password \
  -v /docker/mysql/data:/var/lib/mysql \
  -v /docker/mysql/conf:/etc/mysql/conf.d \
  -p 3306:3306 \
  mysql:8.0

四、配置文件定制

1. 创建自定义配置文件

# 创建配置目录
mkdir -p /docker/mysql/conf

# 创建自定义配置文件
cat > /docker/mysql/conf/my.cnf << EOF
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-authentication-plugin=mysql_native_password

# 性能优化
innodb_buffer_pool_size=1G
innodb_log_file_size=256M
max_connections=1000

# 日志配置
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2

[client]
default-character-set=utf8mb4
EOF

2. 启动时应用配置

docker run -d \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=password \
  -v /docker/mysql/data:/var/lib/mysql \
  -v /docker/mysql/conf:/etc/mysql/conf.d \
  -p 3306:3306 \
  mysql:8.0

五、网络配置

1. 使用自定义网络

# 创建自定义网络
docker network create mysql-network

# 启动 MySQL
docker run -d \
  --name mysql-server \
  --network mysql-network \
  -e MYSQL_ROOT_PASSWORD=password \
  -p 3306:3306 \
  mysql:8.0

# 其他容器连接到同一网络
docker run -d \
  --name web-app \
  --network mysql-network \
  -e DATABASE_URL=mysql://root:password@mysql-server:3306/myapp \
  my-web-app

2. 仅内部网络(不暴露端口)

docker run -d \
  --name mysql-internal \
  --network mysql-network \
  -e MYSQL_ROOT_PASSWORD=password \
  mysql:8.0

六、Docker Compose 部署

1. 基础 docker-compose.yml

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql-server
    environment:
      MYSQL_ROOT_PASSWORD: YourStrongPassword123!
      MYSQL_DATABASE: myapp
      MYSQL_USER: app_user
      MYSQL_PASSWORD: AppUserPass123!
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./conf:/etc/mysql/conf.d
    networks:
      - mysql-net
    restart: unless-stopped

volumes:
  mysql_data:

networks:
  mysql-net:
    driver: bridge

2. 生产级 docker-compose.yml

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql-production
    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/conf:/etc/mysql/conf.d
      - ./mysql/init:/docker-entrypoint-initdb.d
    networks:
      - backend
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

  adminer:
    image: adminer
    container_name: mysql-admin
    ports:
      - "8080:8080"
    networks:
      - backend
    restart: unless-stopped

volumes:
  mysql_data:

networks:
  backend:
    driver: bridge

环境变量文件 (.env):

MYSQL_ROOT_PASSWORD=YourSecureRootPassword123!
MYSQL_DATABASE=production_db
MYSQL_USER=app_user
MYSQL_PASSWORD=YourAppUserPassword123!

七、初始化脚本

1. 初始化数据库脚本

创建 init/01-init.sql

-- 创建额外数据库
CREATE DATABASE IF NOT EXISTS analytics;
CREATE DATABASE IF NOT EXISTS reporting;

-- 创建专用用户
CREATE USER 'analytics_user'@'%' IDENTIFIED BY 'AnalyticsPass123!';
GRANT SELECT, INSERT, UPDATE ON analytics.* TO 'analytics_user'@'%';

-- 创建初始表结构
USE myapp;
CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. 启动时执行初始化

docker run -d \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=password \
  -v ./init:/docker-entrypoint-initdb.d \
  -p 3306:3306 \
  mysql:8.0

八、常用管理命令

1. 容器管理

# 查看运行中的容器
docker ps

# 查看 MySQL 日志
docker logs mysql-server

# 实时查看日志
docker logs -f mysql-server

# 进入容器
docker exec -it mysql-server bash

# 进入 MySQL 命令行
docker exec -it mysql-server mysql -u root -p

2. 备份与恢复

# 备份数据库
docker exec mysql-server mysqldump -u root -p password myapp > backup.sql

# 恢复数据库
docker exec -i mysql-server mysql -u root -p password myapp < backup.sql

# 备份整个数据目录
docker stop mysql-server
tar -czf mysql_backup.tar.gz /docker/mysql/data
docker start mysql-server

九、故障排查

1. 检查容器状态

# 查看容器状态
docker ps -a

# 查看资源使用情况
docker stats mysql-server

# 检查网络
docker network ls

2. 常见问题解决

# 容器启动失败,查看日志
docker logs mysql-server

# 端口被占用,更改端口
docker run -d ... -p 3307:3306 ...

# 数据卷权限问题
docker run -d ... -v mysql_data:/var/lib/mysql:Z ...

3. 性能监控

# 进入 MySQL 监控
docker exec -it mysql-server mysql -u root -p -e "SHOW PROCESSLIST;"

# 查看性能状态
docker exec -it mysql-server mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"

十、安全最佳实践

1. 安全启动示例

docker run -d \
  --name mysql-secure \
  -e MYSQL_RANDOM_ROOT_PASSWORD=yes \
  -e MYSQL_USER=app_admin \
  -e MYSQL_PASSWORD=SecureAppPass123! \
  -e MYSQL_DATABASE=application_db \
  -p 3306:3306 \
  -v mysql_secure_data:/var/lib/mysql \
  --security-opt=no-new-privileges:true \
  --read-only \
  mysql:8.0

2. 使用 Secrets(Docker Swarm)

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password
      MYSQL_DATABASE: myapp
    secrets:
      - mysql_root_password
    volumes:
      - mysql_data:/var/lib/mysql

secrets:
  mysql_root_password:
    file: ./secrets/mysql_root_password.txt

十一、版本选择建议

版本标签

说明

使用场景

mysql:8.0

最新稳定版

推荐用于生产

mysql:5.7

老牌稳定版

兼容旧应用

mysql:latest

最新版

测试环境

mysql:8.0.33

特定版本

生产环境(版本固定)

推荐生产环境配置

# 生产环境启动命令
docker run -d \
  --name mysql-production \
  -e MYSQL_ROOT_PASSWORD=YourStrongPassword123! \
  -e MYSQL_DATABASE=production_db \
  -p 3306:3306 \
  -v mysql_production_data:/var/lib/mysql \
  -v /opt/mysql/conf:/etc/mysql/conf.d \
  --restart=unless-stopped \
  --memory=2g \
  --cpus=2 \
  mysql:8.0

通过以上配置,您可以轻松地在 Docker 环境中部署和管理 MySQL,享受容器化带来的便捷性和可移植性。记得根据实际需求调整配置参数,并在生产环境中做好数据备份和安全防护。

另外搭配便捷的80kmMYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。

举报

相关推荐

0 条评论