Mac,运行Docker Community Edition版本17.12.0-ce-mac49(21995)。
我已经使用Dockerfile Docker化了一个Web应用程序,如下所示:
with rasterio.open('https://pathto.tif') as dataset:
print(dataset.profile)
然后我按照这样构建那个图像:
FROM openjdk:8
RUN mkdir /opt/myapp
ADD build/libs/myapp.jar /opt/myapp
ADD application.yml /opt/myapp
ADD logback.groovy /opt/myapp
WORKDIR /opt/myapp
EXPOSE 9200
ENTRYPOINT ["java", "-Dspring.config=.", "-jar", "myapp.jar"]
然后我像这样运行该图像的容器:
docker build -t myapp .
在控制台中,我看到应用启动没有任何错误,一切似乎都很好。即使我的指标发布(每20秒发布心跳和其他健康指标)也会按照我的预期打印到控制台。一切似乎都很好。
除非我从另一个终端/会话对我的应用程序运行docker run -it -p 9200:9200 --net="host" --env-file ~/myapp-local.env --name myapp myapp
:
curl
现在,如果这是curl -i -H "Content-Type: application/json" -X POST -d '{"username":"heyitsme","password":"12345"}' http://localhost:9200/v1/auth/signIn
curl: (7) Failed to connect to localhost port 9200: Connection refused
路径无效的情况,或者我的请求实体/有效负载出现问题,服务器会接收它并发送错误(我向你保证;因为当我在Docker之外运行服务器作为一个独立的服务时,我可以确认这一点完全相同/v1/auth/signIn
。
因此肯定是 curl
命令无法连接到curl
的情况。同样,当我在Docker之外运行我的应用程序时,同样的localhost:9200
命令工作正常,所以我知道我的应用程序 试图在端口9200上站立。
关于这里可能出现什么问题的任何想法,或者我如何开始排除故障?
答案 0 :(得分:2)
问题似乎是在运行容器的网络模式下。
快速测试:登录到您的容器并在那里运行curl cmd,希望它能正常工作。这将隔离问题,以请求不从主机转发到容器。
尝试在默认网桥上运行容器并进行测试。
有关docker
中网络模式的详细信息,请参阅此blogTLDR;您需要添加IPtables条目以允许流量进入您的容器。
答案 1 :(得分:0)
检查您的应用是否绑定到0.0.0.0:9200而不是localhost:9200或类似的
答案 2 :(得分:0)
您运行容器的方式有两个相互矛盾的部分:
-p 9200:9200
说:"将容器的端口9200
发布(绑定)到主机的端口9200
" --net="host"
说:"使用主机的网络堆栈" 根据Docker for Mac - Networking docs / Known limitations, use cases, and workarounds,你应该只发布一个端口:
我想从Mac
连接到容器端口转发适用于localhost;
--publish
,-p
或-P
都可以正常工作。从Linux公开的端口将转发到Mac。我们目前的建议是发布端口,或从另一个容器连接。如果容器位于覆盖网络而不是桥接网络上,那么即使在Linux上也需要这样做,因为它们不会被路由。
运行“入门”中显示的nginx webserver的命令就是一个例子。
$ docker run -d -p 80:80 --name webserver nginx