다른 컨테이너에서 nginx와 php를 도킹하면 어떤 이점이 있습니까?


18

방금 Docker 및 Kubernetes와 작업을 시작했으며 많은 사람들이 단일 이미지로 nginx + php를 빌드하고 일부는 nginx로 이미지를 빌드하고 php로 다른 이미지를 빌드합니다 (같은 경로를 마운트하고 둘러싸는 스택) Kubernetes에서 동일한 배포에있는 두 컨테이너).

동일한 nginx + php를 둘 다 설치하는 대신 두 개의 docker 이미지를 작성하면 어떤 이점이 있습니까?

답변:


19

nginx가 포함 된 PHP는 일반적으로 별도의 프로세스 인 php-fpm을 사용하여 수행됩니다.

컨테이너 당 하나의 프로세스 (이 지점에 대한 자세한 내용은 답변 끝 참조)의 도커에 대한 핵심 아이디어를 유지하면 별도의 컨테이너에 nginx 프로세스와 php-fpm 프로세스가있는 것이 좋습니다.

nginx와 php-fpm 간의 통신이 fastcgi를 통해 발생함에 따라 php-fpm 컨테이너는 분리 된 호스트에있을 수 있으며 이는 nginx 뒤의 php-fpm 컨테이너 클러스터를 사용할 수 있습니다.

여기에 약간의 배경 지식이있는 도커 문서에는 컨테이너에 하나의 관심사가 있어야 한다는 아이디어에 대한 단락 이 있습니다 .

리눅스 컨테이너 ( lxc ) 의 주요 아이디어는 CPU 및 메모리 수준에서 격리 된 네임 스페이스에서 프로세스를 실행하는 것이며, docker는 파일 시스템 수준에서 격리를 추가합니다.
이 네임 스페이스 내에서 프로세스를 승인하면 다른 프로세스의 메모리를 읽을 수 없으므로 호스트에서 다른 허용을 막을 수 있다는 장점이 있습니다.

nginx와 php-fpm에 대해 이야기하는 동안 쌍으로 작동하지만 각각 고유의 관심사를 가지고 있습니다 .nginx는 HTTP 부분, 라우팅, 헤더 유효성 검사 등을 수행하며 php-fpm은 코드 해석을 수행하고 html 부분을 nginx에 반환합니다 . 필수 사항이 아닌 단일 응용 프로그램을 함께 제공하는 것이 일반적입니다.

상황에 따라, 개발자를위한 개발자 워크 스테이션에서 애플리케이션의 전체 스택을 포함하는 컨테이너를 갖는 것이 더 쉬울 수 있습니다. 그러나 생산 용도로 이상적으로는 컨테이너 내부의 적은 상호 작용을 유지하려고 노력하십시오. 관리자와 동일한 컨테이너에서 프로세스를 분리하면 좀비 프로세스 및 로그 처리 측면에서 문제가 발생합니다 ( 예시적인 예시는 여기 에 있습니다).

마지막으로 도커 페이지를 약간 강조하여 인용하겠습니다.

"컨테이너 당 하나의 프로세스"는 일반적으로 좋은 규칙이지만, 어렵고 빠른 규칙은 아닙니다. 용기를 최대한 깨끗하고 모듈 식으로 유지하려면 최선의 판단을하십시오 .

모든 것에 적용되는 "실버 탄환 규칙"은 없으며 항상 컨테이너 내의 복잡성과 컨테이너 자체를 조정하는 복잡성 사이의 균형입니다.


3
핵심 아이디어는 실제로 "각 컨테이너는 하나의 관심사 만 가져야합니다"이며 "컨테이너 당 하나의 운영 체제 프로세스 만 있어야한다는 것은 아닙니다." docs.docker.com/engine/userguide/eng-image/…
user2640621

나는 그것이 아이디어를 깨는 지름길임을 인정한다. nginx는 단일 모 놀리 식 프로세스도 아니고 php-fpm도 아니다. 그러나 내 대답에 대한 관심으로 프로세스를 대체하고 여전히 괜찮다. nginx는 라우팅을 수행한다. php-fpm은 해석을한다
Tensibai

