Home Inception ① 배경 지식 : Docker
Post
Cancel

Inception ① 배경 지식 : Docker

Docker란?

docker-logo

  • 개념
    • 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트
      • 컨테이너
        • 경량의 독립적인 소프트웨어 실행 패키지를 일컫는 말. 어플리케이션을 구동하기 위해 필요한 요소들을 담고있다.
        • 호스트 OS와는 독립된 환경에서 동작한다.
  • 구조 Moby-logo-sm.png

    • vs Virtual Machine
      • VM이 각자의 완전한 OS를 갖는 반면 컨테이너는 host OS를 공유한다.
      • 컨테이너도 자신만의 OS가 존재한다.
        • 하지만 필요한 요소를 다 갖춘 OS는 아니다.(ex. Alpine Linux)
        • 도커 이미지에 있는 것들만 구동하기 위한 최소한의 OS

Docker compose

  • 개념
    • 멀티 컨테이너 도커 앱들을 정의하고 구동하는 도구
    • docker compose 로 사용
    • 다음의 순서로 진행된다.
      1. Dockfile 정의
      2. docker-compose.yml 작성
      3. docker compose up 수행
  • 종류
    • docker compose up
      • docker-compose.yml 파일에 정의된 컨테이너를 생성하고 구동시킨다.
        • docker run이 하나의 컨테이너를 생성하는데 사용되는 반면 다중 컨테이너에 주로 사용된다.
      • 컨테이너가 build되지 않았다면 먼저 build를 진행해준다.
        • 컨테이너 빌드 : Dockerfile로부터 Docker image를 생성하는 과정.
        • 컨테이너 생성 : 이미지의 새 인스턴스를 만드는 과정. 도커는 이미지를 새롭게 인스턴스화 해서 새 컨테이서에서 실행시킨다.
    • docker compose down
      • up으로 생성된 컨테이너를 중지하고 제거한다.
      • 컨테이너를 위해 만들어진 네트워크와 볼륨들도 함께 제거해준다.
    • docker compose stop
      • 현재 동작중인 컨테이너를 제거하지 않고 중단만 시킨다.
    • docker compose start
      • stop으로 중단된 컨테이너를 다시 시작시킨다.
    • docker compose restart
      • 현재 동작중인 컨테이너를 재시작한다.
      • stop 입력 후 start를 입력한 것과 동일

docker-compose와의 차이

  • 기존에 Python으로 진행되던 v1 버전의 레포지토리에서 사용하던 명령어가 docker-compose이다.
  • Go로 마이그레이션한 v2에서는 명령어가 docker compose로 변경되었다.
  • 현재 v1의 docker-compose는 deprecated 되었다.

Dockerfile

  • 개념
    • Docker image를 빌드하기 위한 설명서를 담은 스크립트
    • 베이스 이미지, 포함할 애플리케이션 코드, 의존성, 세부 설정 등을 담고있다.
    • 레이어 별로 나눠서 자주 쓰는 순서대로 작성한다.
  • 작성 순서
    • 기반 이미지(base image)를 선택한다. (FROM)
    • 이미지의 메타 데이터를 정의한다. (LABEL)
    • 의존성(dependency)을 설치한다. (RUN)
    • 어플리케이션 코드를 복사한다.(COPY)
    • 포트를 expose한다.(EXPOSE)
      • 컨테이너가 해당 포트를 listen한다는 것을 의미
    • 컨테이너의 entrypoint를 정의한다.(ENTRYPOINT)
      • entrypoint : 컨테이너가 이미지로부터 시작되자마자 처음 실행될 명령어
  • 예시

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    # Choose a base image
    FROM node:14-alpine
      
    # Define image metadata
    LABEL maintainer="yourname"
    LABEL version="1.0"
    LABEL description="My Node.js application"
      
    # Install dependencies
    RUN apk add --no-cache git
    WORKDIR /app
    COPY package*.json ./
    RUN npm install
      
    # Copy application code
    COPY . .
      
    # Expose port
    EXPOSE 3000
      
    # Define container entrypoint
    CMD ["npm", "start"]
    

