因此,我有一个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"
答案 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,
}
我现在可以从主机外部访问服务器。