Docker - 1. Docker의 개념

2020-02-25

Docker 관련 블로그를 작성하는 중에 회사에서 공유 문서를 작성하라는 지침을 받고
회사 GitLab Wiki에 작성한것을 옮겨 본다.

Index


  1. Docker
    1. Docker 개념
    2. Docker Install
    3. Docker Command
    4. Docker Example
    5. Image 만들기
    6. Dockerfile
    7. Docker Compose
    8. Image 저장소

  1. Container Orchestration
    1. Container Orchestration 이란
    2. kubernetes(1)
    3. kubernetes(2)
    4. kubernetes install
    5. kubernetes ui
    6. kubernetes를 이용해 배포해보기
    7. kubectl CLI

  1. Provisioning
    1. Provisioning이란
    2. Ansible
    3. Ansible을 이용해 kubernetes cluster 생성하기

What Is Docker?

Docker는 2013년 3월 Docker에서 출시한 오픈소스 컨테이너 프로젝트입니다.

Docker is an open-source engine that automates the deployment of any application as a lightweight, portable, self-sufficient container that will run virtually anywhere.

Docker는 거의 어디에서나 실행되는 경량이면서 portable하고, 자급자족인 컨테이너 응용 프로그램의 배포를 자동화하는 오픈소스 엔진입니다.

직역을 해도 docker 어떤건지에 대해 이해하기는 쉽지 않습니다.
image01

Docker는 어느 플랫폼에서나 재현가능한 어플리케이션 컨테이너를 만들어주는 것을 목표합니다.
LXC(리눅스 컨테이너)라는 개념에서 출발해서 특정 리눅스 배포판에서 사용 가능합니다.
하지만 거의 대부분이 사용하는 Linux OS 입니다. Cent, Ubuntu, Debian, Fedora 등입니다.
가상 머신이라고 하기보다는 격리된 환경을 만들어주는 도구입니다.

Docker의 특징

Why Docker?

그렇다면 docker를 사용해야 할 이유가 뭘까요?

서버가 물리서버에서 클라우드 서버 환경으로 바뀌면서 클릭 몇 번 만으로 서버를 만들어 낼 수 있게 되었습니다.
서버의 수가 증가하면서 관리하기 어려운 환경이 되면서 Immutable Infrastructure라는 패러다임이 나왔습니다.

Immutable Infrastructure

호스트 OS와 서비스 운영환경을 분리하고, 한 번 설정한 운영환경은 변하지 않는다

Immutable Infrastructure를 구현한 프로젝트가 바로 Docker 입니다.

image02

Docker는 Image를 이용해 Container를 생성(실행)합니다.
그러기 위해선 Docker Imager, Docker Container가 무엇인지 알아야 합니다.
Image와 Container에 대한 개념을 먼저 알아보겠습니다.

Docker Images

이미지는 추상적인 개념이며, 이미지를 기반으로 생성된 컨테이너가 실행됩니다.
이미지는 코드, 런타임, 도서관, 환경 변수 및 구성 파일 등 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하는 실행 가능한 패키지로 상태값을 가지지 않고 변하지 않습니다.(Immutable)
이미지는 직접 제작할 수도 있고 Docker Hub 와 같은 repository 에 올라가 있는 image 를 사용목적에 맞게 다운받아서 사용할 수 있습니다.

image03

도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있습니다. 현재 공개된 도커 이미지는 50만개가 넘고 Docker hub의 이미지 다운로드 수는 80억회에 이릅니다. 누구나 쉽게 이미지를 만들고 배포할 수 있습니다.

image04

참고로 Docker Hub는 유료입니다. 물론 무료로 사용할 수 있지만 1개의 private repository 를 제공해 줍니다. (개인사용자기준) 기업이 사용하기 위해서는 유료정책 만 있습니다.

image05

이미지는 Container를 실행하기 위한 모든 정보를 가지고 있기 때문에 용량이 큰 편입니다. 최초 Image를 다운받은 후 기존 Image에 파일이 하나 추가됬다고 Image를 다시 다운받는다면 매우 비효율 적이죠

Docker는 이런 문제를 Layer라는 개념을 사용해서 해결했습니다.
Image는 n개의 Layer로 구성되고 파일이 추가되거나 수정되면 새로운 Layer가 생성됩니다.
예를들어 ubuntu 가 a, b, c layer 로 이루어져 있다면 ubuntu image 베이스로 만든 nginx Image는 A, B, C 그리고 nginx가 됩니다.
여기에 webapp image를 nginx 기반으로 만들어 졌다면 a, b, c, nginex, source 레이어가 합쳐진 image가 됩니다.
이런 구성에서 webapp source를 수정한다면 source layer 만 다운받아져서 사용이 가능합니다.

이런식으로 Docker는 Image를 통째로 생성하지 않고, 바뀐 부분만 생성한 뒤 부모 이미지를 계속 참조하는 방식으로 동작합니다.

image06

Docker Container

image07

Docker Container 는 Docker Image를 기반으로 실행된 상태 입니다.
1개의 Image로 n개의 Container를 구성 할 수 있습니다.
운영체제로 예를 들면 Image는 실행파일이고 Container는 실행파일로 작동하는 프로세스입니다.

Container는 Image로부터 생성되지만 Container내부의 내용은 변경 가능합니다. (Mutable)
Conatiner가 변경된다고 해서 Image에는 어떠한 영향도 작용되지 않습니다.

Docker Container는 Linux Container에서 기반된 기술입니다.
초기 버전에서는 Linux Container를 사용했지만 이후로 자체 개발한 Container를 개발했습니다.

Container는 가상화방식중 하나로 프로세스를 격리 해줍니다.

Video Label
출처 : RedHat Videos

Docker Container는 가상머신인가?

image09

왼쪽이 docker Container이고 오른쪽이 VM 입니다.
Docker를 처음 접하는 분들은 Docker를 가상머신으로 인식하시는 분들이 많습니다.
Docker Container 를 볼때 외부에서 볼떄는 process 로 보이고 내부에서 보면 vm 같이 보입니다.
Docker는 가상화의 한 방법이긴 하지만 기존 가상화 / 반가상화 방식과는 다르게 Guest OS 설치가 필요없습니다.
vm의 경우에 하드웨어 리소스를 사용하기 위해 하이퍼바이저 설치가 필요하고 각자 Guest OS 설치를 해야 합니다.
거기에 반해 Docker Container 는 Linux 커널위에서 단순히 프로세스를 격리 시키기 때문에 가볍고 빠르게 동작합니다.

이러니 저러니 해도 직접 설치해서 사용해보는것 만큼 좋은 공부는 없는것 같습니다.
일단 Docker를 설치해보도록 하겠습니다.

참고

https://www.docker.com
http://pyrasis.com/book/DockerForTheReallyImpatient
https://www.44bits.io/ko/post/almost-perfect-development-environment-with-docker-and-docker-compose
https://tech.osci.kr/docker/2018/09/10/45749387/
https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html