[Docker] Docker Container 실행 원리

Uk-Jake·2024년 10월 14일

Docker

목록 보기
4/11
post-thumbnail

Docker 컨테이너의 실행 원리: 내부 동작 과정 완벽 해부

1. Docker 컨테이너란 무엇인가?

컨테이너의 기본 개념

  • Docker 컨테이너는 애플리케이션을 격리된 환경에서 실행할 수 있도록 해주는 가상화 기술입니다.
  • 각 컨테이너는 독립된 파일 시스템을 사용하고, 필요한 라이브러리나 종속성을 포함해 일관된 환경을 제공합니다.
  • 이러한 컨테이너늘 사용하면 개발환경과 운영 환경의 차이로 인한 문제를 줄일 수 있고 애플리케이션을 손쉽게 배포할 수 있습니다.

컨테이너와 가상 머신의 차이

  • 가상 머신은 하이퍼바이저를 위에 각각의 운영체제(OS) 전체를 가상화하여 실행 속도가 느리고 무겁습니다.
  • 컨테이너는 호스트 시스템의 커널을 공유하고, 격리된 파일 시스템과 프로세스 공간만을 사용합니다.

비교 항목컨테이너가상 머신
가상화 방식OS 레벨 가상화 (커널 공유)하드웨어 가상화 (전체 OS 포함)
부팅 시간빠름 (몇 초)느림 (몇 분)
자원 사용량가벼움 (메모리, 디스크 효율적 사용)무거움 (독립적인 OS와 함께 실행)
격리 수준낮음 (커널 공유, 프로세스 공간 격리)높음 (완전한 OS 격리)

2. Docker 이미지에서 컨테이너가 생성되는 과정

docker run 명령어의 역할

Docker에서 컨테이너를 실행하려면 docker run 명령어를 사용합니다. 이 명령어는 특정 이미지를 기반으로 컨테이너를 생성하고 실행하는 명령어입니다. docker run은 먼저 지정된 이미지를 기반으로 컨테이너의 파일 시스템을 초기화하고, 이후 애플리케이션을 실행합니다.

읽기 전용 이미지와 쓰기 가능한 레이어의 결합

Docker 이미지는 여러 레이어로 구성된 읽기 전용 파일 시스템입니다. 이 이미지에 쓰기 가능한 레이어가 추가되면 컨테이너가 됩니다. 쓰기 레이어는 컨테이너가 실행되는 동안 발생하는 변경 사항을 기록하는데, 컨테이너가 삭제되면 해당 레이어도 함께 삭제되며, 기본 이미지에는 아무런 영향이 없습니다.


3. Namespace와 Cgroups: Docker 컨테이너의 핵심 격리 메커니즘

Namespace란 무엇인가?

  • Namespace는 리눅스 커널에서 제공하는 기능으로, 프로세스나 네트워크, 파일 시스템 같은 자원들을 격리하는 역할을 합니다.
  • Docker는 Namespace를 통해 각 컨테이너가 마치 독립된 시스템처럼 보이게 만듭니다.
  • 예를 들어, 네트워크 네임스페이스를 사용하면 각 컨테이너는 별도의 네트워크 인터페이스를 갖고, 파일 시스템 네임스페이스를 통해 컨테이너가 자신만의 파일 시스템을 가질 수 있습니다.

Namespace 종류

  • PID 네임스페이스: 프로세스를 격리하여 다른 컨테이너나 호스트의 프로세스를 보지 못하게 함.
  • NET 네임스페이스: 네트워크 인터페이스 및 라우팅을 격리.
  • MNT 네임스페이스: 파일 시스템을 격리하여 각 컨테이너가 독립된 파일 시스템을 사용하게 함.

Cgroups란 무엇인가?

  • Cgroups(Control Groups)는 리눅스에서 자원(CPU, 메모리, 디스크 I/O, 네트워크 대역폭)을 관리하고 제한하는 기능입니다.
  • Docker는 Cgroups를 통해 각 컨테이너가 사용할 수 있는 자원을 제한하고, 과도한 자원 사용으로 인해 호스트 시스템이 영향을 받지 않도록 합니다.
  • Cgroups을 통해 컨테이너가 시스템의 자원을 독점하지 않도록 합니다.

4. Docker 컨테이너 실행 단계

1. 컨테이너 파일 시스템 초기화

  1. Docker 컨테이너가 시작되면 먼저 Docker 이미지를 기반으로 읽기 전용 파일 시스템이 로드됩니다.
  2. 해당 파일 시스템 위에 쓰기 가능한 레이어가 추가

2. Namespace와 Cgroups를 통한 자원 격리 설정

  • 컨테이너가 생성되면 Docker는 리눅스의 Namespace와 Cgroups를 설정하여 해당 컨테이너의 프로세스, 네트워크, 파일 시스템이 호스트나 다른 컨테이너와 격리

3. 컨테이너 내부에서 애플리케이션 실행

  • 이미지가 정의된 애플리케이션을 컨테이너 내부에서 실행
  • Namespace와 Cgroups를 통해 격리된 컨테이너는 다른 컨테이너나 호스트 시스템에 영향을 주지 않음.

5. 주요 내용 정리

  • 컨테이너는 애플리케이션을 격리된 환경에서 실행하는 가벼운 가상화 기술로, 빠른 속도와 적은 자원으로 일관된 실행 환경을 제공합니다.
  • Docker 이미지는 읽기 전용 파일 시스템으로 구성되며, 이를 기반으로 컨테이너가 생성될 때 쓰기 가능한 레이어가 추가됩니다.
  • Namespace는 컨테이너의 프로세스, 네트워크, 파일 시스템을 격리하여, 각 컨테이너가 독립된 환경처럼 동작하도록 합니다.
  • Cgroups는 각 컨테이너가 사용하는 CPU, 메모리, 네트워크 등의 자원을 제한하고 관리하여, 시스템 자원을 독점하지 않도록 합니다.
  • Docker는 컨테이너를 효율적이고 안전하게 격리된 상태에서 실행하며, 애플리케이션 배포와 관리를 단순화합니다.

0개의 댓글