Docker Nginx:在上游找不到主机

Ron*_*ang 4 proxy nginx amazon-ec2 docker

我的 docker 应用程序在 aws EC2 实例中运行,目前我正在尝试使用 Nginx 将应用程序映射到外部 IP 地址。这是我正在运行的容器的快照:

在此输入图像描述

我的测试应用程序是一个相当简单的应用程序,显示静态 html 网站。我使用以下命令部署它:

docker run -d --name=test-app test-app

nginx-proxy 有以下proxy.conf

server {
  listen 80;
  location / {
    proxy_pass http://test-app;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是 nginx 代理的 Dockerfile:

FROM nginx:alpine

RUN rm /etc/nginx/conf.d/*

COPY proxy.conf /etc/nginx/conf.d/

Run Code Online (Sandbox Code Playgroud)

nginx-proxy 使用以下命令运行: docker run -d -p 80:80 --name=nginx-proxy nginx-proxy

但是,nginx 容器永远不会运行,这里是我得到的错误日志

2020/03/27 15:55:19 [emerg] 1#1: host not found in upstream "test-app" in /etc/nginx/conf.d/proxy.conf:5
nginx: [emerg] host not found in upstream "test-app" in /etc/nginx/conf.d/proxy.conf:5
Run Code Online (Sandbox Code Playgroud)

TJ *_*man 9

当您的两个容器都在运行并且您已正确公开 NGINX 容器所需的端口时。您尚未公开test-app容器的任何端口。NGINX 容器无法与其对话。在您的情况下,直接公开端口docker run可能会破坏使用反向代理的意义。因此,在这种情况下您应该做的是为两个 Docker 容器创建一个网络,然后将它们添加到其中。然后他们将能够通过一座桥相互沟通。例如:

docker network create example
docker run -d --network=example --name=test-app test-app
docker run -d -p 80:80 --network=example --name=nginx-proxy nginx-proxy
Run Code Online (Sandbox Code Playgroud)

现在您的两个 pod 都位于同一网络上,Docker 将通过容器名称在它们之间启用基于 DNS 的服务发现,您将能够相互解析它们。您可以像这样测试连接性:docker exec -it nginx-proxy ping test-app。好吧,所提供的内容ping已安装在 Docker 容器中。