많은 블로그 게시물과 일반적인 의견에는 "컨테이너 당 하나의 프로세스"라는 말이 있습니다.
이 규칙이 존재하는 이유는 무엇입니까? 모든 프로세스가 작동해야하는 단일 컨테이너에서 ntp, nginx, uwsgi 및 기타 프로세스를 실행하지 않는 이유는 무엇입니까?
이 규칙을 언급하는 블로그 게시물 :
많은 블로그 게시물과 일반적인 의견에는 "컨테이너 당 하나의 프로세스"라는 말이 있습니다.
이 규칙이 존재하는 이유는 무엇입니까? 모든 프로세스가 작동해야하는 단일 컨테이너에서 ntp, nginx, uwsgi 및 기타 프로세스를 실행하지 않는 이유는 무엇입니까?
이 규칙을 언급하는 블로그 게시물 :
답변:
높은 수준의 건축 및 철학적 주장을 잠시 잊어 버리십시오. 단일 컨테이너의 여러 기능이 의미가있는 몇 가지 중요한 경우가있을 수 있지만 경험적으로 "컨테이너 당 하나의 기능"을 따르는 것이 매우 실용적인 이유가 있습니다.
프로세스가 아니라 기능을 말하는 것입니다. 그 언어는 구식입니다. 공식 도커 문서 는 컨테이너 당 "하나의 관심사"를 추천하는 대신 "하나의 프로세스"라는 말에서 멀어졌습니다 .
며칠 전에 "두 개의 프로세스"컨테이너를 죽인 후, 두 가지 프로세스를 시작한 파이썬 스크립트 대신 두 개의 컨테이너를 사용하게 된 몇 가지 어려움이 있습니다.
권장 사항은 운영 체제 수준 가상화 의 목표와 디자인에서 비롯됩니다.
컨테이너는 자체 사용자 공간 과 파일 시스템 을 제공하여 다른 프로세스를 분리하도록 설계되었습니다 .
이것은 논리적으로 진화 chroot
된 파일 시스템으로, 다음 단계는 메모리 덮어 쓰기를 피하고 충돌없이 여러 프로세스에서 동일한 리소스 (예 : TCP 포트 8080)를 사용할 수 있도록 프로세스를 다른 프로세스와 격리하는 것입니다.
컨테이너에 대한 주요 관심은 버전 충돌에 대해 걱정하지 않고 프로세스에 필요한 라이브러리를 패키지화하는 것입니다. 동일한 사용자 공간과 파일 시스템에서 동일한 라이브러리의 두 가지 버전이 필요한 다중 프로세스를 실행하는 경우 각 프로세스에 대해 최소한 LDPATH를 조정하여 적절한 라이브러리를 먼저 찾아야하며 일부 라이브러리는이 방법으로 조정할 수 없습니다. 컴파일 타임에 실행 파일에 경로가 하드 코딩되어 있기 때문에 자세한 내용 은 이 SO 질문 을 참조하십시오.
네트워크 수준에서는 동일한 포트를 사용하지 않도록 각 프로세스를 구성해야합니다.
동일한 컨테이너에서 여러 프로세스를 실행하려면 약간의 조정이 필요하며 하루가 끝나면 동일한 사용자 공간 내에서 여러 프로세스를 실행하고 동일한 파일 시스템 및 네트워크 리소스를 공유하는 것이 좋습니다. 호스트 자체에서?
내가 생각할 수있는 무거운 조정 / 함정에 대한 철저한 목록은 다음과 같습니다.
로그 처리
볼륨이 마운트되어 있거나 표준 출력에 인터리브되어 있으면 어느 정도 관리 할 수 있습니다. 탑재 된 볼륨을 사용하는 경우 컨테이너에 호스트에 자체 "장소"가 있어야하거나 동일한 컨테이너 두 개가 동일한 리소스를 놓고 싸울 것입니다. stdout에 인터리빙 할 때 docker logs
소스를 쉽게 식별 할 수 없다면 분석을 위해 악몽이 될 수 있습니다.
좀비 프로세스주의
컨테이너가 충돌하는 프로세스 중 하나 인 경우 감독자는 자식을 좀비 상태로 정리하지 못할 수 있으며 호스트 초기화는 절대로 자식을 상속하지 않습니다. 사용 가능한 pid 수 (2 ^ 22이므로 약 4 백만 개)를 다 사용하면 많은 문제가 발생합니다.
우려의 분리
동일한 컨테이너 내에서 Apache 서버 및 logstash와 같이 분리 된 두 가지를 실행하면 로그 처리가 쉬워 지지만 logstash를 업데이트하려면 Apache를 종료해야합니다. (실제로 Docker의 로깅 드라이버를 사용해야합니다) 현재 세션이 종료되기를 기다리는 것이 정상적입니까? 정상적으로 멈 추면 새 버전을 출시하는 데 시간이 오래 걸리고 시간이 오래 걸릴 수 있습니다. 강제 종료하면 로그 발송자에게 영향을 미치며 IMHO는 피해야합니다.
마지막으로 여러 프로세스가있는 경우 OS를 재생하는 것이며,이 경우 하드웨어 가상화를 사용하면 이러한 요구에 더 잘 맞습니다.
내가 서비스라고 부르는 프로세스, 1 container ~ 1 service . 내 서비스 중 하나라도 실패하면 해당 컨테이너를 스핀 업하고 몇 초 안에 모든 것이 다시 시작됩니다. 따라서 서비스 간에는 종속성이 없습니다. 컨테이너 크기를 200MB 이하 및 최대 500MB 이하로 유지하는 것이 가장 좋습니다 (Windows 기본 컨테이너는 2GB 이상). 그렇지 않으면 가상 머신과 비슷하지만 성능만으로는 충분하지 않습니다. 또한 확장, 서비스 탄력성, 자동 배포 등을 만드는 방법과 같은 몇 가지 매개 변수를 고려하십시오.
또한 환경에 가장 적합한 컨테이너 기술을 사용하여 폴리 고트 환경에서 마이크로 서비스와 같은 아키텍처 패턴을 만드는 방법을 순조롭게 요구합니다.