Docker MySQL 配置指南
Mysql的Dockerfile配置與啟用
2026年4月7日 1 次瀏覽 haodai

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';