Docker network

  • 개념
    • 컨테이너가 다른 컨테이너나 다른 네트워크 또는 호스트 시스템과 소통을 가능하게 해주는 가상 네트워크
  • 특징
    • 기본적으로 각 컨테이너는 브릿지 네트워크로 연결되어 있다.
    • 이를 통해 컨테이너 사이에 독립적이로 안전한 통신 채널을 만들 수 있다.
    • 복잡하고 초소형인 서비스의 아키텍처를 구성할 때 유용하다.
  • 종류
    • bridge
      • 호스트에 private 네트워크를 만든다.
      • 각 컨테이너들이 IP 주소를 사용해 서로 소통한다.
      • 컨테이너와 외부 네트워크의 연결은 간접적으로만 가능하다.
    • host
      • 컨테이너 자체적인 네트워크 스택을 갖는 것이 아닌, 호스트의 네트워크 스택을 이용한다.
        • 네트워크 스택 : 네트워킹을 가능하게 해주는 프로토콜, 소프트웨어, 유틸리티를 통틀어 부르는 말.
      • 컨테이너는 호스트의 어느 포트로든 바인드할 수 있다.
      • 호스트의 IP 주로를 사용해 컨테이너에 접속할 수도 있다.
    • overlay
    • macvlan
      • 컨테이너가 고유한 MAC 주소를 갖게 한다.
    • ipvlan
    • none
      • 네트워크 접근이 불가능한 컨테이너를 생성한다.
      • 네트워크로부터 고립된 컨테이너를 만들 때 유용하다.

Service

  • 개념
    • 동일한 작업을 수행하는 컨테이너 그룹을 일컫는 말
    • 여러 컨테이너의 배포와 관리를 조정(orchestrate)하는 것을 추상화한 것.

컨테이너 오케스트레이션 (Container Orchestration)

  • 개념
    • 컨테이너의 배포, 스케일링, 관리, 네트워킹을 자동화하는 과정
    • 대규모 컨테이너화된 어플리케이션을 의 관리와 배포를 단순화해준다.
      • 이를 통해 복잡성을 줄이고 확장성을 개선하며 가용성과 안정성을 높인다.
  • 관련 플랫폼
    • 도커 스웜(Docker Swarm)

      swarm-logo

      • 도커 컨테이너 토종(native)의 클러스터링 및 스케줄링 도구
      • 스웜(swarm, 도커 노드들의 묶음)을 만들고 관리할 수 있도록 해준다.
      • 설치와 사용이 간단하다.
    • 쿠버네티스(Kubernetes)

      kuber-logo

      • 구글에서 개발한 오픈 소스 툴이다.
      • 복잡하지만 강력하고 유연하다.
    • 차이점 (주로 Kubernetes가 추가적인 기능을 제공)

      • 아키텍처
        • Swarm : 도커 엔진으로 만들어짐.
        • Kubernetes : master 노드, worker 노드로 이루어진 더욱 복잡한 아키텍처를 가짐.
      • 클러스터 관리
        • Swarm : 소규모 어플리케이션을 구성하고 관리하는 것이 쉽다.
        • Kubernetes : 대규모의 복잡한 어플리케이션에 잘맞는다. 고급 기능을 제공한다.
      • 스케일링(scaling)
        • 둘 모두 서비스의 automatic 스케일링을 제공한다.
        • Kubernetes에만 있는 기능 : horizontal scaling, individual contatiners
      • 네트워킹
        • Kubernetes에만 있는 기능 : 멀티 네트워크 공급자, 고급 네트워크 정책
      • 스토리지
        • Kubernetes에만 있는 기능 : 멀티 스터리지 백엔드, 스토리지 리소스의 동적 프로비저닝
          • 프로비저닝(provisioning) : 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것
      • 서비스 디스커버리 (service discovery, 서비스를 구성하는 개별 인스턴스를 찾는 프로세스)
        • Kubernetes에만 있는 기능 : DNS-기반 서비스 디스커버리, DNS-기반 로드 밸런싱
      • 어플리케이션 배포
        • Kubernetes에만 있는 기능 : blue-green 배포, canary 배포

