program tip

Docker 컨테이너 및 메모리 소비

radiobox 2020. 12. 30. 08:01
반응형

Docker 컨테이너 및 메모리 소비


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

도커는 그것을 어떻게 처리합니까?

모든 Docker 컨테이너가 Docker 이미지에 정의 된 정적 부분을 공유합니까?

그렇지 않다면 Docker 컨테이너를 실행하고 각 Docker 컨테이너에 대해이 앱 디렉터리를 마운트하는 데 사용되는 머신의 일부 디렉터리에 애플리케이션을 복사하는 것이 합리적입니까?


Docker는 커널 수준에서 리소스를 공유합니다. 이는 애플리케이션 로직이 실행될 때 복제되지 않음을 의미합니다. 메모장을 1000 번 시작하면 여전히 하드 디스크에 한 번만 저장되며 Docker 인스턴스도 마찬가지입니다.

동일한 도커 이미지의 인스턴스 100 개를 실행하는 경우 실제로 수행 할 작업은 100 개의 서로 다른 타임 라인에서 동일한 소프트웨어 상태를 RAM에 유지하는 것입니다. 호스트 프로세서는이를 제어하는 ​​소프트웨어에 대해 이러한 각 컨테이너 인스턴스의 메모리 내 상태를 전환하므로 애플리케이션 실행에 필요한 RAM 메모리의 100 배를 소비합니다. 응용 프로그램의이 부분은 항상 정적이고 절대 변경되지 않기 때문에 소프트웨어에 대해 정확히 동일한 바이트 코드를 물리적으로 100 번 저장하는 것은 의미가 없습니다. (당신이 미친 자체 변경 소프트웨어를 작성하거나 컨테이너의 이미지를 다시 빌드하고 재배포하기로 선택하지 않는 한)

이것이 컨테이너가 기본적으로 지속성을 허용하지 않는 이유이며 Docker가 가상 하드 디스크를 사용하는 일반 VM과 다른 점입니다. 그러나 이것은 컨테이너 내부의 지속성에만 해당됩니다. 하드 디스크의 도커 소프트웨어에 의해 변경되는 파일은 도커 볼륨을 사용하여 컨테이너에 "마운트"되므로 실제로 도커 환경의 일부가 아니라 그냥 마운트됩니다. (자세한 내용은 https://docs.docker.com/userguide/dockervolumes/ )

이것에 대해 생각할 때 물어볼 수있는 또 다른 질문은 docker가 런타임에 디스크에 변경 한 내용을 어떻게 저장하는지입니다. 확인하기 정말 좋은 점은도 커가 실제로이 작업을 수행하는 방법입니다. 컨테이너 하드 디스크의 원래 상태는 이미지에서 제공되는 것입니다. 이 이미지에 쓸 없습니다 . 이미지에 쓰는 대신 Docker 이미지에있는 것과 비교하여 컨테이너 내부 상태에서 변경된 내용을 비교합니다. Docker는 Docker 이미지의 초기 상태 위에 diff 레이어를 만드는 " Union Filesystem " 이라는 기술을 사용합니다 .

이 "diff"( 아래 이미지에서 쓰기 가능한 컨테이너 로 참조 됨)는 메모리에 저장되고 컨테이너를 삭제하면 사라집니다. ( "docker commit"명령을 사용하지 않는 한 : 권장하지 않습니다. 새 docker 이미지의 상태는 dockerfile에 표시되지 않으며 재 구축에서 쉽게 다시 생성 할 수 없습니다.)

Union 파일 시스템

참조 URL : https://stackoverflow.com/questions/24702233/docker-container-and-memory-consumption

반응형