[Docker] 도커 기본 개념

도커
허원일's avatar
Aug 05, 2024
[Docker] 도커 기본 개념
Docker는 ‘항만에서 일하는 부두 노동자’라는 뜻이며, 이 노동자(도커 호스트)는 부두의 컨테이너를 관리하게 된다.
  • 프로세스
    • 운영 체제에서 실행 중인 프로그램의 인스턴스
  • 커널
    • 운영 체제의 핵심 부분으로, 하드웨어와 소프트웨어 간의 통신을 관리하며, 시스템 자원과 다양한 컴퓨터 작업을 효율적으로 조정하고 제어함
  • 컨테이너
    • notion image
      VM 과 다른 방법을 사용해서 효율 성능이 더 나아진 게 컨테이너
      개발, 배송 및 배포(CI/CD를 의미)를 위해 소프트웨어를 표준화된 단위로 패키징
      ⇒ 애플리케이션이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행될 수 있도록 코드와 모든 종속성을 패키지화하는 소프트웨어의 표준 단위
    • 장점
      • 확장/축소가 쉽고 MSA, DevOps에 적합하다.
      • 컨테이너는 런타임 환경을 일관적으로 유지하며 설정에 따라 개발, 테스트, 프로덕션 모드를 손쉽게 선택하고 실행할 수 있다.
      • 환경 자체를 애플리케이션과 함께 컨테이너 이미지에 탑재하기 때문에 의존성 누락 등 환경적 요인으로 서비스나 애플리케이션이 다르게 작동할 위험을 크게 줄일 수 있다.
        • ⇒ 컨테이너는 이식성(portability)이 높아 개발자가 로컬 환경에서 온전성(sanity) 테스트를 수행 하기 쉽다.
      • 버그를 발견시 프로덕션과 동일한 버전의 코드를 간단히 배포할 수 있어 문제를 재현하기 쉽다.
      • 컨테이너는 가상 머신과 달리 운영 체제 수준에서 격리되며, 하나의 호스트 시스템에서 여러 컨테이너를 실행할 수 있어 자원을 효율적으로 사용
  • 기반 리눅스 기술
    • 리눅스의 핵심 격리 기술을 기반으로 하여, 하나의 리눅스 커널 위에서 여러개의 독립적인 사용자 공간 인스턴스를 실행할 수 있게 함
    • Cgroups(Control Groups)
      • 프로세스 그룹의 리소스 사용량(예: CPU 시간, 시스템 메모리, 네트워크 대역폭)을 모니터링하고 제한하는 기능을 제공함.
        ⇒ 각 컨테이너가 할당된 자원을 초과하여 사용하는 것을 방지함으로써, 시스템의 안정성을 유지하고 다른 컨테이너 또는 시스템 전체에 미치는 영향을 최소화함을 목적으로 함.
        이는 시스템 자원이 공정하게 분배되도록 보장하고, 한 애플리케이션이 전체 시스템을 점유하는 것을 방지함
    • Namespace
      • 프로세스에게 제한된 시스템 뷰를 제공하여, 프로세스가 자신의 네임스페이스 내에서만 시스템 리소스를 볼 수 있도록 함.
        ⇒ 파일 시스템 마운트, 네트워크, 사용자 ID, 호스트 이름 등을 각 컨테이너마다 독립적으로 할당하고 관리함
        컨테이너를 격리된 환경으로 만들어 주는 핵심 기술로, 컨테이너 내부에서 실행되는 프로세스가 호스트 시스템이나 다른 컨테이너의 리소스와 충돌하지 않도록 함. 이는 컨테이너 내부의 애플리케이션은 자신이 전체 시스템에서 유일하게 실행되고 있는 것처럼 동작할 수 있으며, 이는 보안과 격리를 강화함.

도커 이미지

