返回文章列表

Docker MySQL 配置指南

Mysql的Dockerfile配置與啟用

2026年4月7日 1 次瀏覽 haodai
Docker MySQL 配置指南

Docker MySQL 配置指南

本文檔介紹如何使用 Docker 運行和管理 MySQL 數據庫服務,包含用戶創建、權限設定、備份與恢復等操作。


快速開始

基本運行命令

bash
1
2
3
4
5
6
7
8
9
# 使用 root 密碼運行 MySQL 容器
docker run -itd \\
  --name mysql \\
  -p 3306:3306 \\
  -e MYSQL_ROOT_PASSWORD=your_root_password \\
  haodai/mysql \\
  --default-authentication-plugin=mysql_native_password

進階運行命令(包含用戶創建)

bash
1
2
3
4
5
6
7
8
9
10
11
# 運行 MySQL 容器並自動創建用戶
docker run -itd \\
  --name mysql \\
  -p 3306:3306 \\
  -e MYSQL_USER=example_user \\
  -e MYSQL_PASSWORD=your_password \\
  -e MYSQL_ROOT_PASSWORD=your_root_password \\
  haodai/mysql \\
  --default-authentication-plugin=mysql_native_password

使用 Docker Compose

創建 docker-compose.yml

yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3.9'

services:
  mysql:
    image: haodai/mysql
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_USER: example_user
      MYSQL_PASSWORD: your_password
      MYSQL_DATABASE: example_db
      TZ: Asia/Taipei
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/log:/var/log/mysql

啟動服務:

bash
1
2
3
docker-compose up -d


命令參數說明

docker run 參數

  • itd

    • i:互動模式

    • t:分配偽終端

    • d:後台模式運行

  • -name mysql:指定容器名稱

  • p 3306:3306:端口映射(主機:容器)

  • e:環境變數設定

MySQL 環境變數

  • MYSQL_ROOT_PASSWORD:root 用戶密碼(必需)

  • MYSQL_USER:創建新用戶(可選)

  • MYSQL_PASSWORD:新用戶密碼(配合 MYSQL_USER 使用)

  • MYSQL_DATABASE:創建新數據庫(可選)

  • MYSQL_ALLOW_EMPTY_PASSWORD:允許空密碼(不建議)

MySQL 命令參數

  • -default-authentication-plugin=mysql_native_password

    • 使用傳統的密碼認證插件

    • 提高與舊版客戶端的兼容性

    • MySQL 8.0+ 預設使用 caching_sha2_password


數據持久化

使用 Volume 掛載

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
# 創建數據目錄
mkdir -p ./mysql/data

# 運行容器並掛載數據目錄
docker run -itd \\
  --name mysql \\
  -p 3306:3306 \\
  -v $(pwd)/mysql/data:/var/lib/mysql \\
  -e MYSQL_ROOT_PASSWORD=your_root_password \\
  haodai/mysql \\
  --default-authentication-plugin=mysql_native_password

說明

  • ./mysql/data:主機數據目錄(會保存所有數據庫文件)

  • /var/lib/mysql:容器內的 MySQL 數據目錄

  • 刪除容器時數據不會丟失(只要不刪除主機目錄)


容器管理

進入容器

bash
1
2
3
4
5
6
7
# 進入 MySQL 容器
docker exec -it mysql bash

# 或使用 sh
docker exec -it mysql sh

連接 MySQL

bash
1
2
3
4
5
6
7
8
9
10
# 方式 1:在容器內連接(進入容器後執行)
mysql -uroot -p

# 方式 2:從主機連接(直接執行)
docker exec -it mysql mysql -uroot -p

# 方式 3:使用特定用戶連接
docker exec -it mysql mysql -uexample_user -p

查看容器狀態

bash
1
2
3
4
5
6
7
8
9
10
# 查看運行中的容器
docker ps | grep mysql

# 查看容器日誌
docker logs mysql

# 持續追蹤日誌
docker logs -f mysql

停止和啟動容器

bash
1
2
3
4
5
6
7
8
9
10
# 停止容器
docker stop mysql

# 啟動容器
docker start mysql

# 重啟容器
docker restart mysql


用戶管理

創建用戶

進入容器並連接 MySQL:

bash
1
2
3
4
5
6
7
# 進入容器
docker exec -it mysql bash

# 連接 MySQL
mysql -uroot -p

執行 SQL 命令:

sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- 創建用戶(允許從任何主機連接)
CREATE USER 'example_user'@'%' IDENTIFIED BY 'your_password';

-- 授予所有權限
GRANT ALL PRIVILEGES ON *.* TO 'example_user'@'%' WITH GRANT OPTION;

-- 使用 mysql_native_password 認證插件(兼容性)
ALTER USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';

-- 刷新權限
FLUSH PRIVILEGES;

-- 查看用戶
SELECT user, host FROM mysql.user;

-- 退出 MySQL
exit;

用戶權限說明

  • ALL PRIVILEGES:所有權限

  • .*:所有數據庫的所有表

  • %:允許從任何主機連接(生產環境建議限制為特定 IP)

  • WITH GRANT OPTION:允許用戶授予其他用戶權限

限制用戶連接主機

sql
1
2
3
4
5
6
7
8
9
10
11
-- 只允許從特定 IP 連接
CREATE USER 'example_user'@'192.168.1.%' IDENTIFIED BY 'your_password';

