Documents

Docker 기본

도커

  • 애플리케이션의 실행에 필요한 환경을 하나의 이미지로 모아두고, 그 이미지를 사용하여 다양한 환경에서 애플리케이션 실행 환경을 구축 및 운용하기위한 오픈소스 플랫폼

  • 인프라 환경을 컨테이너로 관리

    애플리케이션의 이식성(portability)

    한 번 만들면 어디서든지 움직이는 소프트웨어의 특성을 portability 라고 한다. Docker 컨테이너의 바탕이 되는 Docker 이미지만 있으면 애플리케이션을 동일한 환경에서 가동시킬 수 있습니다.

도커의 기능

  • Docker 이미지를 만드는 기능(Build)

  • Docker 이미지를 공유하는 기능(Ship)

  • Docker 컨테이너를 작동시키는 기능(Run)

Build

  • 하나의 이미지에는 하나의 애플리케이션만 넣어 두고, 여러 개의 컨테이너를 조합하여 서비스를 구축하는 방법 권장

  • Docker 이미지는 애플리케이션의 실행에 필요한 파일들이 저장된 디렉토리

  • Docker 명령을 사용하면 이미지를 tar 파일로 출력 가능

  • Dockerfile로 이미지 생성 가능

  • CI/CD 관점에서 IaC 관리를 생각하면 Dockerfile을 사용하여 관리하는 것이 바람직하다고 할 수 있음

  • 이미지는 겹쳐서 사용 가능. 변경이 되는 부분을 이미지 레이어로 관리

Ship

  • Docker 레지스트리에 공유 가능

    Docker 이미지의 변조 방지 및 취약성 검사 기능

    Docker Container Trust는 Docker 이미지의 제공자를 검증할 수 있는 기능이다. 이미지의 제공자는 Docker 레지스트리에 이미지를 송신하기 전에 로컬 환경에서 비밀키를 사용하여 이미지에 서명을 한다. 그 후 그 이미지를 이용할 때 이미지 제공자의 공개키를 사용하여 실행하려고 하는 이미지를 확인한다.

Run

  • Docker는 Linux 상에서 컨테이너 단위로 서버 기능을 작동

  • 이미 움직이는 OS 상에서 프로세스를 실행시키는 것과 거의 똑같은 속도로 컨테이너 실행 가능

  • Docker는 하나의 Linux 커널을 여러 컨테이너에서 공유. Linux 커널 기능(namespace, cgroups) 기술 사용

Docker 컴포넌트

  • Docker Engine

    이미지를 생성하고 컨테이너를 가동시키기 위한 Docekr의 핵심 기능.

  • Docker Registry

    이미지 공개 및 공유

  • Docker Compose

    여러 개의 컨테이너 구성 정보를 코드로 정의하고, 명령을 실행함으로써 컨테이너들을 일원 관리하기 위한 툴

  • Docker Machine

    로컬 호스트용인 VirtualBox를 비롯하여 AWS EC2, Azure 와 같은 클라우드 환경에 Docker의 실행 환경을 자동으로 생성하기 위한 툴

  • Docker Swarm

    Docker 호스트를 클러스터화하기 위한 툴.

Docker 작동 구조

컨테이너를 구획화하는 장치, namespace

Linux의 오브젝트에 이름을 붙임으로써 6개의 독립된 환경 구축

  1. PID namespace

    PID와 프로세스를 격리시킴으로써 namespace가 다른 프로세스끼리는 서로 액세스 할 수 없음

    PID

    Linux에서 각 프로세스에 할당된 고유한 ID

  2. Network namespace

    • 네트워크 디바이스, IP 주소, 포트 번호, 라우팅 테이블, 필터링 테이블 등과 같은 네트워크 리소스를 격리시켜줌

    • 호스트 OS상에서 사용중인 포트가 있더라도 컨테이너 상에서 동일한 포트를 사용할 수 있음

  3. UID namespace

    • UID(사용자 ID), GID(그룹 ID)를 namespace별로 독립적으로 가질 수 있음

    • namespace 안과 host OS에서 서로 연결되어 서로 다른 UID/GID로 가짐

    • 예를 들어, namespace 안에 UID/GID가 0인 root 사용자를 host OD에서는 일반 사용자로 취급할 수 있음

  4. MOUNT namespace

    • 파일 시스템을 사용하기 위해서는 마운트가 필요

    • 마운트란 컴퓨터에 연결된 기기나 기억장치를 OS에 인식시켜 이용 가능한 상태로 만드는 것

    • namespace 안에 격이된 파일 시스템 트리를 만듦

  5. UTS namespace

    독자적으로 호스트명이나 도메인명을 가질 수 있음

  6. IPC namespace

    • 프로세스 간의 통신(IPC) 오브젝트를 독립적으로 가질 수 있도록 함

    • IPC란 System C 프로세스 간의 통신 오브젝트라고 하는 공유 메모리나 세마포어/메시지큐를 말함