💡
방(컨테이너) 구성을 위한 설계 도면
컨테이너를 실행하기 위한 불변의 템플릿임. 이 이미지는 코드, 런타임, 애플리케이션과 관련된 라이브러리, 환경 변수 및 설정 파일 등 애플리케이션 실행에 필요한 모든 것을 포함함. 도커 이미지는 여러 계층(layer)으로 구성되어 있으며, 각 계층은 변경 사항을 저장함. 이미지는 컨테이너를 생성하는 데 사용되며, 일반적으로 docker hub와 같은 레지스트리에서 가져오거나 Dockerfile을 사용해 직접 빌드할 수 있음.
  • 관련 파일
    • /var/lib/docker/overlay2

도커 이미지 최적화

  • 경량 베이스 이미지 사용하기
    • 가능한 가장 경량의 베이스 이미지를 사용한다. 예를 들어, alpine 이미지는 매우 작은 크기로 필요한 최소한의 기능만 포함
  • 멀티 스테이지 빌드 사용하기
    • Dockerfile에서 멀티 스테이지 빌드를 사용하여 빌드 단계에만 필요한 도구를 최종 이미지에서 제외시킨다. 이 방식을 사용하면 최종 이미지에는 애플리케이션 실행에 필요한 파일과 디펜던시만 포함된다. 멀티 스테이지 빌드는 여러 개의 FROM 명령어를 사용하여 구현되며, 각 스테이지는 독립적인 베이스 이미지를 가질 수 있다. 첫 번째 스테이지에서는 빌드에 필요한 도구와 소스 코드를 컴파일하는 데 필요한 작업을 수행한다. 이후 스테이지에서는 첫 번째 스테이지에서 생성된 아티팩트만을 가져와서 최종 이미지를 생성한다. 이렇게 하면 불필요한 빌드 도구나 중간 생성물을 최종 이미지에서 제외할 수 있어 이미지 크기가 상당히 줄어든다.
  • 필요없는 파일 제거하기
    • 빌드 과정에서 생성되는 임시 파일, 캐시 파일 등 필요 없는 파일은 RUN 명령어에서 && rm -rf /path/to/temporary/files와 같이 제거하여 이미지 크기를 줄인다
  • 레이어 수 최소화하기
    • RUNCOPYADD 명령어는 새로운 레이어를 생성한다. 이러한 명령어를 적절히 조합하여 가능한 한 적은 수의 레이어를 생성하도록 Dockerfile을 최적화한다.
  • COPY와 ADD 명령어를 신중하게 사용하기
    • COPY와 ADD는 필요한 파일만 이미지에 추가하도록 사용한다. .dockerignore 파일을 사용하여 불필요한 파일이 이미지에 포함되지 않도록 설정할 수 있다.
  • 환경 변수를 이용한 설정 가능한 설정 파일 대신 환경 변수를 사용하여 애플리케이션을 구성한다. 이 방법은 설정 변경이 필요할 때 이미지를 다시 빌드하지 않아도 되므로 이미지 크기를 줄이는 데 도움이 된다.
  • 적절한 태그 사용하기
    • 필요한 소프트웨어의 적절한 버전을 지정하여 불필요한 업데이트로 인한 크기 증가를 피한다.

도커 컨테이너

💡
설계 도면(이미지)로부터 설계된 방
도커 이미지의 실행 인스턴스임. 이미지를 기반으로 하여 실행되며, 격리된 환경에서 애플리케이션과 그 의존성을 캡슐화함. 컨테이너는 가벼우며 시스템 리소스를 효율적으로 사용한다는 장점이 있음. 컨테이너는 시작될 때 생성되고 종료될 때 제거됨. 개발자는 동일한 이미지를 사용하여 여러 컨테이너를 동시에 실행할 수 있으며, 각 컨테이너는 독립적으로 실행되고 관리됨.

도커 엔진

