使用nginx设置Docker多容器。Nginx无法识别主机(上游未找到主机)

使用nginx设置Docker多容器。Nginx无法识别主机(上游未找到主机),docker,nginx,Docker,Nginx,所以我正在学习Docker以及如何将应用程序封装到服务中。我不确定我是否一路都得到了 我有三项服务: web服务器nginx服务器,将端口80和443绑定到外部。基本上是应用程序的“前端” app1NodeJS应用程序,在端口3000上提供内容 app2NodeJS应用程序在端口3000上提供内容,基本上它是app1的克隆,我使用它只是为了学习 现在,我在prod中运行这个“应用程序”的想法是启动所有服务的docker compose up。这是启动多容器应用程序的正确方法吗 我的回购结构如下:

所以我正在学习Docker以及如何将应用程序封装到服务中。我不确定我是否一路都得到了

我有三项服务:

  • web服务器
    nginx服务器,将端口80和443绑定到外部。基本上是应用程序的“前端”
  • app1
    NodeJS应用程序,在端口3000上提供内容
  • app2
    NodeJS应用程序在端口3000上提供内容,基本上它是
    app1
    的克隆,我使用它只是为了学习
  • 现在,我在prod中运行这个“应用程序”的想法是启动所有服务的
    docker compose up
    。这是启动多容器应用程序的正确方法吗

    我的回购结构如下:

    .
    ├── Dockerfile
    ├── app1
    │   ├── Dockerfile
    │   ├── index.js
    │   ├── package-lock.json
    │   └── package.json
    ├── app2
    │   ├── Dockerfile
    │   ├── index.js
    │   ├── package-lock.json
    │   └── package.json
    ├── docker-compose.yml
    ├── index.html
    └── web-server.conf
    
    Dockerfile
    用于
    web服务器
    服务。我的
    docker compose.yml
    如下所示:

    version: '3'
    services:
      web-server:
        container_name: web-server
        build: .
        ports:
          - "80:80"
          - "443:443"
        depends_on:
          - app1
          - app2
      app1:
        container_name: app1
        build: ./app1
        restart: always
      app2:
        container_name: app2
        build: ./app2
        restart: always
    
    命令
    docker compose up
    生成
    app1
    app2
    图像,但在
    web服务器上失败,因为
    nginx
    抛出错误:

    host not found in upstream "app1" in /etc/nginx/conf.d/default.conf:11
    nginx: [emerg] host not found in upstream "app1" in /etc/nginx/conf.d/default.conf:11
    
    web服务器
    service
    Dockerfile

    FROM nginx:alpine
    EXPOSE 80
    
    COPY ./web-server.conf /etc/nginx/conf.d/default.conf
    COPY ./index.html /var/www/html/
    
    RUN apk add bash
    
    RUN nginx
    
    webserver.conf的内容

    server {
     listen *:80;
     server_name web_server;
     root /var/www/html;
    
     location / {
       index index.html;
     }
    
     location /app1 {
       proxy_pass http://app1:3000;
       proxy_redirect off;
     }
    
     location /app2 {
       proxy_pass http://app2:3000;
       proxy_redirect off;
     }
    }
    
    
    在我看来,nginx的配置似乎无法识别
    http://app1
    生成时的主机名。我尝试进行实验,并用
    localhost
    替换了
    proxy\u pass
    指令的值。这将建立我可以与其他图像一起运行的图像。如果我做了
    bundle exec-it web服务器image/bin/bash
    并尝试
    curlhttp://app1:3000
    然后它就可以工作了。如果我编辑
    nginx
    config以指向这些URL,它就会开始工作

    因此,我想我已经做到了,但在运行
    docker compose up
    时,它似乎无法识别主机名


    有什么想法吗?我的方法正确吗?

    如果只删除web服务器
    Dockerfile
    末尾的两行
    RUN
    ,这将正常工作

    如果你看这张图片的结尾是

    CMD ["nginx", "-g", "daemon off;"]
    
    这将被你的形象所继承;当容器启动时,无需执行任何特殊操作即可启动nginx

    同时,在Dockerfile运行时,构建序列在一个相当隔离的环境中运行:没有设置任何Compose network环境,其他容器不一定在运行,卷也没有连接,等。唯一生效的自定义设置是
    docker compose.yml
    文件中块中特定的内容


    因此:当Dockerfile运行
    运行nginx
    时,它会尝试在构建环境中启动nginx,但该环境未连接到Compose网络,因此失败。但是您根本不需要这样做,因为基本图像已经有了
    CMD nginx…
    设置,只需删除该行就可以修复它。

    真的!该死的服务我很好,我应该阅读更多关于托管docker图像下一次(或只是建立我自己的)。很好,非常感谢。我在这上面浪费了几个小时。