Docker Compose配置:让服务a将服务b视为localhost且主机可访问b
可以实现,以下是正确配置方案
原配置的问题在于给服务b设置localhost别名的思路不对——容器自身的localhost默认指向容器内部,给其他服务加localhost别名不会改变当前容器对localhost的解析逻辑。下面提供两种可行方案:
方案一:iptables端口转发(推荐,不影响容器内其他localhost端口使用)
这种方式仅将localhost:8443的流量转发到服务b,不会干扰容器内对localhost其他端口的正常访问:
version: '3.9' services: a: image: my/image:1.2.3 ports: - 8080:8080 environment: B_SERVICE_URL: http://localhost:8443 depends_on: b: condition: service_started cap_add: - NET_ADMIN # 必须添加此权限才能修改容器内的iptables规则 command: > sh -c "iptables -t nat -A OUTPUT -p tcp --dport 8443 -d 127.0.0.1 -j DNAT --to-destination b:8443 && exec [你的服务启动命令]" # 注意:把[你的服务启动命令]替换成容器原本的启动指令,比如Java服务写java -jar app.jar,Node.js写npm start b: image: my/otherimage:1.2.3 ports: - 8443:8443
方案二:修改容器hosts文件(仅适用于容器无需访问自身localhost端口的场景)
如果服务a不需要通过localhost访问自身的服务端口(比如8080),可以直接修改hosts让localhost解析到服务b:
version: '3.9' services: a: image: my/image:1.2.3 ports: - 8080:8080 environment: B_SERVICE_URL: http://localhost:8443 depends_on: b: condition: service_started extra_hosts: - "localhost:b" # 借助Docker内置DNS,b会自动解析为服务b的容器IP b: image: my/otherimage:1.2.3 ports: - 8443:8443
两种方案都能满足你补充的需求:主机通过localhost:8443访问服务b,因为服务b已经配置了端口映射8443:8443。
内容的提问来源于stack exchange,提问作者sdgfsdh
相关产品推荐
相关产品推荐

