同VLAN下非Docker应用通过GET请求访问Docker容器的方法
容器跨机器访问配置及运行问题解答
跨机器访问的IP与端口说明
同一VLAN内的机器无法直接访问Docker容器的内部IP,必须通过运行容器的主机IP+主机上被映射的端口来访问,具体对应两种启动命令如下:
- 当使用命令
sudo docker run -d -p 8081:8081 myimage:2.0时:
主机的8081端口被映射到容器内部的8081端口,另一台机器发送GET请求时,使用主机IP:8081即可。 - 当使用命令
sudo docker run -d -p 80:8081 myimage:2.0时:
主机的80端口被映射到容器内部的8081端口,另一台机器发送GET请求时,使用主机IP:80(HTTP请求默认80端口可省略,但建议明确指定)。
容器运行状态的问题分析
- 你最初用
CMD tail -f /dev/null虽然能防止容器退出,但该命令会覆盖镜像中原有的应用启动指令,导致容器内的服务进程根本没启动,所以即使端口映射正确也无法访问。 - 后续在sh脚本中加入
while true; do sleep 1000; done后能成功访问,是因为这个脚本应该先启动了你的应用服务,再用循环维持容器运行——此时容器的主进程是脚本,而应用服务在后台正常运行,所以外部能正常请求。 - 更合理的做法是让容器的主进程直接是你的应用服务:比如如果是Java应用,将Dockerfile的
CMD设为CMD ["java", "-jar", "your-app.jar"],只要应用服务不崩溃退出,容器就会持续运行,无需额外的休眠或tail命令。
内容的提问来源于stack exchange,提问作者Ohad
相关产品推荐
相关产品推荐

