Docker 无法从主机访问容器中运行的服务器
我有一个简单的DockerfileDocker 无法从主机访问容器中运行的服务器,docker,dockerfile,docker-container,Docker,Dockerfile,Docker Container,我有一个简单的Dockerfile FROM golang:latest RUN mkdir -p /app WORKDIR /app COPY . . ENV GOPATH /app RUN go install huru EXPOSE 3000 ENTRYPOINT /app/bin/huru 我是这样建造的: docker build -t huru . 然后像这样跑: docker run -it -p 3000:3000 huru 出于某种原因,当我使用浏览器访问localhos
FROM golang:latest
RUN mkdir -p /app
WORKDIR /app
COPY . .
ENV GOPATH /app
RUN go install huru
EXPOSE 3000
ENTRYPOINT /app/bin/huru
我是这样建造的:
docker build -t huru .
然后像这样跑:
docker run -it -p 3000:3000 huru
出于某种原因,当我使用浏览器访问localhost:3000时,我得到
我以前曾将容器中运行的服务器暴露给主机,因此不确定发生了什么。如果您看到应用程序的日志,请参阅问题中提供的信息 (
docker logs
)之后,docker应用程序成功启动,并且看起来端口暴露已正确完成
在任何情况下,为了在容器启动并运行时查看端口映射,可以使用:
docker ps
并检查“端口”部分
如果您看到类似于0.0.0.0:3000->3000/tcp
然后我可以考虑一些防火墙规则,防止应用程序被访问
另一个可能的原因(尽管您可能已经检查过)是应用程序在您实际尝试在浏览器中访问它之前启动和完成
在这种情况下,docker ps
不会显示已退出的容器,但是docker ps-a
会显示
我能想到的最后一件事是,在docker容器本身中,应用程序并没有真正响应端口3000(我的意思是,可能启动脚本会在其他端口上启动web服务器,因此公开端口3000并没有真正起到任何作用)
为了检查这一点,您可以使用类似于docker exec-it
bash的内容输入docker容器本身
并使用
lsof-i
检查打开的端口,或者仅从容器itelf中检查wget localhost:3000
,如果有任何输出日志,请尝试此端口。请检查一下
FROM golang:latest
RUN apt -y update
RUN mkdir -p /app
COPY . /app
RUN go install huru
WORKDIR /app
docker build -t huru:latest .
docker run -it -p 3000:3000 huru:latest bin/huru
请尝试以下url:
我使用环回您是否执行了docker容器并对其进行了测试。hmmm它在容器外部工作,并且在容器内部运行时日志记录看起来很好,我可以验证它是否在正确的端口上侦听,etcDoes
docker run
记录任何错误?(您甚至可以粘贴整个输出,这将有助于调试问题)其次,你如何准确地启动这个服务器(查看Dockerfile,在容器的开头它将运行/app/bin/huru
,没有任何参数)是的docker ps
给了我0.0.0:3000->3000/tcp
,所以是的,idkI认为这可能是golang的事情,不应该有防火墙问题,tmk,从容器中出来的日志显示golang代码工作,golang服务器在容器中运行,并在正确的端口上侦听。侦听“0.0.0.0”而不是“localhost”使其工作!哈哈,fml,为什么???我希望我知道更多关于网络的知识