kimyu0218
  • [docker] docker 시작하기 (컨테이너/이미지/레이어)
    2023년 12월 28일 21시 55분 22초에 업로드 된 글입니다.
    작성자: @kimyu0218
    구글에 시스템 아키텍처만 검색해봐도 docker 로고를 쉽게 찾아볼 수 있다. 사람들은 어떤 이유로 docker를 선택했을까?

     

    docker란?

    도커는 컨테이너 기반 가상화 플랫폼으로, 어플리케이션을 패키징하고 배포하는 데 사용된다. 이렇게만 설명하면 도커가 무엇인지 아직 감이 안 올 것이다. 도커를 이해하기 위해 몇 가지 용어를 살펴보자.
     

    container

    도커 컨테이너는 어플리케이션을 실행하는 가상화된 환경을 의미한다. 즉, 어플리케이션의 실행에 필요한 모든 것들을 포함하고 (이미지) 격리된 환경에서 실행할 수 있도록 (이미지 실행 = 컨테이너) 도와주는 기술이다.
     
    가상머신도 로컬과 분리된 실행 환경을 제공하는데 왜 도커를 사용할까? 가상머신을 설치해본 사람은 알겠지만, 가상머신을 실행하기 위해서는 무거운 OS를 설치해야 한다. 그리고 OS 위에 OS가 실행되기 때문에 속도가 매우 느리다.

    *hypervisor : 여러 개의 운영체제를 하나의 호스트에서 실행하기 위해 필요한 소프트웨어


    도커는 이러한 가상머신의 단점을 보완한다. 도커 컨테이너는 호스트 운영체제의 커널을 공유하기 때문에 별도의 OS를 설치할 필요가 없다. 추가적인 OS를 설치하지 않아 가볍고, 하나의 OS를 사용하기 때문에 속도가 빠르다. (성능 손실이 거의 없다!)

    가상머신 vs. 컨테이너
    • 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널을 모두 포함하기 때문에 이미지의 크기가 매우 크다
    • 가상 머신은 각종 시스템 자원을 가상화하고 독립된 공간을 생성하기 위해 하이퍼바이저를 거쳐야 하므로 성능 손실이 발생한다.
    • 컨테이너는 호스트의 커널을 공유하기 때문에 컨테이너 안에는 어플리케이션 실행에 필요한 라이브러리 및 실행 파일만 들어있다. (이미지 크기 작음!)
    🤔 호스트 서버와 컨테이너는 어떻게 통신할까?
    • 도커는 다양한 네트워크 드라이버를 제공하여 호스트와 컨테이너 간의 통신을 가능하게 한다.
      • 브리지
        • 컨테이너의 내부 IP 주소는 브리지 네트워크의 서브넷 내에서 할당되고, 컨테이너는 동일한 브리지 네트워크 내에서 서로 통신할 수 있다.
        • 호스트는 브리지 네트워크의 IP 주소를 통해 컨테이너와 통신한다.
        • 기본적으로 `docker0` 브리지를 사용한다.
      • 호스트 : 호스트의 네트워크 환경을 그대로 사용할 수 있어 별도의 포트 포워딩이 필요없다. (보안은 별로...)
      • 컨테이너 : 다른 컨테이너의 네트워크 네임스페이스 환경을 공유한다. (내부 IP, MAC 주소 등)

     

    image

    이미지는 컨테이너를 생성할 때 필요한 요소로, 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념이다.

    도커 컨테이너는 어플리케이션에 필요한 패키지를 담고 있다. 이러한 패키지를 도커 이미지라고 한다. 즉, 이미지는 어플리케이션 실행에 필요한 최소한의 환경을 포함하는 파일이다.
     
    도커 이미지는 여러 개의 계층으로 구성된 바이너리 파일이다. 이미지는 컨테이너를 생성/실행할 때 읽기 전용으로 사용된다.

    🐋 도커 이미지 이름 : `(저장소)/(이미지):(태그)`
    • 저장소 : 이미지가 저장된 장소로, 저장소를 명시하지 않는 경우 도커 허브의 공식 이미지를 의미한다.
    • 이미지 : 해당 이미지가 어떤 역할을 하는지 나타낸다.
    • 태그 : 이미지의 버전관리에 사용되며 생략하는 경우 `latest`로 인식한다.
    🤔 그렇다면 컨테이너 정보는 어디에 저장될까?
    • 이미지는 읽기 전용이므로 컨테이너 변경 사항을 별도로 저장한다. (컨테이너 레이어)
    • 하지만 컨테이너 삭제 시 모든 정보가 삭제되므로 볼륨을 많이 활용한다.

     

    이미지의 각 계층은 파일 변경 내용을 나타내기 때문에 이미지 간의 공유와 재사용이 가능하다. 즉, 계층화는 이미지를 더 효율적으로 관리하고 배포할 수 있도록 하는 핵심 개념이다. 

    계층 (layer)
    • 도커 이미지의 구성요소로, 파일 및 디렉토리 변경 내역을 표현한다.
    • 각 계층은 읽기 전용이며 불변하다.
    • 도커 이미지 빌드 중에 사용되는 명령이 캐시되기 때문에 이전에 빌드한 이미지의 계층을 재사용할 수 있다.
    • 도커 이미지가 생성된 후에 변하지 않으므로, 파일이 변경되면 새로운 이미지를 생성한다.
    계층화의 장점
    • 빠른 이미지 빌드 : 이전 빌드에서 변경되지 않은 계층을 재사용하므로 이미지를 빠르게 빌드할 수 있다.
    • 디스크 공간 최적화 : 변경된 계층만 디스크에 저장하기 때문에 중복 데이터의 저장을 최소화할 수 있다.

     

    다시 docker란?

    도커는 어플리케이션을 컨테이너로 패키징하고 배포하는 플랫폼이다. 컨테이너가 어플리케이션의 실행에 필요한 모든 소프트웨어 및 라이브러리를 내장하고 있기 때문에 어디에서든 동일한 컨테이너 이미지를 사용하여 어플리케이션을 실행할 수 있다.

    도커의 장점
    • 독립된 개발 환경 보장 : 컨테이너라는 독립된 공간을 사용하기 때문에 내부에서 일어나는 일이 호스트 서버에 영향을 미치지 않는다.
    • 배포의 편의성 : 어플리케이션을 배포하기 위해 도커 이미지를 생성하고, 운영 서버에서는 해당 이미지를 내려받아 사용하면 된다. 즉, 컨테이너에서 사용되는 패키지를 운영 서버에서 새롭게 설치할 필요가 없다.

    참고자료

    댓글