[기초 공부] 가상화(Docker) 정리

woodyn·2021년 6월 13일
0

기초 공부

목록 보기
16/16

하드웨어 가상화(Hardware virtualization)

컴퓨터를 여러 운영 체제를 실행할 수 있는 하드웨어 플랫폼으로 가상화하는 기술

  • Host OS: 가상화를 제공할 운영 체제
  • Guest OS: 가상화되어 제공되는 운영 체제
  • System Virtual Machine: OS를 실행하기 위한 모든 기능을 제공하는 가상의 컴퓨터

전가상화(Full virtualization)

VM들을 관리하는 Hypervisor를 통한 가상화 방법

  • Hypervisor: VM을 생성하고 실행하는 호스트 에뮬레이터
  • 예시: Xen, KVM, Virtual Box, VMWare Player

반가상화(Paravirtualization)

Guest OS가 직접 호스트 하드웨어 자원을 사용하는 가상화 방법

  • Hypervisor를 거치지 않아 효율적으로 작동함
  • 구현을 위해 Guest OS 커널 일부를 수정해야 함
  • 예시: Oracle VM, vSphere

OS 수준 가상화(OS-level virtualization)

커널에서 다수의 독립된 사용자 공간 인스턴스를 제공하도록 만드는 패러다임

  • Host OS의 시스템 콜을 사용하므로 가장 효율적으로 작동함
  • 예시: Docker, LXC

Docker

소프트웨어 패키지를 컨테이너라는 개념으로 가상화하는 소프트웨어

  • 컨테이너: 서로 격리된 애플리케이션 실행 환경
    • 가벼움(lightweight): VM에 비해 시작 속도가 빠름
      • 필요한 상황에 빠르게 확장(scale up)할 수 있음
    • 높은 이식성(portability): 라이브러리나 설정 등 실행에 필요한 모든 것들을 담고 있음
      • 따라서, 환경이 달라질 수 있는 여러 대의 서버를 운영할 때 의존성 관리가 수월함
  • Docker Engine: 컨테이너를 호스팅하는 소프트웨어

Docker architecture

  • Docker client: 데몬에게 명령을 전달하기 위한 프로세스 (원격 시스템의 데몬을 사용할 수도 있음)
  • Docker daemon(dockerd): 컨테이너나 네트워크 등의 Docker object들을 실질적으로 관리하는 프로세스
  • Docker registry: 이미지를 보관하기 위한 저장소 (e.g. Docker Hub)

Image

컨테이너를 생성하는 명령을 작성해둔 템플릿

  • 다른 이미지를 기반으로 할 수 있음 (e.g. ubuntu)
  • Dockerfile 파일로 이미지를 생성할 수 있음
  • 이미지는 연속된 read-only Layer 구조로 구성됨
    • 수정 시 일부 Layer만 갱신함으로써 이미지 전송을 가볍게 만듦
    • 컨테이너 실행 시, 컨테이너를 위해 새로운 writable Layer를 생성함
    • DockerfileRUN, COPY, ADD 명령마다 Layer가 생성됨
  • .dockerignore: 이미지 빌드 시 취급되지 않을 파일들을 명시한 파일

Commands

  • docker build: 이미지 빌드
    • Build Context: 빌드가 이루어지는 작업 디렉토리 (Dockerfile이 있는 경로)
    • -f: 대상으로 할 Dockerfile의 경로 지정
    • -t: 이미지의 이름과 태그 설정 (name:tag 형식)
  • docker images: 이미지 목록 조회
  • docker pull: 레지스트리에서 이미지 다운로드
  • docker push: 이미지를 레지스트리로 업로드

Dockerfile instructions

# syntax=docker/dockerfile:1
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
  • FROM: Base Image 설정
    • 경량화된 Alpine 이미지를 사용하는 것이 권장됨
  • ARG: 이미지 빌드 시 받을 인자 변수 선언
  • RUN: 명령어를 실행하고, 그 결과를 담은 Layer 생성
  • ENTRIPOINT: 컨테이너 시작 시 실행할 명령 지정
    • 단 하나의 명령만 존재할 수 있음
    • 기본 인자를 작성하면, 컨테이너 시작 시 추가 인자로 대체할 수 없음
  • CMD: 컨테이너 시작 시 실행할 명령을 인자와 함께 지정
    • 단 하나의 명령만 존재할 수 있음
    • ENTRYPOINT와 달리, 컨테이너 시작 시 인자를 제공하면 미리 작성해둔 기본 인자를 대체할 수 있음
    • ENTRYPOINT와 함께 사용하면, 추가 인자 값으로써 사용됨
  • EXPOSE: 컨테이너가 listen할 port 명시
  • ENV: 컨테이너 내 환경 변수 설정
  • ADD: 로컬 혹은 원격 파일/디렉토리를 이미지의 파일 시스템에 추가
    • 압축 파일의 경우 압축을 해제하여 복사함
  • COPY: 로컬 파일/디렉토리를 이미지의 파일 시스템에 단순히 추가
    • ADD에 비해 단순한 작업을 위해 사용함
  • VOLUME: 컨테이너의 볼륨 마운트 지점 설정
  • USER: Dockerfile 명령 수행과 컨테이너 실행에 적용될 사용자 권한 지정
  • WORKDIR: Dockerfile 명령을 실행할 경로 지정 (RUN cd와 같음)