Bind mount vs Volume

도커에서 컨테이너의 수명을 넘어서까지 데이터를 유지하기 위해 사용하는 방법

Bind mount

Untitled

  • 개념
    • 호스트 머신의 파일 또는 디렉토리가 컨테이너에 마운트되는 방식
      • 마운트 : 저장 장치에 접근할 수 있는 경로를 디렉터리 구조에 편입시키는 작업
  • 특징
    • 데이터가 호스트 머신에 존재하며 런타임에 컨테이너에 마운트된다.
    • 컨테이너 내의 데이터가 변경되면 호스트 머신의 데이터 또한 변경된다.(반대도 마찬가지)
    • 컨테이너를 실행할 때 -v--mount 옵션을 통해 생성한다.

Volume

Untitled

  • 개념
    • 도커에 의해 생성되고 유지되는 파일 시스템.
  • 특징
    • 컨테이너 간에 데이터를 유지하기 위해 사용되며 호스트 머신의 파일시스템과는 독립되어있다.
    • 볼륨 내에서의 변경이 호스트 머신에 반영되지는 않는다. (반대도 마찬가지)
    • docker volume create을 통해 생성되며 -v 또는--mount 옵션을 사용하여 컨테이너에 마운트할 수 있다.
    • 주로 /var/lib/docker/volumes에 위치한다.
      • 이 위치는 Docker에 의해 관리되고 추상화된다.
      • 호스트 시스템이나 사용자의 직접적인 접근 불가
  • 장점
    • 볼륨을 컨테이너와 독립적으로 관리할 수 있다.
      • 컨테이너 간 데이터를 공유 가능
      • 데이터 백업 및 복원 가능
      • 컨테이너를 다른 호스트로 마이그레이션 가능
    • 대규모로 배포시에 성능과 확장성 면에서 우수하다.
      • 도커의 스토리지 드라이버로 관리할 수 있기 때문

Docker 실습

Image 생성

  • 컨테이너 이미지 생성 (-f : 사용할 도커파일, -t : 생성할 이미지파일명)

    1
    
    docker build -f Dockerfile -t <Image name> .
    
    • 순차적으로 명령이 실행되는 것을 확인할 수 있음.

      Untitled

  • 생성한 이미지를 확인

    1
    
    docker images
    

    Untitled

Container 실행

Untitled

  • 컨테이너 실행

    1
    
    docker run -d -p 8080:8080 <Image name>
    
  • 컨테이너 목록 확인

    1
    
    docker ps
    
  • 로컬에서 8080 포트로 접속.

    Untitled

    Untitled

    • 컨테이너의 로그 확인 가능 (터미널에 로그 출력)

      1
      
      docker logs <Container ID>
      
  • 컨테이너의 셸인 sh를 실행

    1
    
    docker exec -it <Container ID> sh
    
    • -i (interactive) : 컨테이너와 detach된 이후에도 상호작용할 수 있도록 STDIN을 계속 열어준다.
    • -t (pseudo-tty) : pseuto-TTY를 할당하여 터미널을 통해 컨테이너와 상호작용할 수 있게 해줌.
    • 컨테이너의 bash에서 다음 명령어 입력하여 패키지 검색(alpine 기준)

      1
      
      apk search <package name>
      

Container 삭제

  • 컨테이너 목록 확인 (stop 된 컨테이너도 확인가능)

    1
    
      docker ps -a
    
  • 컨테이너 중지

    1
    
      docker stop <Container ID>
    
  • 컨테이너 삭제

    1
    
      docker rm <Container ID>
    
  • 이미지 삭제

    1
    
      docker rmi <Image ID>
    

Ref.

This post is licensed under CC BY 4.0 by the author.

CPP Module 08 : STL

Inception ② 배경 지식 : 기타