Mac上的Docker正在运行,但拒绝暴露端口

时间:2018-03-21 18:58:51

标签: macos docker

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上站立。

关于这里可能出现什么问题的任何想法,或者我如何开始排除故障?

3 个答案:

答案 0 :(得分:2)

问题似乎是在运行容器的网络模式下。

快速测试:登录到您的容器并在那里运行curl cmd,希望它能正常工作。这将隔离问题,以请求不从主机转发到容器。

尝试在默认网桥上运行容器并进行测试。

有关docker

中网络模式的详细信息,请参阅此blog

TLDR;您需要添加IPtables条目以允许流量进入您的容器。

答案 1 :(得分:0)

检查您的应用是否绑定到0.0.0.0:9200而不是localhost:9200或类似的

答案 2 :(得分:0)

您运行容器的方式有两个相互矛盾的部分:

  1. -p 9200:9200说:"将容器的端口9200发布(绑定)到主机的端口9200"
  2. --net="host"说:"使用主机的网络堆栈"
  3. 根据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