在 Docker 中运行多个 MySQL 实例是常见的需求,比如用于测试主从复制、多租户环境或不同应用隔离。实现方式主要是通过为每个实例配置独立的端口、数据目录和容器名称,确保它们互不冲突。
1. 使用不同端口映射隔离实例
每个 MySQL 容器默认使用 3306 端口,若要运行多个实例,需将宿主机的不同端口映射到各个容器的 3306 端口。
示例:启动两个 MySQL 实例,分别使用宿主机的 3307 和 3308 端口:
docker run -d \ --name mysql-instance-1 \ -e MYSQL_ROOT_PASSWORD=secret123 \ -p 3307:3306 \ -v /data/mysql1:/var/lib/mysql \ mysql:8 <p>docker run -d \ --name mysql-instance-2 \ -e MYSQL_ROOT_PASSWORD=another456 \ -p 3308:3306 \ -v /data/mysql2:/var/lib/mysql \ mysql:8</p>
这样就可以通过 localhost:3307 访问第一个实例,localhost:3308 访问第二个实例。
2. 独立的数据卷避免数据混淆
每个实例必须使用独立的挂载目录(如 /data/mysql1 和 /data/mysql2),否则多个容器写入同一目录会导致数据损坏或启动失败。
使用 -v 参数绑定宿主机目录,保证数据持久化且相互隔离。
确保宿主机目录存在并有读写权限 首次启动后,对应目录会自动生成 MySQL 数据文件 备份或迁移时可直接操作这些目录3. 自定义配置文件支持不同参数
如果需要为不同实例设置不同的 MySQL 配置(如 server-id、log-bin 等),可通过挂载自定义 my.cnf 文件实现。
例如创建两个配置文件:
# /config/my1.cnf [mysqld] server-id = 1 log-bin = mysql-bin
# /config/my2.cnf [mysqld] server-id = 2 skip-networking
启动时挂载配置文件:
docker run -d \ --name mysql-replica-1 \ -e MYSQL_ROOT_PASSWORD=replica1 \ -p 3307:3306 \ -v /data/mysql1:/var/lib/mysql \ -v /config/my1.cnf:/etc/mysql/my.cnf \ mysql:8
4. 使用 Docker Compose 简化管理
当实例数量较多时,推荐使用 docker-compose.yml 统一管理。
version: '3.8'
services:
mysql1:
image: mysql:8
container_name: mysql-primary
environment:
MYSQL_ROOT_PASSWORD: primarypass
ports:
- "3307:3306"
volumes:
- ./data/mysql1:/var/lib/mysql
- ./config/my1.cnf:/etc/mysql/my.cnf
<p>mysql2:
image: mysql:8
container_name: mysql-secondary
environment:
MYSQL_ROOT_PASSWORD: secondarypass
ports:</p><ul><li>"3308:3306"
volumes:</li><li>./data/mysql2:/var/lib/mysql</li><li>./config/my2.cnf:/etc/mysql/my.cnf执行 docker-compose up -d 即可一键启动所有实例。
基本上就这些。只要注意端口、数据目录和配置的独立性,多个 MySQL 实例在 Docker 中运行很稳定。
