如何使用Docker Compose配置容器仅通过代理出站、限制公网访问
需求实现结论
上述需求完全可以通过Docker Compose实现,核心通过自定义Docker网络属性+端口映射规则即可完成配置,无需额外依赖第三方工具。
具体实现思路
1. 网络分层配置
- 自定义两个桥接网络:
- 内部业务网络:设置
internal: true属性,所有业务容器加入该网络,该网络默认禁止容器访问公网,仅允许同网络内的容器互相通信,因此业务容器只能访问同网络下监听3128端口的代理容器 - 代理公网网络:不开启
internal属性,仅代理容器加入该网络,支持公网访问
- 内部业务网络:设置
- 代理容器同时加入上述两个网络,既可以被内部业务容器正常访问,也可以独立连通公网
2. web端口暴露配置
- 需要向宿主机暴露web服务的业务容器,直接在Docker Compose配置中添加
ports端口映射规则即可,Docker会自动处理宿主机到内部容器的流量转发,不受internal网络的公网访问限制,宿主机可以正常访问映射后的端口
参考配置示例
version: '3.8' # 自定义网络声明 networks: internal-business-net: driver: bridge internal: true # 核心配置:禁止该网络内的容器直接访问公网 proxy-public-net: driver: bridge services: # 代理服务 proxy: image: squid:latest # 可替换为任意监听3128端口的代理镜像 networks: - internal-business-net - proxy-public-net restart: always # 普通业务容器(无需暴露端口) business-app1: image: your-app-image:v1 networks: - internal-business-net environment: # 配置业务容器走代理访问公网 - HTTP_PROXY=http://proxy:3128 - HTTPS_PROXY=http://proxy:3128 restart: always # 需暴露web端口的业务容器 web-app: image: your-web-image:v1 networks: - internal-business-net ports: - "8080:80" # 宿主机8080端口映射到容器的80 web端口 environment: - HTTP_PROXY=http://proxy:3128 - HTTPS_PROXY=http://proxy:3128 restart: always
效果验证方式
执行docker compose up -d启动所有服务后即可验证:
- 进入任意业务容器执行公网访问命令,无代理配置的请求会直接失败,走代理的请求可正常连通
- 宿主机访问
127.0.0.1:8080可正常打开web服务页面 - 进入代理容器执行公网访问命令可正常连通
内容的提问来源于stack exchange,提问作者Tom Raganowicz
相关产品推荐
相关产品推荐

