【问题标题】:Nginx upstream doesn't work with docker deploy stackNginx 上游不适用于 docker deploy 堆栈
【发布时间】:2019-03-23 21:24:24
【问题描述】:

我正在尝试使用 docker 部署堆栈。

这是我的堆栈的工作原理:

  • nginx-proxy(将用户请求重定向到好的容器)
  • 网站(简单的 nginx 服务于网站)
  • api(django 应用,使用 gunicorn 启动)
  • nginx-api(提供静态文件和上传的文件,如果是端点则重定向到API容器)

这是我的 docker-compose.yml:

version: '3.2'

services:
    website:
        container_name: nyl2pronos-website
        image: nyl2pronos-website
        restart: always
        build:
          context: nyl2pronos_webapp
          dockerfile: Dockerfile
        volumes:
            - ./logs/nginx-website:/var/log/nginx
        expose:
            - "80"
        deploy:
            replicas: 10
            update_config:
                parallelism: 5
                delay: 10s

    api:
        container_name: nyl2pronos-api
        build:
            context: nyl2pronos_api
            dockerfile: Dockerfile
        image: nyl2pronos-api
        restart: always
        ports:
            - 8001:80
        expose:
            - "80"      
        depends_on:
            - db
            - memcached
        environment:
            - DJANGO_PRODUCTION=1
        volumes:
            - ./data/api/uploads:/code/uploads
            - ./data/api/static:/code/static

    nginx-api:
        image: nginx:latest
        container_name: nyl2pronos-nginx-api
        restart: always
        expose:
            - "80"
        volumes:          
            - ./data/api/uploads:/uploads
            - ./data/api/static:/static
            - ./nyl2pronos_api/config:/etc/nginx/conf.d
            - ./logs/nginx-api:/var/log/nginx
        depends_on:
            - api

    nginx-proxy:
        image: nginx:latest
        container_name: nyl2pronos-proxy
        restart: always
        ports:
            - 80:80
            - 443:443
        volumes: 
            - ./proxy:/etc/nginx/conf.d
            - /etc/letsencrypt:/etc/letsencrypt
            - ./logs/nginx-proxy:/var/log/nginx
        deploy:
            placement:
                constraints: [node.role == manager]
        depends_on:
            - nginx-api
            - website

当我使用 docker-compose up 时,一切正常。 但是当我尝试使用 docker stack deploy --compose-file=docker-compose.yml prod 进行部署时。我的 nginx 配置文件找不到不同的上游

这是我的服务nginx-api提供的错误:

2019/03/23 17:32:41 [emerg] 1#1: host not found in upstream "api" in /etc/nginx/conf.d/nginx.conf:2

见下面我的nginx.conf

upstream docker-api {
    server api;
}

server {
    listen 80;
    server_name xxxxxxxxxxxxxx;

    location /static {
        autoindex on;
        alias /static/;
    }

    location /uploads {
        autoindex on;
        alias /uploads/;
    }

    location / {
        proxy_pass         http://docker-api;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    }
}

如果您发现我的配置有问题或者我可以做得更好,请告诉我!

【问题讨论】:

    标签: docker nginx docker-compose docker-swarm


    【解决方案1】:

    这是因为nginx-api 服务在api 服务之前启动。

    但我添加了depends_on 选项?

    你是对的,这个选项应该适用于docker-compose up 的情况。 但不幸的是不在docker stack deploy 上,或者正如docs 所说:

    在 swarm 模式下部署堆栈时,depends_on 选项被忽略 使用版本 3 Compose 文件。

    好的,那我现在能做什么?

    什么都没有。它实际上不是一个错误-

    docker swarm 节点(您的堆栈服务)应该在出错时自动恢复。 (这就是你定义restart: always 选项的原因)。所以无论如何它应该对你有用。

    如果您仅将 compose 文件用于部署堆栈而不是在 docker-compose up 上 - 您可以完全删除 depends_on 选项,这对 docker stack 没有任何意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 2016-12-10
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多