Tengo dificultades para configurar la definición de tareas de AWS ECS para ejecutar contenedores simples basados en PHP-FPM y Nginx.
Mi contenedor de "aplicaciones" se ejecuta en la app:9000 y Nginx está en el puerto 80 . Nginx está reenviando la solicitud al contenedor de la aplicación a través de una fastcgi_pass app-upstream;
Todos estos están funcionando perfectamente en local. La misma configuración funciona perfectamente en la instancia de Docker de DigitalOcean, pero falla en AWS ECS.
Supongo que hay algún problema de configuración de definición de tareas, pero no puedo encontrarlo.
Registros de errores:
Obtengo este registro del contenedor Nginx
nginx: [emerg] host not found in upstream "app:9000" in /etc/nginx/conf.d/default.conf:2y este registro del contenedor de la aplicación (PHP-FPM)
ECS
Creé un clúster simple con la instancia T2 Small, que funciona perfectamente.
Dockerfile
En este Github Repo, agregué Dockerfile para la aplicación, la imagen de Nginx, el archivo docker-compose.yml y el archivo task-defination.json como referencia si hay algún error en los archivos de docker.
Código fuente en el repositorio de Github : https://github.com/arifulhb/docker-ecr-sample
Su problema está relacionado con la ruta ascendente incorrecta mencionada en la configuración de nginx.
Haga lo siguiente para investigar, también evite usar nombres de contenedores personalizados en archivos docker-compose si no es necesario específicamente: -
La resolución rápida sería: -
Forma adecuada y recomendada de crear archivos docker-compose: -
¿Cómo te ayuda esto? Tiene la capacidad de inspeccionar esta red que creó, averiguar si sus contenedores están correctamente conectados e identificar los nombres utilizados para la conexión.
Command : docker network inspect <network_name>
NOTE : Docker treats container names as host names by default for internal connections.
Cuando se utilizan varios contenedores, el nombre del contenedor es muy importante para proporcionar conectividad interna.
Como veo su archivo de redacción de Docker, el nombre del contenedor debe coincidir con el nombre utilizado en nginx conf.
version: '3' services: test_app: container_name: app # not test_app_1 volumes: - test-app-data:/var/www/app test_nginx: image: "xxxxxx.dkr.ecr.xx-xx-1.amazonaws.com/test-nginx" build: context: ./docker/nginx dockerfile: Dockerfile container_name: nginx ports: - "80:80" - "443:443" volumes: - test-app-data:/var/www/app - test-nginx-log:/var/log/nginx external_links: - app # not test_app_1 depends_on: - test_app volumes: test-app-data: test-nginx-log:Yo también tengo el mismo problema. Mi contenedor "blog" se ejecuta en el puerto blog:8000 y el contenedor "nginx" está en el puerto 80 . El contenedor "nginx" está reenviando la solicitud al contenedor "blog".
Porque no configuré "Enlaces" en "CONFIGURACIÓN DE RED" para el contenedor "nginx".
Así que puse el nombre del contenedor trasero "blog" en el contenedor frontal "nginx" ("Enlaces" en "CONFIGURACIÓN DE RED" para el contenedor "nginx").
Luego, fue exitoso ejecutar los contenedores "blog" y "nginx" correctamente.
Entonces, en su caso, coloque el nombre del contenedor posterior "aplicación" en el contenedor frontal "nginx" ("Enlaces" en "CONFIGURACIÓN DE RED" para el contenedor "nginx"). Funcionará. Usé la solución de Adiii .
No olvide poner " CMD-SHELL, curl -f http://localhost:9000/ || exit 1 " en "Command" en "HEALTHCHECK" para el contenedor "app".
Además, no olvide poner "aplicación" en "Nombre del contenedor" y seleccione "SANO" en "Condición" en "PEDIDO DE DEPENDENCIA DE INICIO" para el contenedor "nginx".