无法从外部主机访问的Docker部署映像

时间:2018-09-24 23:44:30

标签: docker go amazon-ec2 ansible

因此,我有一个Go应用程序,该应用程序将使用Ansible和Jenkins管道作为Docker映像部署到EC2实例。我有一个映像,可以使用Postman使用IP地址和端口号8080从主机外部访问。部署新映像时,无法使用IP地址和端口号获得响应。当我进入服务器时,可以使用 localhost 和端口号到达端点。如果我停止该图像并开始第一个图像,则可以再次到达它。

这些图像之间可能有什么区别,使其无法再通过ip地址访问端点?

我的Docker Compose文件:

version: '2'
services:
  project-1:
    image: ...
    volumes:
      - /var/log:/var/log
    network_mode: host
    environment:
      - ...
    cpu_shares: 1236
    mem_limit: 2619m

我的DockerFile:

FROM golang:1.10

WORKDIR /go/src/...
COPY . .

RUN go get -d -v ./...
RUN go install -v ./...

EXPOSE 8080-8080
CMD ./run.sh

我还尝试了从Docker Compose文件中删除network_mode并将其替换为如下所示的端口,但没有成功:

ports:
      - "0.0.0.0:8080:8080"

2 个答案:

答案 0 :(得分:0)

确保容器将端口绑定到主机端口。在container networking文档中,您可以阅读以下内容:

  

默认情况下,创建容器时,它不会发布任何   通往外界的港口。使端口可用于服务   Docker外部或未连接的Docker容器   容器的网络,请使用--publish或-p标志。这创建了一个   将容器端口映射到Docker上的端口的防火墙规则   主办。这是一些示例。

您可以尝试使用上面说明的-p标志运行容器:

docker run -p 0.0.0.0:8080:80 your-container-image

答案 1 :(得分:0)

我们找到了答案。添加以下go代码后,就会发生此问题:

serv := &http.Server{
    Addr:         "localhost" + port,
    ReadTimeout:  60 * time.Second,
    WriteTimeout: 60 * time.Second,
    Handler:      router,
}

这将设置响应超时。我们发现单词“ localhost”未映射到主机的IP地址。将其更改为以下内容可解决此问题:

    serv := &http.Server{
        Addr:         "0.0.0.0" + port,
        ReadTimeout:  60 * time.Second,
        WriteTimeout: 60 * time.Second,
        Handler:      router,
    }

我现在可以从主机外部访问服务器。