컨테이너를 생성하고 관리하는 기능을 제공하는 클라이언트-서버 형태의 애플리케이션이다.
  • 구성요소
    • CLI 클라이언트
      • 사용자가 커맨드 라인을 통해 도커 엔진과 상호작용할 수 있게 하는 인터페이스로, 이를 통해 컨테이너를 생성하고 관리할 수 있으며, 이미지를 빌드하고 도커 허브 같은 이미지 저장소와 상호작용할 수 있음.
    • REST API
      • 도커 데몬과 통신하는 인터페이스로, 이 API를 통해 다양한 도커 클라이언트가 도커 데몬과 상호작용할 수 있음. 이를 통해 애플리케이션의 배포, 관리, 확장을 위한 다양한 명령을 수행할 수 있음.
    • 도커 데몬
      • 컨테이너 관리를 위한 백그라운드 프로세스로 이미지 생성, 컨테이너 실행, 네트워크 설정 등의 작업을 수행하며, 컨테이너의 생성, 실행, 중지와 같은 생명 주기를 관리함. 또한, 이미지를 빌드하고 저장소에서 이미지를 가져오는 역할을 수행함. 도커 클라이언트를 통해 REST API를 사용하여 접근할 수 있음.
  • 동작방식
    • notion image
      컨테이너 생명주기: create / start / stop / rm(remove)
      1. 이미지 다운로드 또는 빌드
        1. 컨테이너를 실행하기 전에, 도커 엔진은 해당 애플리케이션을 실행하는 데 필요한 모든 파일과 설정이 포함된 도커 이미지가 필요하므로, 사용자는 도커 허브나 다른 이미지 저장소에서 이미지를 다운로드하거나, Dockerfile 을 정의하고 이를 통해 새로운 이미지를 빌드할 수 있음
      1. 컨테이너 생성
        1. 이미지가 준비되면, 사용자는 도커 데몬에게 컨테이너 생성을 요청함. 이때, 네트워크 설정이나 볼륨 마운트와 같은 추가적인 옵션을 지정할 수 있음. 도커 데몬은 이러한 정보를 바탕으로 새로운 컨테이너의 인스턴스를 생성함.
      1. 컨테이너 실행
        1. 컨테이너가 생성되면, 도커 데몬은 컨테이너 내부에서 정의된 애플리케이션을 실행함. 이 과정에서 컨테이너는 독립된 파일 시스템, 네트워크 인터페이스, 프로세스 ID 공간 등을 갖게 되며, 이는 컨테이너를 호스 트 시스템과 격리된 환경에서 실행되게 함.
      1. 컨테이너 관리
        1. 도커 엔진은 실행 중인 컨테이너의 상태를 모니터링하고 관리함. 사용자는 도커 CLI를 통해 실행 중인 컨테이너를 조회하고, 로그를 확인하며, 필요한 경우 컨테이너를 중지, 재시작 또는 삭제할 수 있음.
      1. 리소스 관리
        1. 도커 엔진은 Cgroups와 네임스페이스와 같은 리눅스의 핵심 기능을 사용하여 컨테이너의 리소스 사용량을 제한하고, 컨테이너 간의 격리를 유지함. 이를 통해 시스템의 안정성을 보장하고, 다른 컨테이너나 시스템전체에 부정적인 영향을 미치는 것을 방지함.

볼륨

Docker 컨테이너는 기본적으로 일시적인 환경에서 실행되므로, 컨테이너가 종료되거나 삭제되면 그 안에 있는 데이터도 사라지게 됨
⇒ 볼륨 메커니즘을 적용함으로써, 파일 수정은 호스트에서 진행하고, 실행환경은 컨테이너에서 알아서 관리하게 됨
notion image
notion image
[출처: 생활코딩]
notion image
[출처: 도커 공식 홈페이지]
컨테이너와 호스트 시스템 간의 데이터를 지속적으로 저장하고 공유하기 위한 메커니즘으로, 컨테이너 내의 데이터를 지속성 있게 보관하기 위해서 사용됨
  • 특징
    • 높은 이식성
      • 볼륨은 도커 엔진이 관리하며, 컨테이너의 생명주기와 독립적으로 존재함
    • 데이터 보안
      • 호스트 파일 시스템의 특정 디렉토리에 데이터를 저장하는 대신, 도커가 관리하는 디렉토리(Docker area)에 데이터를 저장함
    • 데이터 공유
      • 여러 컨테이너 간에 데이터를 공유하거나 데이터의 지속적인 저장이 필요한 경우에 적합함 (개발 환경)
Share article

원일이의 블로그