【问题标题】:Docker deployed image not accessible from outside host无法从外部主机访问 Docker 部署的映像
【发布时间】:2018-09-26 01:48:18
【问题描述】:

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

这些图像之间可能存在哪些差异,导致无法再通过 ip 地址访问端点?

我的 Docker 编写文件:

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

我的 Docker 文件:

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"

【问题讨论】:

  • 您引用了ports: 块引用端口 8000,但您的问题和 Dockerfile 说 8080。这是问题中的错字还是您的设置? AWS 安全组或主机 iptables 是否阻止了连接?
  • 这是一个错字,已修复。我将研究一个安全组并托管 iptables 的可能性。

标签: docker go amazon-ec2 ansible


【解决方案1】:

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

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

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

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

【讨论】:

  • 我已经尝试在上面显示的编辑中向 docker compose 添加端口参数,但没有成功。
【解决方案2】:

我们已经找到了答案。添加以下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,
    }

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

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2016-04-19
    • 1970-01-01
    • 2017-08-10
    • 2020-07-02
    相关资源
    最近更新 更多