-- 只允許從本地連接
CREATE USER 'example_user'@'localhost' IDENTIFIED BY 'your_password';

-- 授予特定數據庫權限
GRANT ALL PRIVILEGES ON example_db.* TO 'example_user'@'%';
FLUSH PRIVILEGES;

修改用戶密碼

sql
1
2
3
4
5
-- 修改用戶密碼
ALTER USER 'example_user'@'%' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;

刪除用戶

sql
1
2
3
4
5
-- 刪除用戶
DROP USER 'example_user'@'%';
FLUSH PRIVILEGES;


數據庫備份

備份單個數據庫

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
# 備份特定數據庫
docker exec mysql sh -c 'exec mysqldump --databases example_db -uroot -p"your_root_password"' > /path/to/backup/example_db.sql

# 備份到當前目錄
docker exec mysql sh -c 'exec mysqldump --databases example_db -uroot -p"your_root_password"' > example_db.sql

# 只備份結構(不含數據)
docker exec mysql sh -c 'exec mysqldump --no-data --databases example_db -uroot -p"your_root_password"' > example_db_structure.sql

# 只備份數據(不含結構)
docker exec mysql sh -c 'exec mysqldump --no-create-info --databases example_db -uroot -p"your_root_password"' > example_db_data.sql

備份所有數據庫

bash
1
2
3
4
# 備份所有數據庫
docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"your_root_password"' > all_databases.sql

備份並壓縮

bash
1
2
3
4
5
6
7
# 備份並使用 gzip 壓縮
docker exec mysql sh -c 'exec mysqldump --databases example_db -uroot -p"your_root_password"' | gzip > example_db.sql.gz

# 解壓縮
gunzip example_db.sql.gz

自動備份腳本

創建備份腳本 backup_mysql.sh

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

# 配置
CONTAINER_NAME="mysql"
MYSQL_USER="root"
MYSQL_PASSWORD="your_root_password"
DATABASE_NAME="example_db"
BACKUP_DIR="/path/to/backups"
DATE=$(date +%Y%m%d_%H%M%S)# 創建備份目錄
mkdir -p $BACKUP_DIR

# 執行備份
docker exec $CONTAINER_NAME sh -c "exec mysqldump --databases $DATABASE_NAME -u$MYSQL_USER -p\\"$MYSQL_PASSWORD\\"" > $BACKUP_DIR/${DATABASE_NAME}_${DATE}.sql

# 壓縮備份文件
gzip $BACKUP_DIR/${DATABASE_NAME}_${DATE}.sql

# 刪除 30 天前的備份
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete

echo "備份完成: ${DATABASE_NAME}_${DATE}.sql.gz"

設定執行權限:

bash
1
2
3
chmod +x backup_mysql.sh

使用 crontab 設定自動備份:

bash
1
2
3
4
5
6
7
# 編輯 crontab
crontab -e

# 每天凌晨 2 點執行備份
0 2 * * * /path/to/backup_mysql.sh >> /var/log/mysql_backup.log 2>&1


數據庫恢復

方法 1:從文件恢復

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 步驟 1:查看備份文件
ls -lh databases.sql

# 步驟 2:複製備份文件到容器
docker cp ./databases.sql mysql:/

# 步驟 3:進入 MySQL 容器
docker exec -it mysql bash

# 步驟 4:連接 MySQL
mysql -uroot -p

# 步驟 5:切換到目標數據庫(如果不存在則先創建)
CREATE DATABASE IF NOT EXISTS example_db;
USE example_db;

# 步驟 6:恢復數據庫
source /databases.sql;

# 步驟 7:退出
exit;
exit;

方法 2:從管道恢復

bash
1
2
3
4
5
6
7
# 直接從備份文件恢復
cat example_db.sql | docker exec -i mysql mysql -uroot -p"your_root_password" example_db

# 或使用輸入重定向
docker exec -i mysql mysql -uroot -p"your_root_password" example_db < example_db.sql

方法 3:恢復壓縮的備份

bash
1
2
3
4
# 恢復 gzip 壓縮的備份
gunzip < example_db.sql.gz | docker exec -i mysql mysql -uroot -p"your_root_password" example_db

恢復所有數據庫

bash
1
2
3
4
# 恢復所有數據庫
docker exec -i mysql mysql -uroot -p"your_root_password" < all_databases.sql


配置優化

自定義 MySQL 配置

創建 mysql/conf/my.cnf

plain
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[mysqld]# 字符集配置
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

# 連接配置
max_connections=200
max_connect_errors=10

# 時區配置
default-time-zone='+08:00'

# InnoDB 配置
innodb_buffer_pool_size=1G
innodb_log_file_size=256M

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

[client]default-character-set=utf8mb4

[mysql]default-character-set=utf8mb4

運行容器時掛載配置文件:

bash
1
2
3
4
5
6
7
8
9
10
11
docker run -itd \\
  --name mysql \\
  -p 3306:3306 \\
  -v $(pwd)/mysql/data:/var/lib/mysql \\
  -v $(pwd)/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \\
  -v $(pwd)/mysql/log:/var/log/mysql \\
  -e MYSQL_ROOT_PASSWORD=your_root_password \\
  haodai/mysql \\
  --default-authentication-plugin=mysql_native_password

查看 MySQL 配置

sql
1
2
3
4
5
6
7
8
-- 查看所有配置變數
SHOW VARIABLES;

-- 查看特定配置
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'time_zone';