111: Conexión rechazada del proxy nginx para contenedores Docker

  • CentOS 7

Tengo un contenedor Docker proxy Nginx simple que escucha en el puerto 80. Aquí está el Dockerfile:

FROM centos:7MAINTAINER Brian Ogden# Not currently being used but may come in handyARG ENVIRONMENTRUN yum -y update && \    yum clean all && \    yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \    yum -y makecache && \    yum -y install nginx-1.12.0 wget# Cleanup some default NGINX configuration files we don’t needRUN rm -f /etc/nginx/conf.d/default.confCOPY /conf/proxy.conf /etc/nginx/conf.d/proxy.confCOPY /conf/nginx.conf /etc/nginx/nginx.confCMD ["nginx"]

Y para este Proxy Nginx aquí está mi nginx.conf:

daemon off;user  nginx;worker_processes  2;error_log  /var/log/nginx/error.log warn;pid        /var/run/nginx.pid;events {    worker_connections  1024;    use epoll;    accept_mutex off;}http {    include       /etc/nginx/mime.types;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    default_type  application/octet-stream;    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';    access_log  /var/log/nginx/access.log  main;    sendfile        on;    #tcp_nopush     on;    keepalive_timeout  65;    client_max_body_size 300m;    client_body_buffer_size 300k;    large_client_header_buffers 8 64k;    gzip  on;    gzip_http_version 1.0;    gzip_comp_level 6;    gzip_min_length 0;    gzip_buffers 16 8k;    gzip_proxied any;    gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;    gzip_disable "MSIE [1-6]\.";    gzip_vary on;    include /etc/nginx/conf.d/*.conf;}

Y aquí está mi configuración de proxy:

upstream accountstaging {    server 127.0.0.1:5023;}server {    listen 80;    server_name account.staging.mysite.com;    location / {        proxy_pass         http://accountstaging;        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;    }}

Mi configuración de proxy está escuchando en el puerto 80 e intentando solicitar solicitudes de account.staging.mysite.com a un contenedor Docker que se ejecuta en el mismo host Docker que el proxy Ngnix que escucha en el puerto 5023.

Aquí está mi docker-compose.yml para mi proxy Nginx:

version: '3'services:  reverseproxy:    build:       context: ./      dockerfile: docker/Dockerfile    image: tsl.devops.reverseproxy.image    container_name: tsl.devops.reverseproxy.container    ports:      - "80:80"

Aquí está el docker-compose.yml para este contenedor Docker que escucha en el puerto 5023: versión: '3'

services:  apistaging:    build:       context: ./      dockerfile: docker/staging/Dockerfile    image: tsl.api.example.image    container_name: tsl.api.example.container    ports:      - "127.0.0.1:5023:80"

El Dockerfile realmente no importa mucho para mi pregunta, pero aquí está de todos modos:

FROM tsl.devops.dotnetcore.base.image:2MAINTAINER Brian OgdenWORKDIR /appCOPY ./src/Tsl.Example/bin/Release/netcoreapp2.0/publish .ENTRYPOINT ["dotnet", "Tsl.Example.dll"]

Yo seguí este ejemplo para configurar mi proxy.

Anteriormente hice una pregunta relacionada en los foros de Stackexchange aqui y aqui. En esta pregunta, he refinado y simplificado el escenario a un simple proxy que reenvía una solicitud a un contenedor Docker que escucha en el puerto 5023.

Como mi imagen base es CentOS, he seguido esto aquí para asegurarse de que SELinux está permitiendo el reenvío al puerto 5023

Gracias a esto pregunta y respuesta aquí, Pude darme cuenta de que tenía dos problemas en marcha:

  1. los contenedores tienen diferentes redes de Docker predeterminadas porque estoy usando dos docker-compose diferentes.archivos yml, había imaginado que mi proxy Ngnix funcionaría independientemente de cualquiera de mis contenedores API por completo, incluido docker-compose, más sobre ese tema a continuación
  2. el segundo problema es simplemente cuando intenté proxy a 127.0.0.1:5023 que es localhost dentro del contenedor Ngnix, no la red fuera del contenedor proxy Nginx

Por lo tanto, las diferentes redes predeterminadas que crea docker-compose para mi contenedor docker proxy Nginx y mi contenedor docker api se deben a que estoy usando dos docker-compose diferentes.archivos yml. Esto se debe a que tengo compilaciones de Jenkins para muchos microservicios de API, por lo que tienen archivos independientes de docker-compose y necesitaba un proxy Nginx para reenviar solicitudes en el puerto 80 a cada microservicio.

Para probar esto, creó un docker-compose.yml para ambos contenedores, la API y el proxy Nginx:

version: '3'services:  reverseproxy:    build:       context: ./      dockerfile: docker/nginxproxy/docker/Dockerfile    image: tsl.devops.reverseproxy.image    container_name: tsl.devops.reverseproxy.container    ports:      - "80:80"  apistaging:    build:       context: ./      dockerfile: docker/staging/Dockerfile    image: tsl.api.example.image    container_name: tsl.api.example.container    ports:      - "5023:5023"    environment:       ASPNETCORE_URLS: http://+:5023

Sí, todavía había un problema, el proxy pasa a http//: 127.0.0.1:5023, ese reenvío permanece en el contenedor Docker Nginx y nunca encuentra la API que se ejecuta en el host Docker, simplemente necesitaba usar docker-compose.nombre de servicio yml para llegar a él:

upstream accountstaging {    server apistaging:5023;}server {    listen 80;    server_name account.staging.mysite.com;    location / {        proxy_pass         http://accountstaging;        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;    }}

Tuve este problema, pero mi problema era que tenía dos carpetas que tenían docker-compose.archivos yml que tenían un servicio llamado 'web'. Cambié el nombre de uno de los servicios.

La imagen completa para ayudar a alguien que lucha con docker networks tanto como yo (¿lo soy?):

Los proyectos basados en Docker a menudo usan nginx como proxy inverso para enrutar el tráfico http a los otros servicios de docker. nginx era un servicio en mi projectfolder/docker-compose.yml que estaba conectado a dos redes docker.

Una fue la red predeterminada creada cuando usé docker-compose up en projectfolder/docker-compose.yml (Se llama projectfolder_default y los servicios se conectan a él de forma predeterminada, a menos que tenga un networks propiedad para su servicio con otra red, luego asegúrese de agregar - default a la lista). Cuando corrí docker network ls Yo vi projectfolder_default en la lista y cuando corrí docker network inspect projectfolder_default Vi el contenedor nginx, así que todo estaba bien.

La otra era una red llamada my_custom_network que yo mismo establecí. Tenía un script de inicio que lo creaba si no existía usando https://stackoverflow.com/a/53052379/13815107 Lo necesitaba para hablar con el web servicio en otherproject/docker-compose.yml. Yo había añadido correctamente my_custom_network a:

  • nginx lista de redes del servicio de projectfolder/docker-compose.yml
  • parte inferior de projectfolder/docker-compose.yml
  • web redes de servicio en otherproject/docker-compose.yml
  • parte inferior de otherproject/docker-compose.yml

La red apareció y tenía los contenedores correctos. docker network ls y docker network inspect my_custom_network

Sin embargo, asumí que llamar http://web se asignaría al servicio docker web.projectfolder_default. Me equivoqué. Abrí shell en el contenedor nginx (docker exec -it nginx sh). Cuando usé ping web (puede ser necesario apt-get update, apt-get install iputils-ping) tuvo éxito, pero imprimió una URL con my_custom_network que es como me di cuenta del error.

carpeta de proyecto / docker-compose.yml

  services:    # http://web did NOT map to this service!! Use http://web.main_default or change the names    web:      ...     nginx:        ...      links:        - web      networks:        - default        - my_custom_network    ...  networks:    - my_custom_network      external: true

otherproject / docker-compose.yml

  services:    # http://web connected to this service instead. You could use http://web.my_custom_network to call it out instead    web:      ...       networks:        - default        - my_custom_network    ...  networks:    - my_custom_network      external: true

carpeta de proyecto/.../nginx/servidor.conf.plantilla (junto a Dockerfile)...

server {    ...    location /auth {        internal;        # This routed to wrong 'web'        proxy_pass              http://web:9001;        proxy_pass_request_body off;        proxy_set_header        Content-Length "";    }    location / {        alias /data/dist/;    }    location /robots.txt {        alias /robots.txt;    }    # Project Folder backend    location ~ ^/(api|login|logout)/ {        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-Proto $scheme;        proxy_connect_timeout 300s;        proxy_read_timeout 300s;        # This routed to wrong 'web'        proxy_pass http://web:9001;    }    # Other project UI    location /other-project {        alias /data/other-project-client/dist/;    }    # Other project Django server    location ~ ^/other-project/(rest)/ {        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-Proto $scheme;        proxy_connect_timeout 300s;        proxy_read_timeout 300s;        # This should work        proxy_pass http://web.my_custom_network:8000;    }}