能,但必须手动隔离端口、数据目录和容器名:端口需映射不同宿主机端口(如3307:3306),数据卷须独立并赋权chown -R 999:999,容器名不可重复,MySQL 8.0+需配置mysql_native_password插件及utf8mb4字符集。

能,而且比传统方式更干净——关键不是“能不能”,而是“怎么避免端口、数据目录、配置文件三重冲突”。
docker run 启动多个 MySQL 容器时端口必须错开
默认都映射 3306:3306 肯定会报错:Bind for 0.0.0.0:3306 failed: port is already allocated。这不是 MySQL 启动失败,是 Docker 宿主机端口被占了。
- 每个容器必须用不同宿主机端口,比如
-p 3307:3306、-p 3308:3306 - 如果只在本机访问(如开发调试),可改用
--network host模式,但此时 MySQL 实际监听宿主机的3306、3307等端口,仍需手动在my.cnf里配port=3307 - 更推荐方案:创建自定义网络 + 不暴露端口,用容器名通信(如
mysql-app和mysql-report互不感知端口)
每个 MySQL 实例必须挂载独立的数据卷或目录
/var/lib/mysql 是 MySQL 的数据根目录,多个容器共用同一路径会导致启动失败或数据损坏——常见报错是 mysqld: Can't read dir of '/etc/mysql/conf.d/' 或直接卡在初始化。
- 用命名卷最省心:
docker volume create mysql8-app、docker volume create mysql8-report,然后分别挂载-v mysql8-app:/var/lib/mysql - 若用绑定挂载(
-v /path/to/app-data:/var/lib/mysql),务必确保目录为空且权限为chown -R 999:999 /path/to/app-data(MySQL 容器内用户 UID 是 999) - 绝对不要让两个容器挂载同一个本地目录,哪怕只是想“共享备份”——数据文件锁和写入顺序不可控
环境变量和配置文件必须按实例隔离
官方镜像靠 MYSQL_ROOT_PASSWORD 等环境变量初始化数据库,但这些变量只在首次启动生效。如果复用同一数据卷再跑新容器,变量会被忽略,且可能因 mysql_native_password 插件缺失导致连接拒绝。
- 每个容器起名要明确:
--name mysql8-dev、--name mysql8-test,避免docker ps里全是哈希 ID - 密码必须不同,否则你连进去了也分不清哪个是哪个实例的 root
- 如有定制配置(如
innodb_buffer_pool_size),用-v /conf/dev.cnf:/etc/mysql/conf.d/dev.cnf挂载,文件名和路径不能重复 - 注意:MySQL 8.0 默认认证插件是
caching_sha2_password,老客户端连不上时,在对应 conf 文件里加default_authentication_plugin=mysql_native_password
docker-compose.yml 是管理多实例最稳的方式
手敲一堆 docker run 容易漏参数、起错名字、端口撞车;而 docker-compose.yml 把所有约束声明化,重启、扩缩、查日志都统一。
version: '3.8'
services:
mysql8-app:
image: mysql:8.0.33
container_name: mysql8-app
environment:
MYSQL_ROOT_PASSWORD: app_root_2026
MYSQL_DATABASE: app_db
volumes:
- mysql8-app-data:/var/lib/mysql
- ./conf/app.cnf:/etc/mysql/conf.d/app.cnf
ports:
- "3307:3306"
restart: unless-stopped
<p>mysql8-report:
image: mysql:8.0.33
container_name: mysql8-report
environment:
MYSQL_ROOT_PASSWORD: rpt_root_2026
MYSQL_DATABASE: rpt_db
volumes:</p><ul><li>mysql8-report-data:/var/lib/mysql</li><li>./conf/rpt.cnf:/etc/mysql/conf.d/rpt.cnf
ports:</li><li>"3308:3306"
restart: unless-stopped</li></ul><p>volumes:
mysql8-app-data:
mysql8-report-data:真正容易被忽略的是:每次修改 docker-compose.yml 后,必须用 docker-compose down && docker-compose up -d 重建容器——因为挂载的配置文件和环境变量不会热更新,而数据卷内容不受影响,所以不会丢数据。


















