如何在docker-compose中动态将额外主机映射至容器网关?
解决Docker容器动态映射宿主机网关的问题
注意:你的环境不支持host-gateway
host-gateway是Docker 20.10.0及以上版本才引入的内置变量,你的Docker版本是18.09.1,没法直接用这个特性,得用其他动态方案。
方案一:启动时动态获取网关并传入
这是最适合你当前版本的动态映射方式:
- 先在启动
docker-compose的脚本里,获取Docker默认网桥的网关地址,然后作为环境变量传递:
# 获取默认bridge网络的网关地址 export DOCKER_GATEWAY=$(docker network inspect bridge --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}') # 启动服务 docker-compose up -d
- 修改你的
docker-compose.yml,把硬编码的IP换成这个环境变量:
version: '3' services: pdf-service: image: $IMAGE:latest container_name: pdf-$LOCALE environment: - NODE_ENV=production - LOCALE=${LOCALE} - API_URL=${API_URL} extra_hosts: - ${API_HOST}:${DOCKER_GATEWAY} tty: true restart: always ports: - ${PORT}:8124
这样不管在哪个设备上运行,都会自动获取当前设备的Docker网关地址,实现动态映射。
方案二:自定义网络(推荐长期使用)
如果你的服务需要更稳定的网络环境,可以创建自定义Docker网络,这样网关地址会更可控,而且可以避免默认bridge网络的一些限制:
version: '3' networks: pdf-network: driver: bridge ipam: config: - subnet: 172.30.0.0/16 # 可自定义子网,避免和其他网络冲突 gateway: 172.30.0.1 # 固定网关地址,只要不冲突就行 services: pdf-service: image: $IMAGE:latest container_name: pdf-$LOCALE environment: - NODE_ENV=production - LOCALE=${LOCALE} - API_URL=${API_URL} extra_hosts: - ${API_HOST}:172.30.0.1 networks: - pdf-network tty: true restart: always ports: - ${PORT}:8124
这种方式虽然网关是固定的,但因为是你自定义的网络,只要子网不与设备上的其他网络冲突,在任何设备上运行都不会有问题,也实现了跨设备的一致性。
方案三:使用宿主机网络(不推荐)
如果不需要容器的网络隔离,可以直接让容器使用宿主机的网络栈,这样调用外部API时直接用宿主机的网络配置,不需要额外映射:
version: '3' services: pdf-service: image: $IMAGE:latest container_name: pdf-$LOCALE environment: - NODE_ENV=production - LOCALE=${LOCALE} - API_URL=${API_URL} network_mode: host # 使用宿主机网络 tty: true restart: always ports: - ${PORT}:8124 # 提示:使用host模式时,端口映射可省略,直接用宿主机端口
但这种方式会失去容器的网络隔离性,容器会直接暴露在宿主机网络中,仅适合特殊场景。
内容的提问来源于stack exchange,提问作者karek
相关产品推荐
相关产品推荐

