Docker 以輕量級容器化技術重新定義了 MySQL 部署與測試流程。本文展示一個精簡的 Dockerfile (基於 Ubuntu + MariaDB 10),實測 **27 秒啟動 51 個實例**,並提供生產級參數調優與資料持久化建議。
FROM ubuntu
MAINTAINER erkan yanar
ENV DEBIAN_FRONTEND noninteractive
# 安裝 MariaDB (官方源)
RUN apt-get update && apt-get install -y python-software-properties
RUN apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
RUN add-apt-repository 'deb https://mirror2.hs-esslingen.de/mariadb/repo/10.0/ubuntu precise main'
RUN apt-get update && apt-get install -y mariadb-server
# 精簡配置:允許遠程連接、關閉 DNS 解析、InnoDB 刷盤優化、初始化腳本
RUN echo "[mysqld]" > /etc/mysql/conf.d/docker.cnf \
&& echo "bind-address = 0.0.0.0" >> /etc/mysql/conf.d/docker.cnf \
&& echo "innodb_flush_method = O_DSYNC" >> /etc/mysql/conf.d/docker.cnf \
&& echo "skip-name-resolve" >> /etc/mysql/conf.d/docker.cnf \
&& echo "init_file = /etc/mysql/init" >> /etc/mysql/conf.d/docker.cnf
# 建立超級用戶 (僅示範,生產請用密碼文件/環境變數)
RUN echo "GRANT ALL ON *.* TO 'supa'@'%' IDENTIFIED BY 'supa';" > /etc/mysql/init
EXPOSE 3306
USER mysql
ENTRYPOINT ["mysqld"]
# 構建鏡像 (命名 mysql)
cat Dockerfile | docker build -t mysql -
# 批量啟動 51 個容器 (端口 5010-5060 映射 3306)
time for i in $(seq 10 60); do
docker run -d -p 50$i:3306 mysql;
done
# 實測: real 0m27.446s (筆記本環境,KVM 更快)
docker ps | grep mysqld | wc -l # 51
docker ps | head -2
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 6d3a5181cd56 mysql mysqld 1 min Up 0.0.0.0:5060->3306/tcp lonely_pare
| 維度 | 建議配置 |
|---|---|
| 資料持久化 | -v /host/mysql/data:/var/lib/mysql 掛載宿主機目錄或具名卷,避免容器刪除數據丟失 |
| 配置外掛 | -v /host/mysql/conf.d:/etc/mysql/conf.d 掛載自定義 my.cnf 片段 |
| 資源限制 | --memory=2g --cpus=2 防止單容器佔盡宿主資源 |
| 環境變數注入 | 使用 MYSQL_ROOT_PASSWORD, MYSQL_DATABASE 等官方鏡像支援的環境變數初始化 |
| 健康檢查 | Dockerfile 加入 HEALTHCHECK CMD mysqladmin ping -h localhost |
| 網路隔離 | 建立專用 docker network,僅應用容器可訪問 |
| 日誌驅動 | --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 |
docker run -d \
--name mysql-prod \
-e MYSQL_ROOT_PASSWORD=strong_pass \
-e MYSQL_DATABASE=myapp \
-v mysql-data:/var/lib/mysql \
-v /host/conf.d:/etc/mysql/conf.d \
-p 3306:3306 \
--memory=2g --cpus=2 \
mysql:8.0 # 或 mariadb:10.6
結語: Docker 讓 MySQL 實例化如同進程般輕量,極大加速 CI/CD、分庫分表測試、多版本並行開發。生產落地請務必解決**持久化、資源隔離、安全加固、備份策略**四大工程化課題。