docker 및 docker-compose를 사용해 보았는데 질문이 있습니다.
현재 내 docker-compose.yml은 다음과 같습니다.
app:
image: myname/php-app
volumes:
- /var/www
environment:
<SYMFONY_ENVIRONMENT>: dev
web:
image: myname/nginx
ports:
- 80
links:
- app
volumes_from:
- app
앱에는 포트 9000의 php-fpm과 내 애플리케이션 코드가 포함되어 있습니다. 웹은 몇 가지 구성이 포함된 nginx입니다.
이것은 내가 기대하는 방식으로 작동하지만 nginx를 php-fpm에 연결하기 위해 다음 줄이 있습니다.
fastcgi_pass app:9000;
어떻게 효과적으로 확장할 수 있나요? 예를 들어 하나의 nginx 컨테이너를 실행하고 3개의 앱 컨테이너를 실행하려면 포트 9000에서 수신 대기를 시도하는 3개의 php-fpm 인스턴스가 있어야 합니다.
각 php-fpm 인스턴스를 다른 포트에 두고 동시에 해당 인스턴스가 내 nginx 구성의 어디에 있는지 어떻게 알 수 있습니까?
내가 잘못된 접근 방식을 취하고 있습니까?
감사해요!
답변1
한 가지 해결책은 docker-compose 파일에 추가 php-fpm 인스턴스를 추가한 다음 다른 답변에서 언급한 대로 nginx 업스트림을 사용하여 이들 사이의 로드 밸런싱을 수행하는 것입니다. 이 작업은 docker-compose 저장소 예시에서 수행됩니다.https://github.com/iamyojimbo/docker-nginx-php-fpm/blob/master/nginx/nginx.conf#L137
upstream php {
#If there's no directive here, then use round_robin.
#least_conn;
server dockernginxphpfpm_php1_1:9000;
server dockernginxphpfpm_php2_1:9000;
server dockernginxphpfpm_php3_1:9000;
}
확장하거나 축소하려면 nginx 구성 및 docker-compose.yml을 변경해야 하기 때문에 이는 실제로 이상적이지 않습니다.
9000 포트는 실제 호스트가 아닌 컨테이너 내부에 있으므로 포트 9000에 여러 개의 php-fpm 컨테이너가 있는지는 중요하지 않습니다.
Docker는 올 가을 Tutum을 인수했습니다. HAProxy 컨테이너와 API를 결합하여 로드 밸런싱 중인 실행 중인 컨테이너에 맞게 로드 밸런서 구성을 자동으로 조정하는 솔루션이 있습니다. 그것은 좋은 해결책입니다. 그런 다음 nginx는 로드 밸런서에 할당된 호스트 이름을 가리킵니다. 아마도 Docker는 Tutum 인수 이후 이러한 유형의 솔루션을 도구에 추가로 통합할 것입니다. 여기에 관한 기사가 있습니다.https://web.archive.org/web/20160628133445/https://support.tutum.co/support/solutions/articles/5000050235-load-balancing-a-web-service
투툼은 현재 유료 서비스입니다. Rancher는 유사한 로드 밸런싱 기능을 제공하는 오픈 소스 프로젝트입니다. 또한 docker-compose.yml에서 서비스 설정의 로드 밸런싱 및 확장을 정의할 수 있는 "rancher-compose.yml"도 있습니다. http://rancher.com/the-magical-moment-when-container-load-balancing-meets-service-discovery/ http://docs.rancher.com/rancher/concepts/#load-balancer
업데이트 2017/03/06: 저는 다음과 같은 프로젝트를 사용했습니다.연동Docker와 함께 작동하여 nginx 구성을 자동으로 업데이트하고 다시 시작합니다. @iwaseatenbyagrue의 내용도 참조하세요.답변추가 접근 방식이 있습니다.
답변2
이 게시물은 2015년의 게시물이고 제가 괴로워하고 있다고 느껴지지만(미안해요 커뮤니티) 이 시점에 추가하는 것이 가치 있다고 생각합니다.
요즘(그리고 Kubernetes가 언급된 이후) Docker로 작업할 때 Kubernetes 또는 Docker Swarm을 사용하여 이 문제를 매우 쉽게 해결할 수 있습니다. 두 오케스트레이터 모두 Docker 노드(노드 1개 = Docker가 있는 서버 1개)를 수용하고 서비스를 배포할 수 있으며 오버레이 네트워크를 사용하여 포트 문제를 관리합니다.
저는 Docker Swarm에 대해 더 잘 알고 있으므로 이 문제에 접근하는 방법은 다음과 같습니다(단일 Docker 노드가 있다고 가정).
떼를 초기화합니다.
docker swarm init
프로젝트 루트에 CD를 넣으십시오.
cd some/project/root
docker-compose.yml에서 스웜 스택을 생성합니다(docker-compose를 사용하는 대신).
docker stack deploy -c docker-compose.yml myApp
그러면 "myApp"이라는 docker swarm 서비스 스택이 생성되고 포트가 관리됩니다. 즉, docker-compose 파일의 php-fpm 서비스에 하나의 "port: 9000:9000" 정의만 추가하면 php-fpm 서비스를 3개 인스턴스로 확장할 수 있습니다. 추가 작업 없이 자동으로 세 인스턴스 간의 요청 로드 밸런싱을 수행합니다.
답변3
여기에 설명된 대로 업스트림을 사용하여 여러 백엔드를 정의할 수 있습니다.
https://stackoverflow.com/questions/5467921/how-to-use-fastcgi-next-upstream-in-nginx
또한 다음과 같이 새로운 백엔드가 종료되거나 서비스가 시작될 때마다 구성을 업데이트하고 싶을 수도 있습니다.
답변4
또 다른 접근 방식은 다음과 같은 것을 조사하는 것입니다.영사 템플릿.
그리고 물론 어느 순간에는쿠버네티스언급해야 할 수도 있습니다.
그러나 도커 이벤트를 사용하여 수행할 수 있는 작업을 살펴봄으로써 좀 더 '끈과 덕트 테이프' 접근 방식을 고려할 수 있습니다( docker events --since 0
빠른 샘플을 위해 실행).
스크립트에서 이러한 이벤트를 살펴보고(Python, Go 등을 포함하여 여러 클라이언트 패키지를 사용할 수 있다는 점을 염두에 두고) 구성 파일을 수정하고 nginx를 다시 로드하는(예: consul-template 접근 방식 사용, 그러나 영사는 필요하지 않습니다).
하지만 원래 전제로 돌아가려면: php-fpm 컨테이너가 자체 네트워크로 시작되는 한(즉, nginx와 같은 다른 컨테이너의 네트워크를 공유하지 않는 한) 포트에서 수신 대기하는 컨테이너 수만큼 가질 수 있습니다. 원하는 대로 9000 - 컨테이너별 IP가 있으므로 포트 '충돌'에는 문제가 없습니다.
이를 확장하는 방법은 궁극적인 목표/사용 사례가 무엇인지에 따라 달라질 수 있지만 고려할 수 있는 한 가지는 nginx와 php-fpm 노드 사이에 HAproxy를 배치하는 것입니다. 이를 통해 수행할 수 있는 한 가지 작업은 단순히 php-fpm 서버(예: 172.18.0.0/24)에 대한 범위를 지정하고(가능한 경우 생성 docker network
) 해당 범위 내의 모든 IP를 백엔드로 사용하도록 HAproxy를 구성하는 것입니다. . HAproxy에는 상태 확인 기능이 있으므로 어떤 주소가 활성화되어 있는지 빠르게 식별하고 사용할 수 있습니다.
보다https://stackoverflow.com/questions/1358198/nginx-removing-upstream-servers-from-poolnginx와 haproxy가 업스트림을 처리하는 방법에 대한 토론입니다.
이를 위해 전용 도커 네트워크를 사용하지 않는 한,~할 것 같다php-fpm 노드에 대해 수동으로 IP 관리를 수행해야 합니다.