Azure Pipeline部署作业中容器端口映射失效求助
问题原因与解决方案
问题根源
当你将Pipeline改为使用container: builder配置后,所有步骤都在builder容器内部执行:
- 你运行
docker run -p 127.0.0.1:9000:9000时,是把test-server的9000端口映射到**宿主机(ubuntu-latest虚拟机)**的localhost:9000; - 但
curl http://localhost:9000是在builder容器内部执行的,容器的localhost与宿主机的localhost属于不同网络空间,因此无法连接; - 而
docker exec test-server curl ...是直接在test-server容器内部访问服务,所以能正常工作。
解决方案
方案1:通过宿主机别名访问
在builder容器中,可使用host.docker.internal直接访问宿主机(Azure Pipelines的ubuntu-latest环境默认支持该解析):
docker run -d --name test-server \ -p 9000:9000/tcp \ my.azurecr.io/test-server-ubuntu:latest sleep 5 curl http://host.docker.internal:9000/
方案2:使用自定义Docker网络(推荐)
创建共享网络,让builder容器与test-server容器直接通过容器名通信,无需端口映射:
# 创建自定义网络 docker network create test-network # 启动test-server到该网络 docker run -d --name test-server --network test-network \ my.azurecr.io/test-server-ubuntu:latest sleep 5 # Docker会自动解析容器名对应的IP curl http://test-server:9000/
方案3:获取宿主机IP访问
如果host.docker.internal不可用,可通过命令获取宿主机IP:
docker run -d --name test-server \ -p 0.0.0.0:9000:9000/tcp \ my.azurecr.io/test-server-ubuntu:latest sleep 5 # 在builder容器内获取宿主机默认网关IP(即宿主机IP) HOST_IP=$(ip route | grep default | awk '{print $3}') curl http://$HOST_IP:9000/
内容的提问来源于stack exchange,提问作者Boris L
相关产品推荐
相关产品推荐

