如何配置Docker网络使容器仅支持内部及宿主机访问并禁止公网访问
Docker网络配置方案(容器内部互访+访问宿主机+禁止公网访问)
核心调整逻辑
你此前使用internal: true的自定义网络会完全隔离容器和宿主机、公网的通信,因此无法满足访问宿主机的需求,我们可以通过「普通桥接自定义网络+iptables公网拦截」的方案实现需求。
操作步骤
1. 修改自定义网络配置
删除原有配置中的internal: true属性,改为普通桥接网络:
networks: no-internet: driver: bridge ipam: config: - subnet: 172.19.0.0/16
如果此前已经创建过旧的internal网络,先执行以下命令删除避免冲突:docker network rm no-internet
2. 配置iptables规则禁止公网访问
在宿主机执行以下命令,拦截该子网所有非内部流量:iptables -I DOCKER-USER -s 172.19.0.0/16 ! -d 172.19.0.0/16 -j DROP
规则说明:仅允许172.19.0.0/16子网内部的通信,所有发往子网外的流量都会被丢弃,自然无法访问公网,但宿主机在该网络下的网关IP(默认172.19.0.1)属于子网范围内,因此容器可以正常访问宿主机。
如果需要规则开机持久化:
- Debian/Ubuntu系统可安装
iptables-persistent包保存规则 - CentOS/RHEL系统可使用
iptables-services服务执行service iptables save保存规则
3. 配置host.docker.internal解析
自定义网络默认不会自动生成宿主机域名解析,在你的服务配置中添加extra_hosts即可:
services: 你的服务名称: networks: - no-internet extra_hosts: - "host.docker.internal:host-gateway" # 其余服务配置保持不变
效果验证
- 容器内部互访:同网络下的容器可通过服务名正常通信
- 访问宿主机:容器内可ping通
host.docker.internal,XDebug配置指向该域名即可正常连接宿主机 - 公网访问限制:容器内ping公网域名/IP会超时,无法访问互联网
内容的提问来源于stack exchange,提问作者joels
相关产品推荐
相关产品推荐

