ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] 도커란 무엇인가?
    IT/Docker 2022. 10. 17. 14:54

    Docker의 발생 배경

      기존 시스템에서는 여러 애플리케이션을 구동하기 위해 다양한 패키지, 환경설정을 통일해야 했고, 이런 과정 속에서 패키지 끼리의 충돌이나 환경변수 충돌과 같은 문제가 많이 발생되어 시스템을 운영하기가 힘이 들었습니다.

     

      이러한 문제점을 해결하기 위해 애플리케이션별로 환경변수와 패키지를 분리해 가상화시켜 구동하는 VM(Virtual Machine) 나왔지만, VM은 Hypervisor를 이용해 Guest OS를 생성하기 때문에 환경 자체가 상당히 무거운 단점 존재했습니다.

     

      이러한 단점을 보완하기 위해 나온 것이 운영체제 단에서 가상화를 실행하는 container이며, container 기술을 편리하게 사용할 수 있도록 개발된 것이 Docker입니다.

     

    VM vs Container


    Docker란 무엇인가?

    • Linux 컨테이너를 기반으로 하여 특정한 서비스(어플리케이션)을 패키징하고 배포하는데 유용한 프로그램.
    • 즉, 어플리케이션을 패키징할 수 있는 도구
    • 다시 말해, 어플리케이션 실행에 필요한 모든 것들을 도커 컨테이너에 담아 어떠한 런타임 환경에서도 실행 가능하도록 만들어 주는 프로그램.

      • 구성 (Configuration) : 컴퓨터 시스템, 서버 및 소프트웨어를 원하는 상태로 일관되게 유지하기 위한 파일 또는 설정
      • 소스 코드 (Source code) : 어플리케이션의 소스 코드 등
      • 플랫폼 (Platform) : 소프트웨어 개발 플랫폼 (nodejs, php, python ...)
      • 패키지 관리자 (Pacakage manager) : 프로그램 또는 라이브러리 등의 설치, 업그레이드, 구성 제거 과정을 자동화하는 소프트웨어 도구 모음 (npm, pip ...)
      • 의존성 (Dependencies) : 실행하고자 하는 어플리케이션에 필요한 라이브러리 버전 등
      • 기타 소스 자료 : 어플리케이션 실행에 필요한 자료 (데이터, 이미지 파일 등)

     

    Container 구성요소


    Docker의 작동 과정

      Docker를 작동 후 "docker info"와 같은 명령어로 확인을 해보면 Client와 Server로 나뉘어 설치된 것을 확인할 수 있습니다.  각 요소의 역할은 아래와 같습니다.

     

    Server (Docker daemon)

    • Docker 이미지를 도커 컨테이너로 만들고 실행하게 해주는 데몬
    • Docker daemon과 통신하거나 Docker API 요청을 기다리고 이미지, 컨테이너, 네트워크, 볼륨 등을 관리하는 역할
    • REST API를 통해 Docker Client와 통신

    Client (Docker CLI)

    • Docker daemon과 통신 할 수 있는 명령 도구
    • 사용자가 Docker와 상호작용할 수 있는 가장 우선적인 방법
    • REST API를 통해 Docker daemon에 명령 송신

     

    Docker의 구성 요소

     

      아래는 실제 Docker client에서 명령어를 보내 Docker daemon을 거쳐 이미지를 컨테이너로 생성하는 과정을 나타냅니다. 만약 로컬 저장소에 이미지 목록이 없다면 Docker hub나 사설 registry로 부터 이미지를 다운로드 받아옵니다.

     

    Docker Architecture


    Docker 객체 (Objects)

    Images

      이미지는 Docker container를 생성하기 위한 read-only 템플릿

      즉, 이미지는 어플리케이션이 실행 가능한 상태를 담아놓은 스냅샷 개념과 비슷하며 컨테이너라는 인스턴스가 생성되기 전의 클래스와 유사합니다.

    이미지는 Registry에서 다운로드 받아와 사용할 수 있고, 기존 이미지를 커스터마이징하여 새로운 이미지를 생성할 수 있습니다.

     

    Dockerfile

      Container를 빌드하도록 도와주는 명령어들의 집합, Top-Down으로 해석됨.

      고유한 이미지를 빌드하려면 이미지를 만들고 실행하는데 필요한 단계를 정의한 Dockerfile이 필요합니다.

    Docker 이미지는 하나의 큰 바이너리 덩어리가 아니라 여러 개의 레이어로 구성되어 있습니다. 서로 다른 이미지가 여러 개의 레이어를 공유해 이미지의 저장과 전송에 효과적이며, Dockerfile 내의 각 command가 각 레이어를 구성하게 됩니다.

     

      아래의 예시를 참고바랍니다.

    # Registry에서 "node" image를 로드
    FROM node
    # 현재 디렉토리의 hello.js를 컨테이너(이미지)의 root 디렉토리로 복사
    COPY hello.js /
    # node hello.js 명령어 실행
    CMD ["node", "/hello.js"]

     

    Dockerfile에서 Container 생성까지의 과정

     

    Dockerfile 기본 명령어 (문법)

    FROM : 컨테이너의 BASE IMAGE (운영환경)
    LABEL : 컨테이너 이미지에 컨테이너의 정보를 저장
    RUN : 컨테이너 빌드를 위해 BASE IMAGE에서 실행할 명령어
    COPY : 컨테이너 빌드 시 호스트의 파일을 컨테이너로 복사
    ADD : 컨테이너 빌드 시 호스트의 파일(tar, url 포함)을 컨테이너로 복사
    ENTRYPOINT : 컨테이너 시작 시 명령어 실행 (CLI에 의해 변경 불가능한 인자를 가진 명령 수행 시 사용)
    CMD : 컨테이너 시작 시 명령어 실행 (CLI에 의해 변경 가능한 인자를 가진 명령 수행 시 사용)
    EXPOSE : Host와 연결할 포트 번호 설정
    WORKDIR : 컨테이너 빌드 시 명령이 실행될 작업 디렉토리 설정
    ENV :  환경변수 설정
    VOLUME : 파일 또는 디렉토리를 호스트의 디렉토리로 마운트
    USER : 명령을 실행할 사용자 계정 설정

     

    Containers

      실행 가능한 이미지의 인스턴스 즉, 컨테이너는 이미지를 읽어와 실행 중인 하나의 어플리케이션 프로세스.

      Docker API 또는 CLI로 생성, 시작, 정지, 이동, 삭제가 가능하며, 다른 컨테이너들과 통신이 가능하다.

    컨테이너는 이것을 생성하거나 시작할 때 사용자가 구성한 옵션들과 이미지에 의해 정의되며, 컨테이너 내부에서 실행되거나 변경된 사항을 별도로 저장하지 않으면 컨테이너 삭제 시 해당 정보는 영구히 삭제된다.

     

      기본적으로, 컨테이너는 다른 컨테이너 또는 호스트와 분리·고립되어 있음으로 하나의 컨테이너를 수정해서 배포하더라도 다른 컨테이너에 영향을 끼치지 않는다.

     

    Containers


     

Designed by Tistory.