[Devops] Docker

황인용·2020년 9월 1일
0

Devops

목록 보기
4/7
post-thumbnail

Docker(도커)란

  • 컨테이너 기반의 오픈소스 가상화 플랫폼
  • 즉, 어플리케이션을 패키징, 배포, 실행 하기 위한 플랫폼

Docker의 주요 구조

Docker Image(이미지)|engine

  • 어플리케이션과 해당 환경을 패키지화한 것
  • 어플리케이션에서 사용할 수 있는 파일시스템과 이미지가 실행될 때 실행되야 하는 실행파일 경로와 같은 메타데이터가 포함됨
  • Server(서버)는 Docker engine 으로 불린다

Docker Registries(레지스트리)

  • 도커 이미지를 저장하고 다른 사람이나 컴퓨터 간에 해당 이미지를 쉽게 공유할 수 있는 저장소
  • 이미지를 빌드할 때 빌드하는 컴퓨터에서 이미지를 실행하거나 이미지를 레지스트리 푸시(push) 또는 업로드한 다음 다른 컴퓨터에서 이미지를 풀(pull)할 수 있다
  • 일부 공개 레지스트리는 누구나 이미지를 가져올수 있으나, 비공개 레지스트리는 특정 사용자나 컴퓨터만 액세스할 수 있다

Docker Containers(컨테이너)

  • 도커 기반 컨테이너 이미지에서 생성된 일반적인 리눅스 기반 컨테이너
  • 각 컨테이너는 격리되어 관리하고 각 프로세스가 실행되는 형태
  • 프로세스는 리소스 사용이 제한되어 있으므로, 할당된 리소스의 양(CPU, RAM등)만 엑세스하고 사용가능
  • MSA(Micro Service Architecture) 기반으로 도커를 설계 시, docker는 한 컨테이너 당 하나의 application이나 프로세스를 실행하는 것을 권한다

Docker Client-Server

  • 도커는 클라이언트와 서버 구조로 이루어져 있다
  • 클라이언트가 서버에 명령을 전달하고 서버는 이 명령을 실행한다
  • Docker binary 커맨드가 Docker 클라이언트이고, Dockerd가 docker daemon 혹은 dokcer enine이다.

Docker Image

  • 컨테이너 싱행에 필요한 파일과 설정값등을 포함하고 있는 것.
  • 상태값을 포함하지는 않는다.(Immutable)
  • 컨테이너는 이미지를 실행한 상태를 볼수 있거나 추가되거나 변경된 값은 컨테이너에 저장.
  • 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있음.
  • Base가 되는 image를 부모image라고하며, 맨 위의 이미지 부터 가장 밑 부분의 image까지 횡단 하는 구조로 되어있다.
  • filesystem / image를 수정하는 구조가 아니라 read-only filesystem / image 들을 서로 위에 layer 시키되 union mount 기법으로 마지막에는 하나의 파일 시스템으로 보이는 구조를 가지고 있다.
  • 이러한 패턴을 copy on write패턴이라고 함.
  • copy on write패턴구조는 Dockerfile 을 이용해 docker image 를 빌드할때 효과적.

Docker image layer

Boot Layer(boot filesystem bootfs)

  • 일반적인 Linux boot 파일시스템으로 이루어져 있음
  • 사용자가 직접 사용할 일은 없으며, 컨테이너가 부팅이 되면 메모리영역으로 옮겨져서 boot 파일시스템은 unmount된다

Root Layer(rootfs)

  • 실제 OS가 설치되는 Layer
  • root filesystem은 처음 mount될 때 read-only로 mount되고, integrity check후 read-write 모드로 변경된다
  • 하지만 Docker에서는 read-only모드

images

  • Boot Layer 그리고 Root Layer가 올라가고 image들이 올라간다
  • 어플리케이션 image들이 이에 해당한다.
  • 빌드 할때 처음부터 빌드하는 것이 아니라 최종적으로 올라간 image만 read-write모드로 mount한다.
  • 도중에 실패하더라도 마지막으로 성공한 instruction은 빌드된 상태임으로, image shell에서 debuging이 가능하다.

Container(컨테이너)란

  • 격리된 공간에서 프로세스를 동작하는 기술
  • 즉 프로세스들을 한정된 리소스 안에서 각각 격리 시키는 것
  • 가상화 기술이지만 가상머신과는 다른 방식
  • Docker container는 하나 혹은 그 이상의 프로세스를 실행 시킬수 있다 (하지만 하나의 프로세스만 실행시키는 것을 권장)
  • 리눅스 네임스페이스(namespace)으로 각 독립된 뷰로 시스템을 나누고,
    리눅스 컨트롤 그룹(Group)으로 프로세스가 사용할 수 있는 리소스(CPU, 메모리, 네트워크 대역폭 등)을 제한한다

리눅스 네임스페이스(namespace)

  • 리눅스 시스템이 초기 구동 시 하나의 네임스페이스가 존재
  • 각 네임스페이스를 생성하고 리소스를 구성한다

네임스페이스 종류

- 마운트(mnt)
- 프로세스ID(pid)
- 네트워크(net)
- 프로세스 간 통신(ipc)
- 호스트와 도메인 이름(uts)
- 사용자ID(user)

Container(컨테이너)와 VM(가상머신) 비교

  • VM(Vitrual Machine)기술은 한정된 호스트 OS위에 게스트 OS를 가상하여 여러개를 운영하는 방식
  • 호스트 OS위에 OS를 설치하든, CPU의 가상화 기술(Hypervisor Vitual Machine)을 사용하여 OS설치하든, 오버헤드(Overhead)의 리소스가 필요함
  • 하지만 컨테이너 방식으로 각각의 리소스를 나누고 프로세스를 격리화 시킴으로 VM보다는 가볍고 빠르게 동작을 함
  • VM에서 어플리케이션을 실행하고자 하면 게스트OS의 부팅이 필요한데, 컨테이너 방식은 실행 즉시 프로세스만 실행되는 형태
  • 따라서 컨테이너 방식이 오버헤드도 낮고 가볍고 빠르게 동작한다
  • 즉, 호스트OS위에 OS를 실행하느냐, 프로세스를 실행하느냐의 차이
profile
dev_pang의 pang.log

0개의 댓글