Docker(도커)

    1. 사용 이유

    리눅스 기반의 컨테이너 기술

    개발 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며,

    코드를 문제없이 실행할 수 있음

     

     

    2. 작동 방식

    도커는 '컨테이너'를 사용해 코드를 실행하는 표준 방식을 제공함.

    컨테이너는 가상머신과 같이 서버 운영 체제를 가상화함.

    컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있음

     

     

    도커와 가상 머신 차이

    컨테이너 VM
    - Guest OS 위에 도커가 동작함
    도커는 컨테이너를 위한 운영체제임. 컨테이너에 Guest OS를 따로 설치하지 않음. 어플리케이션을 구동하는데 필요한 모든 패키지만 있으면 컨테이너를 구동시킬 수 있음
      - Host OS 위에 Guest OS 전체를 가상화함
    간단하지만 무겁고 느림. OS가 하나씩 추가될 때마다 OS를 위한 자원을 할당해주어야 함

     

     

    주요 개념

    • Image: 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶은 형태
      • 특정 프로세스를 실행하는데 필요한 모든 파일과 설정값을 가진 파일
      • Docker 이미지는 수백MB~수GB 정도임. 가상머신 이미지에 비하면 적은 용량임
      • 상태값을 가지지 않고 변하지 않음
      • 하나의 이미지로 여러 개의 컨테이너를 생성할 수 있고, 컨테이너가 삭제되어도 이미지는 변하지 않음
      • Docker는 Dockerfile이라는 파일로 이미지를 만듦. Dockerfile에는 소스와 함께 의존성 패키지 등 사용했던 설정 파일을 버전 관리하기 쉽도록 명세되어 있음
      • Docker hub에서 다운로드 가능함
    • Container: 이미지를 실행한 상태. 애플리케이션의 종속성과 함께 애플리케이션 자체를 패키징 or 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술
      • 이미지 layer에 읽기/쓰기 레이러를 추가하는 것으로 생성/실행됨
      • 컨테이너는 종료되어도 메모리에 남아있기 때문에 다시 시작할 수 있음. 삭제하려면 명시적으로 삭제해야함
        • 컨테이너를 삭제: 컨테이너에서 생성한 파일이 사라짐
          • ex) DB라면 그동안 쌓였던 데이터가 모두 사라진다는 뜻
      • 한 서버는 여러 개의 컨테이너를 가져도 상관없으며, 컨테이너는 각각 독립적으로 실행됨
      • 커널 공간과 Host OS자원(System call)을 공유함
    • Layer: 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드받는 방법이 아닌 해당 파일을 추가하기 위한 개념
      • 이미지는 여러 개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성됨
      • 컨테이너를 생성할 때 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가함. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용함

     

     

    3. Docker 사용예시

    ① Docker 설치

     

    ② .jar 파일이 있는 곳에 Dockerfile 생성

     

    • FROM: Docker Base Image
      • 기반 이미지
      • {이미지 이름}:{태그} 형식
    • ARG: 컨테이너 내에서 사용할 수 있는 변수
    • COPY: 파일 복사
      • JAR_FILE이라는 이름을 갖는 파일을 app.jar로 복사해라
    • ENTRYPOINT: 컨테이너를 구동할 때 실행할 명령어를 지정
      • java -jar /app.jar

     

    ③ Dockerfile을 이미지화

    • docker build -t {이미지명} .
      • -t: tag 의미 (name:tag)

    • docker images
      • 이미지 생성 완료 확인

    • docker push {이미지명}
      • docker hub에 이미지 올리기

     

    ④ 컨테이너 실행하기

    • docker run -p {host system 안의 포트}:{컨테이너 안의 포트} {이미지명}
      • -p {host system 안의 포트}:{컨테이너 안의 포트}: localhost의 포트를 컨테이너 안의 포트로 맵핑하는 과정

    실행 성공

     

    댓글