Breve descripción:
Nginx ejecutándose en docker, cómo configurar nginx para que reenvíe las llamadas al host.
Descripción larga:
Tenemos una aplicación web que se comunica con un par de backends (digamos rest1, rest2 y rest3). Somos responsables del rest1 .
Consideremos que inicié rest1 manualmente en mi PC y lo ejecuté en el puerto 2345. Quiero que nginx (que se ejecuta en la ventana acoplable) redirija todas las llamadas a rest1 a mi propia instancia en ejecución (nota, la instancia se ejecuta en el host, no en ningún contenedor ni en la ventana acoplable). Y para rest2 y rest3 a algún otro nodo docker o puede ser algún otro servidor (a quién le importa).
Lo que estoy buscando es:
docker-compose.yml (si es necesario).Gracias por adelantado.
Configure nginx de la siguiente manera (asegúrese de reemplazar la IP de Docker Host) y guárdelo como default.conf :
server { listen 80; server_name _; location / { proxy_pass http://<IP of Docker Host>; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }Ahora abre el contenedor:
docker run -d --name nginx -p 80:80 -v /path/to/nginx/config/default.conf:/etc/nginx/conf.d/default.conf nginxSi está utilizando la versión 3 del archivo Docker Compose, no necesita ninguna configuración especial para el archivo docker-compose.yml , solo use el nombre de DNS especial host.docker.internal para llegar a un servicio de host, como en el siguiente nginx.conf ejemplo nginx.conf :
events { worker_connections 1024; } http { upstream host_service { server host.docker.internal:2345; } server { listen 80; access_log /var/log/nginx/http_access.log combined; error_log /var/log/nginx/http_error.log; location / { proxy_pass http://host_service; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $realip_remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Connection ""; } } }Solución 1
Use network_mode: host , esto vinculará su instancia nginx a la interfaz de red del host. Esto podría generar conflictos al ejecutar varios contenedores nginx: cada puerto expuesto está vinculado a la interfaz del host.
Solución 2
Estoy ejecutando más instancias de nginx para cada servicio que me gustaría exponer al mundo exterior. Para mantener las configuraciones de nginx simples y evitar vincular cada nginx al host, use la estructura del contenedor:
dockerhost : un contenedor ficticio con network_mode: host
proxy : contenedor nginx utilizado como proxy para alojar el servicio,
vincule dockerhost a proxy , esto agregará una entrada /etc/hosts en el contenedor de proxy ; podemos usar 'dockerhost' como nombre de host en la configuración de nginx.
docker-compose.yaml
version: '3' services: dockerhost: image: alpine entrypoint: /bin/sh -c "tail -f /dev/null" network_mode: host proxy: image: nginx:alpine links: - dockerhost:dockerhost ports: - "18080:80" volumes: - /share/Container/nginx/default.conf:/etc/nginx/conf.d/default.conf:ropredeterminado.conf
location / { proxy_pass http://dockerhost:8080;Este método nos permite tener certificados automáticos de encriptación generados para cada servicio que se ejecuta en mi servidor. Si está interesado, puedo publicar una idea general sobre la solución.