Windows WSL2环境下Docker Compose为MySQL分配静态IP的解决方案
Docker Compose 为MySQL容器配置固定静态IP的实操方案
之前配置不生效、IP冲突的核心原因
- 你之前尝试的配置直接给Compose自动生成的
default网络绑定固定IP,但Compose的默认网络是每次创建项目时动态分配子网段的,没有固定的IP配置规则,你手动指定的172.18.0.3既可能和其他Docker网络的IP段重合引发占用报错,Windows重启后Docker重新分配默认网络子网时,之前指定的IP和实际子网不匹配就会失效,最终出现容器IP每次启动都在172.18.0.3、172.18.0.4之间漂移的问题。 - 给容器配置固定IP的核心前提,是先创建带有固定子网、固定网关的自定义桥接网络,不能依赖Compose自动生成的默认网络。
具体配置修改步骤
- 在docker-compose.yml的顶级层级(和
version、services同级)新增自定义网络配置段,提前定义好固定的子网段、网关,选一个当前Docker环境没有被占用的IP段即可(比如避开已经用了的172.18.0.0/16,换成172.20.0.0/16)。可以提前用
docker network inspect 网络名命令查看现有Docker网络的IP段,避免选到已经被占用的网段引发冲突。 - 把所有服务都加入这个自定义网络,不再使用Compose自动生成的默认网络。
- 在MySQL服务的配置里,给自定义网络绑定固定的IPv4地址,这个地址必须在你提前定义的子网段范围内。
修改完成后的完整配置参考
version: '3.7' # 顶级定义自定义固定网络 networks: hk-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16 gateway: 172.20.0.1 services: nginx: container_name: hki_nginx image: nginx:latest ports: - 80:80 - 4433:443 volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/conf:/etc/nginx/conf.d - ./src:/var/www links: - php - php72 networks: - hk-network php: container_name: hki_php image: php:5.6-fpm-ext1 volumes: - ./src:/var/www - ./php/php.ini:/usr/local/etc/php/php.ini - ./php/php-fpm.conf:/usr/local/etc/php-fpm.d/www.conf networks: - hk-network php72: container_name: web_php image: php:7.2-fpm-ext2 volumes: - ./src:/var/www - ./php72/php.ini:/usr/local/etc/php/php.ini - ./php72/php-fpm.conf:/usr/local/etc/php-fpm.d/www.conf networks: - hk-network mysql: container_name: hki_mysql image: mysql:5.7 volumes: - ./mysql/data:/var/lib/mysql - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf - ./mysql/init:/docker-entrypoint-initdb.d/ ports: - 3306:3306 environment: - MYSQL_ROOT_PASSWORD=*Abcd1234 - MYSQL_USER=abc - MYSQL_PASS=*Abcd1234 networks: hk-network: ipv4_address: 172.20.0.3
启动注意事项
- 第一次启动新配置前,先在配置文件所在目录执行
docker-compose down,清理之前项目关联的旧默认网络残留,避免残留网络的IP段和新配置冲突。 - 如果启动时依然报IP占用错误,执行
docker network ls查看现有网络列表,找到占用172.20.0.0/16网段的无用网络,用docker network rm 对应的网络名删除残留后再重新启动。 - 同一个自定义网络下的容器可以直接通过容器名互相访问,原来配置的
links指令可以删除,不会影响服务间的连通性,还能减少冗余配置。 - Windows环境下的Docker Desktop使用WSL2后端时,自定义桥接网络的子网段是持久化固定的,不会像默认网络那样在系统重启后漂移IP,MySQL绑定的静态IP会长期保持稳定。
内容的提问来源于stack exchange,提问作者hkguile
相关产品推荐
相关产品推荐