3
대답은 일반적으로 하나의 프로세스가 아니라 컨테이너 당 하나의 서비스입니다. 반면에 컨테이너에 여러 개의 실행중인 프로세스가있는 경우 일부 초기 프로세스, 서비스 관리, 다시 시작, 독립 로깅, 독립 패키지 종속성을 고려해야합니다. 조금 더 복잡해집니다. 때로는 스케일링 할 때 1 : 1 매핑이 1 : n 매핑으로 바뀝니다.
Jiri Klouda

@ Jiiri는 악마의 옹호자를 재생합니다. 그래서 postgres DB를 사용하는 레일 앱 앞의 아파치가 동일한 컨테이너 내에 있어야합니까? 그것은 결국 외부 관점에서 하나의 서비스 일뿐입니다.
Tensibai

1
@ JiriKlouda 답변이 수정되었습니다. 댓글로 제기 된 모든 요점을 전달하기에 충분히 상세하기를 바랍니다.
Tensibai

4

실제로 여기서 누락 된 점은 수평 확장 성입니다. 오래 전에 Jamie Alquiza의 기사 가이 문제를 해결했습니다.

http://archive.is/pDzz0

요컨대, 더 높은 성능을 달성하기 위해 php-fpm을 수평으로 확장합니다. Nginx + php-fpm을 함께 확장해도 아무런 이점이 없습니다. 이 기사에서 언급 한 내용을 확인하기 위해 스트레스 테스트 (예 : Tsung, Gatling 등; 아주 오래된 장난감 인 Apache ab를 수행하지 마십시오)를 수행하는 것이 좋습니다. 나는 개인적으로 그 기사가 일반적으로 사실임을 입증하는 몇 가지 실제 경험을 가지고 있습니다.

그러나 베어 메탈 머신 / VM에는 두 가지 단점이 있습니다 (Kubernetes에는 해당되지 않음).

  1. Nginx를 구성하여 PHP-fpm 컨테이너 변경 사항을 동적으로 검색하는 방법은 무엇입니까? 이것은 쉬운 부분입니다.
  2. 확장 후 동일한 볼륨 / 파일 시스템을 어떻게 공유합니까? Nginx 및 php-fpm 컨테이너는 일관성을 유지하기 위해 정확히 동일한 내용을 읽어야합니다. 이것은 당신에게 가장 적은 퍼즐 부분 (그리고 가장 재미있는 부분)을 남깁니다.

편집 : 이제 2019 년의 거의 절반이되었습니다. 같은 포드에있는 php-fpm + nginx의 이전 모델은 사용법이 다릅니다. 서비스 메시에 익숙한 경우 nginx (또는 Nginmesh)는 동서 경계 트래픽을 처리하는 사이드카 역할을합니다. 동서 경계 트래픽은 주로 서비스 또는 기타 고급 기능 중에서 인증하는 데 사용되었지만 순수한 php-fpm은 그렇게 할 수 없었습니다.


3

두 컨테이너를 관리해야하는 것보다 중요한 이점은 없습니다. 프로세스간에 1 : 1 관계가 있고 단일 목적으로 사용되는 한 동일한 컨테이너에 넣으십시오.


동일한 컨테이너에서 다른 이미지를 의미합니까?
CarlosAS

동일한 컨테이너에서 nginx와 php-fpm을 어떻게 시작합니까? 예를 추가하십시오.
030

1
@ 030 여기 예제
CarlosAS

2
@carlos 개발 목적으로 매우 유효한 사례로, 프로덕션 용으로 이런 종류의 작업을 차단할 것입니다 (컨테이너 내에서 관리자를 실행하면 매우 쉽게 권총을 넣을 수 있음)
Tensibai

나는 그 대답에 동의하지 않습니다.이 추론으로 mod 보안을 가진 아파치 서버는 단 하나의 응용 프로그램을 호스팅하는 postgresql 서버와 통신하는 바람둥이와 대화하고 단일 컨테이너 내에 맞아야합니다.
Tensibai

-1

장점은 백엔드에서 여러 개의 PHP-fpm 컨테이너를 실행할 수 있다는 것입니다. 포트 수를 통해 PHP 클러스터라고합니다. 포트 9000, 9001, 9002 등의 예

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.