Docker容器固定IP配置,内网容器互相访问
当你在同一台宿主机上运行多个Docker容器,并希望它们像局域网内的物理机一样通过固定IP互相访问时,默认的桥接网络往往不够用。
默认情况下,容器每次重启都可能获得新的IP,导致依赖IP的配置失效。
通过创建自定义网络并指定静态IP,可以让容器IP保持稳定,同时实现内网容器间的直接通信。
下面从准备到验证,一步步说明如何操作。
适用场景与准备工作
这个方法适合需要容器间稳定通信的开发测试环境,比如微服务架构中服务A需要固定访问服务B的数据库,或者你正在模拟一个多节点内网。
操作前请确保:
- 已安装Docker Engine(版本不限,但建议使用较新版本,以官方文档为准)。
- 拥有宿主机root权限或sudo权限。
- 了解容器的基础操作,如
docker run、docker network。
注意:固定IP仅在同一自定义网络内有效,跨宿主机通信需要更复杂的覆盖网络方案。
创建自定义网络并指定子网
默认的bridge网络不支持指定静态IP,必须先创建一个自定义桥接网络。
在终端执行:
docker network create --subnet=172.20.0.0/16 mynet
这里--subnet定义了网段,mynet是网络名称。
你可以按需更换网段,避免与宿主机现有网络冲突。
创建后可用docker network ls查看网络列表,用docker network inspect mynet确认子网信息。
关键点:子网一旦创建,后续容器的静态IP必须在该子网范围内,否则会报错。
启动容器并分配固定IP
使用--network指定自定义网络,并用--ip指定静态IP。
例如启动两个容器:
docker run -d --name container1 --network mynet --ip 172.20.0.10 nginx
docker run -d --name container2 --network mynet --ip 172.20.0.11 nginx
这样container1的IP固定为172.20.0.10,container2为172.20.0.11。
即使容器重启,IP也不会改变(只要网络存在且IP未被占用)。
如果容器已经运行,需要先停止并删除,再用上述命令重新创建。
直接修改运行中容器的IP是不支持的。
验证内网容器互访
进入container1,尝试pingcontainer2的IP:
docker exec -it container1 ping 172.20.0.11
如果看到回包,说明互访成功。
也可以使用curl测试HTTP服务(如果容器内运行了Web服务):
docker exec -it container1 curl http://172.20.0.11
预期结果:能ping通或返回HTTP响应。
如果失败,检查容器是否在同一网络(docker network inspect mynet查看容器列表),以及IP是否冲突。
避坑指南:常见错误与处理
- 报错“user specified IP address is supported only when connecting to networks with user configured subnets”:说明你使用的网络不是自定义网络,或者创建网络时未指定
--subnet。请重新创建网络。 - IP地址已被占用:同一网络内IP不能重复。如果启动时提示
Address already in use,换一个IP或删除占用该IP的容器。 - 容器重启后IP变化:只有通过
--ip指定的静态IP才会固定。如果使用默认动态分配,重启后IP可能改变。 - 跨网络通信:不同自定义网络默认隔离,需要将容器连接到多个网络,或使用
docker network connect。
重要提醒:静态IP一旦分配,即使容器停止,该IP也不会自动释放,直到容器被删除。
规划IP时建议预留一段范围。
效果确认与日常维护
完成配置后,可以通过以下命令复查:
docker network inspect mynet
在输出中找到Containers部分,确认每个容器的IPv4地址与预期一致。
日常维护中,如果新增容器,记得使用同一网络并分配未使用的IP。
删除容器后,IP会自动释放,可以重新分配。
如果后续需要修改子网或IP,必须删除并重建网络,同时重新创建所有容器。
因此建议在初期规划好网段和IP分配表。
一句话总结:Docker容器固定IP配置的核心是“自定义网络+静态IP参数”,内网互访只需保证容器在同一自定义网络且IP不冲突。
常见疑问
问:能否在默认bridge网络上使用固定IP?
答:不能。
默认bridge网络由Docker管理,不支持用户指定IP。
必须创建自定义网络。
问:容器固定IP后,宿主机如何访问?
答:宿主机可以直接通过容器IP访问,因为自定义网络在宿主机上创建了虚拟网桥。
如果无法访问,检查防火墙规则是否放行。
问:多个容器需要相同IP但不同网络怎么办?
答:不同网络之间IP可以重复,因为网络隔离。
但容器无法直接跨网络通信,需要额外配置。
问:Docker Compose中如何指定静态IP?
答:在Compose文件的networks部分定义自定义网络并指定子网,然后在服务下使用ipv4_address字段。
例如:
networks:
mynet:
ipam:
config:
- subnet: 172.20.0.0/16
services:
web:
networks:
mynet:
ipv4_address: 172.20.0.10
这样也能实现固定IP。
按照以上步骤操作后,你的容器就拥有了稳定的内网IP,互相访问不再受重启影响。
如果遇到异常,优先检查网络配置和IP冲突。