릴리스 관리 장치, cgroups

  • Docker에서는 물리 머신 상의 자원을 여러 컨테이너가 공유. 이때 Linux 커널 기능인 'control groups(cgroups)' 기능을 사용하려 자원을 할당/관리

  • Linux에서는 프로그램을 프로세스로 실행

    • 프로세스는 하나 이상의 스레드 모음으로 동작

  • cgroups는 프로세스와 스레드를 그룹화하여, 그 그룹 안에 존재하는 프로세스와 스레드에 대해 관리

    Table 1. cgroups의 주요 서브 시스템
    항목 설명

    cpu

    CPU 사용량을 제한

    cpuacct

    CPU 사용량 통계 정보를 제공

    cpiset

    CPU나 메모리 배치를 제어

    memory

    메모리나 스왑 사용량을 제한

    devices

    디바이스에 대한 액세스 허가/거부

    freezer

    그룹에 속한 프로세스 정지/재개

    net_cls

    네트워크 제어 태그를 부가

    blkio

    블록 디바이스 입출력량 제어

네트워크 구성(가상 브리지/가상 NIC)

  • Linux는 Docker를 설치하면 서버에 물리 NIC가 docker0이라는 가상 브리지 네트워크로 연결됨

  • docker0은 docker를 실행시킨 후에 디폴트로 생성

  • Docker 컨테이너가 실행되면 컨테이너에 172.17.0.0/16이라는 서브넷 마스크를 가진 프라이빗 IP 주소가 eth0으로 자동으로 할당

  • 이 가상 NIC는 OSI 참조 모델의 레이어 2인 가상 네트워크 인터페이스로, 페어인 NIC와 터널링 통신을 함

  • Docker 컨테이너와 외부 네트워크가 통신을 할 때는 가상 브리지 docker0과 호스트 OS의 물리 NIC에서 패킬을 전송하는 장치가 필요

    • Docker는 NAPT 기능을 사용하여 연결

      NAPT(Network Address Port Translation
      • 하나의 IP 주소를 여러 컴퓨터가 공유하는 기술로, IP 주소와 포트 번호를 변환하는 기능

      • 프라이빗 IP 주소와 글로벌 IP 주소를 투과적으로 상호 변환하는 기술

      • TCP/IP의 포트 번호까지 동적으로 변환하기 때문에 하나의 글로벌 IP 주소로 여러 대의 머신이 동시에 연결 가능

      • Docker에서는 NAPT에 Linux의 iptables를 사용

NAT와 IP 마스커레이드의 차이

프라이빗 IP 주소와 글로벌 IP 주소를 변환하여 프라이빗 IP 주소가 할당된 컴퓨터에 대해 인터넷 액세스를 가능하게 할때 사용하는 기술

NAT(Network Address Translation)

private IP 주소가 할당된 client가 인터넷상에 있는 서버에 액세스할 때 NAT 라우터는 client의 private IP를 NAT가 갖고 있는 global IP로 변환하여 요청을 송신한다. 응답은 NAT 라우터가 송신처의 client의 private IP 주소로 변환하여 송신한다.

global IP와 private IP를 1:1로 변환하기 때문에 동시에 여러 client가 액세스할 수 없다.

NAPT(Network Address Port Translation

private IP화 함께 port도 같이 변환하는 기술이다. private IP를 global IP로 변환할 때 private IP별로 서로 다른 port로 변환한다.

Linux에서 NAPT를 구축하는 것을 IP 마스커레이드라고 부른다. mascarade는 가면무도회라는 뜻으로, 많은 가면을 쓴 IP 패킷이 포트번호의 가면을 붙혀 반환되는 모습을 나타낸 것이다.

Docker 이미지의 데이터 관리 장치

  • Docker는 Copy on Write 방식으로 컨테이너 이미지를 관리

    Copy on Write 방식

    데이터를 복사할 때 변경이 없다면 쓸데 없는 낭비이다. 그래서 복사를 요구받으면 바로 복사하지 않고 origin 만 참조시켜, 원본 혹ㅇ느 복사본에 수정이 가해진 시점에 새로운 영역을 확보하고 데이터를 복사한다.

  • Docker의 이미지를 관리하는 스토리지 디바이스

    1. AUFS

      • 다른 파일 시스템의 파일이나 디렉토리를 투과적으로 겹쳐서 하나의 파일 트리를 구성할 수 있게 하는 파일 시스템.

      • 현재 AUFS는 Linux 커널의 일부가 아님

    2. Btrfs

      • Linux용 Copy on Write 파일 시스템

      • Oracle에 의해 2007년에 발표

      • 과거의 상태로 돌아갈 수 있는 롤백 기능이나 어떤 시점에서의 상태를 저장할 수 있는 스냅샷 기능을 가짐

    3. Device Mapper

      • Linux 커널 2.6에 추가

      • Linux 블록 디바이스 드라이버와 그것을 지원하는 라이브러리들

      • 파일 시스템의 블록 I/O와 디바이스의 매핑 관계를 관리

      • thin-provisioning 기능과 snapshot 기능을 가진 것이 특징

    4. OverlayFS

      • UnionFS 중 하나

      • 파일 시스템에 다른 파일 시스템을 투과적으로 merging하는 장치

      • Linux 커널 3.18에 도입

      • 읽기(readout) 전용 파일 시스템에 읽어 들이기(readin)가 가능한 파일 시스템을 겹침으로써, 읽기 전용 파일 시스템상의 디렉토리나 파일에 대한 읽어들이기, 변경이 가능해짐

      • Docker에서는 overlay와 overlay2 2종류의 드라이버를 이용할 수 있음

      • Linux 커널 4.0 이상의 경우는 overlay2를 사용하는 것이 좋음

    5. ZFS

      • 썬마이크로시스템즈(현재 Oracle)가 개발한 새로운 파일 시스템

      • 볼륨 관리, 스냅샷, 체크섬 처리, 리플리케이션 등을 지원

      • ZFS on Linux에 대한 충분한 경험이 없는 경우 제품 환경에서 사용하는 것을 권장하지 않음

Docker 명령어

Docker는 클라이언트/서버 아키텍처를 채택하고 있음. 따라서 docker 명령은 서버로 보내져 처리

Docker

docker version
docker system info # 실행 환경 확인
docker system df # docker가 사용하고 있는 디스크 이용 상황
docker login
docker logout

Docker Image

docker pull <image:tag>
docker image ls
docker image pull [options] <image>[:tag]
docker image inspect <image>[:tag]
docker search [options] <keyword>
docker image rm
docker image prune

Docker Container

docker container run <image:tag> <command>
docker stop
docker start
docker container ps
docker container stats <container-name>
docker container ls
docker container stats
docker container start
docker container stop
docker container restart
docker container rm
docker container pause
# docker container attach <container>
# docker conainer exec [options] <container> <commands> [arguments]
docker container exec -it webserver /bin/bash

# 컨테이너의 프로세스 확인
docker container top <container>

docker container port <container>

docker container rename <old> <new>

# 컨테이너 파일 복사
docker container cp <container>:<path> <path>
docker container cp <path> <container>:<path>

docker container diff <container>

Docker Network

Docker는 기본값으로 bridge, host, none 세 개의 네트워크를 만든다.

docker network ls
docker network create
docker network connect [options] <network> <container>
docker network disconnect <network> <container>
docker network inspect [options] <network>
docker network rm [option] <network>
docker container run \
  --name webserver \ (1)
  -d (2)
  -p 80:80 \ (3)
  nginx (4)
1 컨테이너명
2 데몬으로 실행
3 포트
4 이미지명
  • 로컬 환경에 다운로드된 Docker 이미지를 로컬 캐시라고 한다

  • --link 옵션을 지정하면 컨테이너 안의 /etc/hosts/ 파일에 컨테이너명과 컨테이너에 할당된 IP 주소가 등록된다.

docker