[CloudBro AI Bot Response]
이 문제는 Docker Compose의 네트워크 초기화 타이밍과 DNS 해석 문제에서 비롯됩니다. nginx 컨테이너가 시작할 때 waapi_php_1 호스트명이 아직 DNS에 등록되지 않아 “host not found in upstream” 에러가 발생하는 것입니다.
Docker Compose 1.5와 Docker 1.9의 네트워킹 기능(--x-networking)은 각 컨테이너에 서비스명 기반의 DNS 이름 해석을 제공합니다. 즉, 컨테이너 간 통신 시 컨테이너 이름(php, mongo, nginx)을 직접 호스트명으로 사용할 수 있어야 합니다. 그런데 현재 fastcgi_pass waapi_php_1:9000;로 되어 있는데, 이는 Docker Compose가 생성한 컨테이너 이름이며, Compose 네트워크 내에서의 서비스 이름(php)과 다릅니다.
해결 방법
upstream 호스트명을 서비스명으로 변경 default.conf에서 fastcgi_pass waapi_php_1:9000;를 fastcgi_pass php:9000;으로 변경하세요.
fastcgi_pass php:9000;
Docker Compose 네트워크는 서비스명을 DNS 이름으로 인식하므로, php로 지정하면 컨테이너가 시작되면서 바로 이름 해석이 가능합니다.
docker-compose.yml에 네트워크 명시
Docker Compose 1.5에서 --x-networking이 실험적 기능이었기 때문에, 명시적으로 네트워크를 정의하고 각 서비스에 연결해주는 것이 안정적입니다.
컨테이너 시작 순서 보장
네트워크 이름 해석 문제 외에도 nginx가 php가 완전히 시작되기 전에 실행되어 연결이 실패할 수 있습니다. 이를 방지하기 위해 docker-compose에서 depends_on을 사용해 nginx가 php에 의존하도록 설정할 수 있습니다.
nginx:
...
depends_on:
- php
- ```
다만 `depends_on`은 컨테이너가 "시작된" 상태만 보장할 뿐, 서비스가 완전히 준비된 상태까지는 보장하지 않습니다. 필요하다면 `wait-for-it.sh` 같은 스크립트를 통해 `php-fpm` 포트가 열릴 때까지 대기하는 방법도 고려하세요.
요약
fastcgi_pass에서 컨테이너 이름 대신 서비스명(php)을 사용하세요.
Compose 파일에 명시적으로 네트워크를 정의하고 모든 서비스가 같은 네트워크에 속하도록 하세요.
depends_on으로 컨테이너 시작 순서를 지정하고, 필요시 서비스 준비 상태를 체크하는 스크립트를 추가하세요.
이렇게 하면 docker-compose up 한 번에 모든 컨테이너가 정상적으로 네트워킹되어 nginx가 바로 php-fpm에 연결할 수 있습니다.