Recientemente comencé a migrar a las funciones de red de Docker 1.9 y Docker-Compose 1.5 para reemplazar el uso de enlaces.
Hasta ahora, con los enlaces, no hubo problemas con nginx para conectarse a mi servidor php5-fpm fastcgi ubicado en un servidor diferente en un grupo a través de docker-compose. Sin embargo, recientemente cuando ejecuto docker-compose --x-networking up
mis contenedores php-fpm, mongo y nginx arrancan, sin embargo, nginx se cierra de inmediato[emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16
Sin embargo, si ejecuto el comando docker-compose nuevamente mientras se ejecutan los contenedores php y mongo (nginx salió), nginx se inicia y funciona bien a partir de ese momento.
Este es mi docker-compose.yml
archivo:
nginx:
image: nginx
ports:
- "42080:80"
volumes:
- ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
php:
build: config/docker/php
ports:
- "42022:22"
volumes:
- .:/var/www/html
env_file: config/docker/php/.env.development
mongo:
image: mongo
ports:
- "42017:27017"
volumes:
- /var/mongodata/wa-api:/data/db
command: --smallfiles
Este es mi default.conf
para nginx:
server {
listen 80;
root /var/www/test;
error_log /dev/stdout debug;
access_log /dev/stdout;
location / {
# try to serve file directly, fallback to app.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/.+\.php(/|$) {
# Referencing the php service host (Docker)
fastcgi_pass waapi_php_1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
# We must reference the document_root of the external server ourselves here.
fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
¿Cómo puedo hacer que nginx funcione con una sola llamada docker-compose?
fuente
Respuestas:
Existe la posibilidad de usar "volume_from" como una solución alternativa hasta que se introduzca la función depende_en (que se explica a continuación). Todo lo que tiene que hacer es cambiar su archivo de composición de docker como se muestra a continuación:
Una gran advertencia en el enfoque anterior es que los volúmenes de php están expuestos a nginx, lo cual no es deseado. Pero por el momento, esta es una solución alternativa específica de Docker que podría usarse.
Depende de la función Esto probablemente sería una respuesta futurista. Porque la funcionalidad aún no está implementada en Docker (a partir de 1.9)
Existe una propuesta para introducir "depende_en" en la nueva función de red introducida por Docker. Pero existe un debate de larga duración sobre el mismo @ https://github.com/docker/compose/issues/374 Por lo tanto, una vez que se implemente, la función depend_on podría usarse para ordenar el inicio del contenedor, pero en el momento, tendría que recurrir a uno de los siguientes:
fuente
links:
que incluí en nginx usaran el mismo nombre que el servicio en sí, como- my-service:my-service
en este ejemplo- mongo:mongo
.Esto se puede solucionar con la
depends_on
directiva mencionada ya que está implementada ahora (2016):Probado con éxito con:
Encuentre más detalles en la documentación .
También hay un artículo muy interesante dedicado a este tema: Control del orden de inicio en Compose
fuente
Puede configurar las directivas max_fails y fail_timeout de nginx para indicar que el nginx debe reintentar el número x de solicitudes de conexión al contenedor antes de fallar en la indisponibilidad del servidor ascendente.
Puede ajustar estos dos números según su infraestructura y la velocidad a la que se desarrolla toda la configuración. Puede leer más detalles sobre la sección de controles de estado de la siguiente URL: http://nginx.org/en/docs/http/load_balancing.html
A continuación se muestra el extracto de http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
max_fails=number
fail_timeout=time
Para ser precisos, su archivo de configuración nginx modificado debe ser el siguiente (esta secuencia de comandos asume que todos los contenedores están activos por lo menos 25 segundos, si no, cambie el fail_timeout o max_fails en la sección anterior): Nota: no lo hice probar el guión yo mismo, para que pueda probarlo.
Además, según la siguiente nota de docker ( https://github.com/docker/docker.github.io/blob/master/compose/networking.md#update-containers ), es evidente que la lógica de reintento para verificar la salud de los otros contenedores no es responsabilidad del estibador y, más bien, los contenedores deben hacer el control de salud ellos mismos.
fuente
Creo que Nginx no tiene en cuenta el solucionador de Docker (127.0.0.11), así que, por favor, ¿puedes intentar agregar:
en su archivo de configuración de nginx?
fuente
resolver 127.0.0.11 8.8.8.8;
Si estás tan perdido, lee el último comentario. He llegado a otra solución.
El principal problema es la forma en que nombró los nombres de los servicios.
En este caso, si en tu
docker-compose.yml
, los servicios para php se llaman "api" o algo así, debes asegurarte de que en el archivonginx.conf
la línea que comienza confastcgi_pass
tenga el mismo nombre que el servicio php. es decirfastcgi_pass api:9000;
fuente
Tuve el mismo problema porque había dos redes definidas en mi
docker-compose.yml
: una backend y una frontend.Cuando cambié eso para ejecutar contenedores en la misma red predeterminada, todo comenzó a funcionar bien.
fuente
Tuve el mismo problema y lo solucioné. Agregue la siguiente línea a la sección nginx docker-compose.yml:
El host en la sección nginx config fastcgi_pass debe estar vinculado dentro de la configuración nginx de docker-compose.yml.
fuente
Dos cosas que vale la pena mencionar:
links
para agregar hosts resolMi ejemplo:
Si no especifica un puente de red especial, todos usarán el mismo predeterminado.
fuente
A primera vista, me perdí que mi servicio "web" en realidad no se inició, por eso nginx no pudo encontrar ningún host
fuente
Con los enlaces, se aplica un orden de inicio del contenedor. Sin enlaces, los contenedores pueden comenzar en cualquier orden (o realmente todos a la vez).
Creo que la configuración anterior podría haber tenido el mismo problema, si el
waapi_php_1
contenedor tardaba en iniciarse.Creo que para que funcione, podría crear un script de punto de entrada nginx que sondea y espera a que el contenedor php se inicie y esté listo.
No estoy seguro de si nginx tiene alguna forma de reintentar la conexión al flujo ascendente automáticamente, pero si lo hace, sería una mejor opción.
fuente
Tienes que usar algo como docker-gen para actualizar dinámicamente la configuración de nginx cuando tu backend está activo.
Ver:
Creo que Nginx + (versión premium) también contiene un parámetro de resolución ( http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream )
fuente
Quizás la mejor opción para evitar problemas de vinculación de contenedores son las funciones de red de la ventana acoplable
Pero para que esto funcione, Docker crea entradas en / etc / hosts para cada contenedor a partir de los nombres asignados a cada contenedor.
Para no depender de cambios inesperados en estos nombres, debe usar el parámetro
en su docker-compose.yml de la siguiente manera:
Asegúrese de que sea el mismo nombre asignado en su archivo de configuración para este servicio. Estoy bastante seguro de que hay mejores formas de hacer esto, pero es un buen enfoque para empezar.
fuente
Mi solución (después de mucho ensayo y error):
Para solucionar este problema, tuve que obtener el nombre completo del contenedor Docker 'ascendente', que se encuentra al ejecutar
docker network inspect my-special-docker-network
y obtener laname
propiedad completa del contenedor ascendente como tal:Luego usé esto en el
my-network.local.conf
archivo NGINX en ellocation
bloque de laproxy_pass
propiedad: (Tenga en cuenta la adición del GUID al nombre del contenedor):A diferencia de lo que antes funcionaba, pero ahora está roto:
La causa más probable es un cambio reciente en Docker Compose, en su esquema de nomenclatura predeterminado para contenedores, como se enumera aquí .
Esto parece estar sucediendo para mí y mi equipo en el trabajo, con las últimas versiones de la
nginx
imagen de Docker :fuente
(nuevo en nginx) En mi caso, era un nombre de carpeta incorrecto
Para config
asegúrese de que la carpeta de la aplicación esté en la carpeta ex2:
ex2 / app / ...
fuente
Este error me apareció porque mi
php-fpm
imagen estaba habilitadacron
y no tengo idea de por quéfuente
Mi problema fue que olvidé especificar el alias de red en docker-compose.yml en php-fpm
¡Funciona bien!
fuente
Agregue la sección de enlaces a la configuración de su contenedor nginx.
Tienes que hacer visible el
php
contenedor alnginx
contenedor.fuente
link
esté obsoleto. ¿Me estoy perdiendo de algo?docker-compose --x-networking up
con enlaces definidos en midocker-compose.yml
, recibo esta advertencia clara:WARNING: "nginx" defines links, which are not compatible with Docker networking and will be ignored. Future versions of Docker will not support links - you should remove them for forwards-compatibility.
docker-compose.yml
archivado en una carpeta con nombrewaapi
?waapi