2014-07-11 3 views
42

동일한 도커 이미지를 기반으로 많은 수의 고정 컨테이너를 시작한다고 가정합니다. 이는 각 도커 컨테이너가 동일한 응용 프로그램을 실행 중임을 의미합니다. 응용 프로그램이 충분히 크고 많은 하드 드라이브 메모리가 필요한 경우 일 수 있습니다.도커 컨테이너 및 메모리 사용량

도커는 어떻게 처리하나요?

도커 이미지에 정의 된 정적 부분을 공유하는 모든 도커 컨테이너가 있습니까?

도커 컨테이너를 실행하고 각 도커 컨테이너에이 app 디렉토리를 마운트하는 데 사용되는 시스템의 일부 디렉토리에 애플리케이션을 복사하는 것이 합리적이지 않습니까?

답변

74

Docker는 커널 수준에서 리소스를 공유합니다. 즉, 응용 프로그램 논리는 실행될 때 복제되지 않습니다. 1000 번 메모장을 시작하면 하드 디스크에 한 번만 저장되지만 도커 인스턴스에 대해서도 같은 수입니다.

동일한 도커 이미지 100 개의 인스턴스를 실행하는 경우 실제로는 100 개의 서로 다른 분리 된 타임 라인에서 동일한 소프트웨어 조각의 상태를 RAM에 유지해야합니다. 호스트 프로세서는 컨테이너 인스턴스를 제어하는 ​​소프트웨어에 대해 각 컨테이너 인스턴스의 메모리 내 상태를 이동하므로 응용 프로그램 실행에 필요한 RAM 메모리의 100 배를 소비합니다. 응용 프로그램의이 부분은 항상 정적이며 변경되지 않으므로 소프트웨어에 대해 정확히 동일한 바이트 코드를 물리적으로 100 번 저장하는 것은 의미가 없습니다. (소프트웨어를 수정하거나 컨테이너의 이미지를 재구성하고 재배포하기로 결정한 경우를 제외하고)

컨테이너가 상자 밖으로 지속성을 유지하지 못하게하고 도커가 일반 VM과 다른 점은 이러한 이유 때문입니다. 가상 하드 디스크를 사용하십시오. 그러나 이는 컨테이너 내부의 지속성에만 해당됩니다. 하드 디스크의 도커 소프트웨어에 의해 변경되는 파일은 도커 볼륨을 사용하여 컨테이너에 "마운트"되므로 실제로 도커 환경의 일부는 아니지만 실제로는 도커 환경에 포함됩니다. (https://docs.docker.com/userguide/dockervolumes/)

이 문제에 대해 생각할 때 묻는 또 다른 질문은 런타임시 변경 사항을 도커가 디스크에 저장하는 방법입니다. 체크 아웃하는 것이 정말 맛있는 것은, 도커가 실제로이 작업을 수행하는 방법입니다. 컨테이너의 하드 디스크의 원래 상태는 이미지에서 주어진 것입니다. 수 있습니다 아니이 이미지를 작성합니다. 이미지에 쓰는 대신에, 도커 이미지의 내용과 비교하여 컨테이너의 내부 상태가 변경된 내용과 차이가 있습니다. Docker는 "Union Filesystem"이라는 기술을 사용하여 도커 이미지의 초기 상태 위에 diff 레이어를 만듭니다.

이 "diff"(아래 이미지에서 쓰기 가능한 컨테이너)는 메모리에 저장되며 컨테이너를 삭제하면 사라집니다. (이 명령을 사용하지 않으면 그러나, "고정 표시기 커밋":이 사용하지 않는 것이 좋습니다 새로운 고정 표시기 이미지의 상태는 dockerfile 표현되지 않고 쉽게 다시에서 재생되지 않을 수 있습니다.)

Union Filesystem