Dico

Docker가 뭐지?

  • 민갤

docker logo

고래는 서버에서 여러 개의 컨테이너(이미지)를 실행, 저장하고 배포하는 것을 의미한다.

이미지 출처: 구글

Docker 도커

구글 Go로 자체 개발한 Libcontainer를 사용하여 Hypervisor 없이 Application software를 독립된 환경에서 개발, 배포 및 실행하기 위한 플랫폼

리눅스 커널 위에 자원을 애플리케이션마다 독립된 가상공간에 할당한다.

  • OS 자원을 호스트 운영체제와 공유하여 최소한으로 필요한 리소스만 할당받아 동작한다.
  • 0.9버전 이전에는 리눅스 컨테이너(LXC)를 사용했다.
  • 실행 옵션에 따라 native(Libcontainer), lxc(LXC)를 선택해서 사용할 수 있다.

하드웨어를 가상화하지 않고 실행환경을 분리하므로 게스트OS가 필요없다.

가상환경에서 Dockerfile에 정의되어 있는 명령어들을 통해 필요한 프로그램들을 한 번에 설치하고 실행한다.


Container 컨테이너

이미지가 실행된 상태.

파일 시스템(Filesystem) 가상화.

가상환경에서 실행되고 종료되기 때문에 컨테이너 외부에 영향을 주지 않는다.

Image 이미지

컨테이너 실행에 필요한 모든 정보(코드, 런타임, 라이브러리. 환경 변수, 구성 파일)를 가지고 있다.

  • 용량이 크기 때문에 무료로 관리해주는 Docker hub 에 등록하거나 Docker Registry 를 직접 만들어서 관리할 수 있다.

이미지 하나로 컨테이너를 여러 개 생성할 수 있다.

  • 컨테이너를 변경하거나 삭제해도 이미지는 변하지 않는다.

읽기 전용 레이어(read-only Layer)들로 구성되어 있다.

  • Dockerfile에 정의되어 있는 명령어가 하나씩 실행될 때마다 레이어가 순차적으로 쌓인다.
  • 컨테이너 생성 시 이미지(최상위 레이어) 위에 쓰기 레이어(writable layer or container layer)가 추가된다.
  • 컨테이너가 추가, 변경하는 내용들은 쓰기 레이어에 기록된다.

Java로 비유한다면 image 는 class, contrainer 는 class 로 생성한 object 와 유사하다.

참고: Understanding Docker Images and Layers

참고: Best practices for writing Dockerfiles


Dockerfile

Docker 전용 포맷(DSL:Domain Specific Language)을 이용하여 이미지를 생성하는 데 필요한 모든 쉘 명령어를 순서대로 기록한 텍스트 파일

  • 의존성 패키지 설치, 설정파일 수정 등의 명령어

한 번의 명령어로 Dockerfile을 실행하여 자동으로 이미지를 생성할 수 있다.

참고: Dockerfile reference

Libcontainer 립컨테이너

리눅스 컨테이너(LXC)같은 사용자 공간 구성요소를 거치지 않고 바로 도커 컨테이너를 리눅스 요소에 접근하게 해주는 드라이버

OS에 대한 의존성을 낮춘다.

native 또는 실행 드라이버(exec driver) 표시된다.

Hypervisor 하이퍼바이저

= 가상 머신 모니터(virtual machine monitor) = 가상 머신 매니저(virtual machine manager) = VMM

호스트 컴퓨터 한 대에서 게스트 운영체제 여러 개를 동시에 실행하기 위한 플랫폼

  • Native, Bare-metal : 하드웨어에서 직접 실행된다. (ESX Server, Sen, SenServer, TRANGO 등)
  • Hosted : 호스트 운영체제에서 실행된다. (VMware Server, VirtualBox, QEMU 등)

게스트 OS를 이미지 안에 포함하기 때문에 이미지 용량이 크다.

OS 및 커널을 통째로 가상화한다.

docker VS Hypervisor

Infrastructure : 하드웨어, 네트워크, 운영체제, OS, 미들웨어 등 시스템 구조

이미지 출처: 엑셀로 직접 그림

Linux Containers 리눅스 컨테이너

프로세스를 격리하는 방식 중 하나

리눅스 호스트 한 대에서 리눅스 시스템을 격리된 상태로 여러 개 실행할 수 있는 리눅스 운영체제 시스템 수준의 가상화 기술

cgroups와 namespace를 이용한다.

  • cgroups(Control Groups) : 프로세스들의 자원 사용(메모리, CPU, I/O, 네트워크 디바이스 노드)을 제한하고 격리(가상공간)하는 리눅스 커널 기능
  • namespace(Namespace Isolation) : 각 게스트 머신별로 독립적인 공간을 제공하고 서로 충돌하지 않도록 한다.

Application Software 응용 소프트웨어 = 애플리케이션 소프트웨어

초기에 마이크로소프트에서 ‘(응용) 프로그램’ 단어를 사용.

아이폰이 대중화되면서 ‘애플리케이션’ 단어를 사용.

모바일에서 사용하는 비중이 높아 '애플리케이션 = 스마트폰용 소프트웨어', '프로그램 = PC용 소프트웨어'로 인식하는 경우가 많다.

참고: Docker Docs

참고: 도커(Docker) 튜토리얼 : 깐 김에 배포까지

참고: 초보를 위한 도커 안내서 - 도커란 무엇인가?

참고: 위키백과 용어 검색