Container

이미지를 실행한 인스턴스

  • 호스트 머신과 다른 컨테이너와 격리되어 있음 (네트워크와 저장소 등)
  • 여러 네트워크나 저장소를 컨테이너에 적용(attach)할 수 있음
  • 각 컨테이너는 대상으로 하는 이미지 위에 자신만의 writable Layer를 가짐

Commands

  • docker run: 컨테이너 생성
    • -e: 환경 변수 설정
    • --expose: 허용할 포트 명시
    • --mount: 파일 시스템 마운트 적용
    • --name: 컨테이너 이름 설정
    • --net: 연결할 네트워크 설정
    • --restart: Restart policy 설정
    • --rm: 이미 존재하는 컨테이너 자동으로 제거
    • -u: 사용자 권한 지정 (<name|uid>[:<group|gid>] 형식)
    • --volume: 볼륨 바인드
  • docker stop: 컨테이너 중지
  • docker start: 컨테이너 시작
  • docker restart: 컨테이너 재시작
  • docker kill: 컨테이너 종료(SIGKILL)
  • docker rm: 컨테이너 제거
    • -f: 강제로 종료(SIGKILL) 후 제거
  • docker ps: 컨테이너 목록 조회
  • docker top: 컨테이너 내 프로세스 확인
  • docker logs: 컨테이너 로그 확인
    • -f: 실시간 출력(follow)
  • docker port: 컨테이너의 포트 목록 조회

Restart policy

컨테이너가 종료되거나 Docker가 재시작했을 때 컨테이너를 자동으로 다시 실행하는 기능

  • docker run 명령어의 --restart 플래그로 설정함
    • no: 재시작하지 않음 (기본)
    • on-failure: 에러 발생으로 인한 종료 시 재시작
    • always: 항상 재시작
    • unless-stopped: 수동적으로 중지하지 않은 이상 항상 재시작
  • docker update 명령어로 실행 중인 컨테이너의 Restart policy를 수정할 수 있음

Network

컨테이너의 네트워크 통신을 격리하기 위한 개념

  • 각 네트워크는 네트워크 드라이버를 통해 기능이 구현됨
    • bridge: 같은 브릿지 네트워크끼리만 통신할 수 있도록 하는 드라이버 (기본 값)
      • 기본 브릿지 네트워크(bridge)가 제공되나, 필요에 따라 새로 생성하는 것이 권장됨
    • host: Docker 호스트와의 네트워크 격리를 없애는 드라이버
    • overlay: 여러 개의 Docker 데몬과 연결하며, Swarm 서비스 간의 통신을 활성화하는 드라이버
    • macvlan: 컨테이너에 MAC 주소를 발급하여 네트워크에 물리 장비로 추가하는 드라이버
    • none: 모든 네트워크 통신을 비활성화하는 드라이버

Storage

컨테이너의 파일 저장소를 격리하기 위한 개념

  • 기본적으로 컨테이너의 파일은 writable Layer에 저장되며, 컨테이너 제거 시 사라짐
  • 여러 마운트 형식:
    • Volume(--volume): 호스트의 파일 시스템 내 Docker가 관리하는 특정 경로에 저장함
      • Linux에서는 /var/lib/docker/volumes/
      • 호스트의 다른 프로세스가 수정할 수 없음
      • Anonymous volume: 컨테이너에 처음 마운트되어 무작위 이름이 주어진 볼륨
      • Named volume: 사용자가 미리 생성해둔 볼륨 (권장됨)
    • Bind mount(--mount): 호스트의 파일 시스템 내 어디든 특정하여 마운트함
      • Named volume을 사용하는 편이 더 권장됨
    • tmpfs mount(--tmpfs): 호스트의 메모리에 저장함
      • 컨테이너가 종료되면 사라짐
      • 민감한 정보를 다룰 때 사용함
      • Linux에서만 사용할 수 있음

오케스트레이션(Orchestration)

컨테이너화된 애플리케이션들을 클라우드나 데이터센터에서 관리하고 배포, 확장하는 기술

  • Docker Swarm: 소규모 시스템에서 컨테이너들을 운영하기 위한 오케스트레이터
    • Docker Engine을 통해 클러스터를 관리함 (설정과 관리가 간단함)
    • 선언적인 설정을 기반으로 원하는 상태가 되도록 조정함
    • 무중단 배포 기능을 지원함
  • Kubernetes: 대규모 시스템에서 컨테이너들을 운영하기 위한 오케스트레이터
    • kubectl 도구를 통해 클러스터를 관리함 (설정과 관리가 복잡함)
    • 선언적인 설정을 기반으로 원하는 상태가 되도록 조정함
    • 무중단 배포 기능을 지원함
    • Auto-scaling: 자동적으로 수평적으로 확장하는 기능
    • Pod scheduling: 컨테이너 배포 시 특정 조건을 갖는 노드를 선택할 수 있는 기능
profile
🦈

0개의 댓글