Percona 官方提供經過優化的 Docker 鏡像,支援 Percona Server for MySQL 與 Percona Server for MongoDB,並內建多種存儲引擎選項。本文系統總結鏡像獲取、容器啟動、環境變量配置、數據持久化、端口映射、自定義參數與配置文件掛載等全方位實戰操作。
https://hub.docker.com/r/percona/latest、5.6、5.6.28、5.6.27 等percona/percona-server-mongodb:latest 等docker run --name percona-mysql \
-e MYSQL_ROOT_PASSWORD=StrongPass123 \
-d percona/percona-server:5.7
--name:容器名稱-e MYSQL_ROOT_PASSWORD:設置 root 密碼(必填,除非使用隨機/空密碼)-d:後台運行docker run --name app-container \
--link percona-mysql:mysql \
-d your-app-image
應用內使用主機名 mysql、端口 3306 連接。
docker run -it --rm \
--link percona-mysql:mysql \
percona/percona-server:5.7 \
mysql -h mysql -P 3306 -uroot -pStrongPass123
docker run --name percona-mongo -d percona/percona-server-mongodb:latest
docker run --name percona-mongo-rocks \
-d percona/percona-server-mongodb:latest \
--storageEngine=RocksDB
docker run --name percona-mongo-ft \
-d percona/percona-server-mongodb:latest \
--storageEngine=PerconaFT
| 變量名 | 說明 | 推薦值/備註 |
|---|---|---|
MYSQL_ROOT_PASSWORD |
root 用戶密碼 | 生產環境必須設置強密碼 |
MYSQL_RANDOM_ROOT_PASSWORD |
yes 時生成隨機密碼,輸出至容器日誌 |
配合 docker logs container-name 獲取,適合自動化部署 |
MYSQL_ONETIME_PASSWORD |
yes 時 root 密碼過期,首次登錄必須修改 |
需 MySQL 5.6+ 支援,提升安全性 |
MYSQL_DATABASE |
啟動時自動創建的數據庫 | 若同時設置 MYSQL_USER/MYSQL_PASSWORD,該用戶將擁有該庫所有權限 |
MYSQL_USER / MYSQL_PASSWORD |
創建普通用戶並授權給 MYSQL_DATABASE |
不可用於創建 root 用戶 |
MYSQL_ALLOW_EMPTY_PASSWORD |
yes 允許 root 空密碼 |
極不推薦,僅限測試環境 |
-e MYSQL_RANDOM_ROOT_PASSWORD=yes,避免密碼硬編碼在鏡像或腳本中。-e MYSQL_ONETIME_PASSWORD=yes,強制首次登錄修改密碼。ENV MYSQL_ROOT_PASSWORD=...,改用 docker run -e 或 Docker Secrets/K8s Secrets 傳遞。docker run --name percona-mysql \
-e MYSQL_ROOT_PASSWORD=StrongPass123 \
-d percona/percona-server:5.7
數據存放於 /var/lib/docker/volumes/...,受存儲驅動影響,性能可能受限。
# 1. 主機建立目錄並設置權限
mkdir -p /data/percona/mysql
chcon -Rt svirt_sandbox_file_t /data/percona/mysql # SELinux 環境必須
# 2. 啟動容器掛載
docker run --name percona-mysql \
-v /data/percona/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=StrongPass123 \
-d percona/percona-server:5.7
MYSQL_ROOT_PASSWORD 等初始化環境變量將失效。docker run --name percona-mysql \
-p 6603:3306 \
-e MYSQL_ROOT_PASSWORD=StrongPass123 \
-d percona/percona-server:5.7
宿主機 6603 映射容器 3306,外部連接使用 host_ip:6603。
docker run --name percona-mysql \
-e MYSQL_ROOT_PASSWORD=StrongPass123 \
-d percona/percona-server:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_general_ci \
--max-connections=5000 \
--innodb-buffer-pool-size=2G
docker run 末尾的參數將直接透傳給容器內的 mysqld 進程。
# 1. 準備宿主機配置文件
mkdir -p /etc/percona
cat > /etc/percona/my.cnf <<'EOF'
[mysqld]
innodb_buffer_pool_size=4G
max_connections=10000
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
EOF
# 2. 掛載至容器默認讀取路徑
docker run --name percona-mysql \
-v /etc/percona/my.cnf:/etc/my.cnf \
-v /data/percona/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=StrongPass123 \
-d percona/percona-server:5.7
容器啟動時將讀取掛載的 /etc/my.cnf,實現配置與數據完全外部化管理。
docker logs container-name,常見為權限問題(掛載目錄無寫權限)或配置語法錯誤。bind-address 設置(配置文件中設為 0.0.0.0)。mysql:mysql(UID 999)或容器以 --user 999 運行。/etc/localtime:/etc/localtime:ro 或設置 -e TZ=Asia/Shanghai。Percona 官方 Docker 鏡像提供了開箱即用的高性能 MySQL/MongoDB 實例,配合環境變量、數據卷掛載、參數透傳與配置文件外掛,可滿足從開發測試到生產部署的全生命周期需求。關鍵生產建議:掛載主機目錄持久化數據、使用隨機/一次性密碼、外部化配置文件、啟用 GTID 與 ROW 格式 Binlog。