Docker(1)

2019-12-16

2020년의 첫 프로젝트를 시작하려 한다.
회사의 주요 서비스 (및 모듈) 들을 docker 배포 환경으로 만드는 작업이다.

일단 멘붕.

docker로 mongo-db 나 gitlab정도만 깔아봤지
정확한 개념을 잡고 있진 않았기에 어떻게 해야 할지 걱정이 많았다.
먼저 Docker가 무엇인지 알아보자.

Docker는 VM인가?

처음 Docker를 접했을때 “아 이건 VM이구나?!” 라는 생각을 했다.
처음 docker를 접한건 2018년 말 mongo-db를 설치하면서 였다.
주변에서 docker docker 하길래 그래 이왕 하는김에 docker를 써보자. 하면서 구글링을 열심히 했다. 어찌저찌 깔려서 돌아가는 모습을 보면서. docker == VM 이라는 개념이 잡혀버렸다.
하지만 docker 는 VM과 비슷하지만 다르다. docker에 대해 알아보자.

Docker?

개념은 Docker는 Container 기반의 오픈소스 가상화 플랫폼이다.
그렇다면 Container 무엇인가? 그리고 Container를 실행하는데 필수인 Image에 대해서 알아보자

Container

격리된 공간에서 Process가 동작하는 기술. 가상화 기술의 하나. 하지만 기존 가상화 방식은 주로 OS가상화 였다. VMware, Virtualbox 등 가상머신은 호스트 OS위에 게스트 OS전체를 가상화하여 사용하는 방식이다. 이 경우 무겁고 느려서 운영환경에선 사용할 수 없었다.
image01

위 Image와 같이 Guest OS가 없이 단순히 프로세스를 격리 시키기 때문에 가볍고 빠르게 동작한다. CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가하고 사용하고 성능적으로 손실이 적다.

Image

image02
Image는 Container 실행에 필요한 파일과 설정값등을 포함하고 있는것.
상태값을 가지지 않고 변하지 않는다. Container는 Image를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 Image에서 여러개의 Continer를 생성할 수 있고 Conetiner의 상태변화에 Image는 영향이 없다.

Docker Image는 Docker Hub 에서 다운받거나 등록 할 수 있다.
Docker Registry 저장소를 직접 만들어 관리할 수 있다.

Docker의 장점

Layer 저장방식

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

Docker는 이런 문제를 Layer라는 개념을 사용하여 해결했다.
Image n개의 Layer로 구성되고 파일이 추가되거나 수정되면 새로운 Layer가 생성된다.
예를 들어 ubuntu Image가 A+B+C Layer로 이루어져있다면 ubuntu Image를 베이스로 만든 nginx Image는 A+B+C+nginx 가 된다. 여기에 webapp Image를 nginx기반으로 만들었다면 A+B+C+nginx+source 가 된다.
webapp source를 수정하면 source layer만 다운받으면 된다.

Dockerfile

Docker는 Image를 만들기 위해 Dockerfile이라는 파일에 자체 DSL언어를 이용하여 이미지 생성과정을 적는다. 기존 어떠한 프로젝트 구성을 하기위해 centOS를 깔고 DB설치를 하고 jdk설치를 하고 apache+tomcat 과 같은 was 설정 등을 Dockerfile로 관리 할 수 있다.
Dockerfile은 소시와 함께 버전관리 되고 원한다면 누구나 이미지 생성과정을 보고 수정할 수 있다.

아래는 최근에 작성한 sample이다. 이런식으로 image를 만들게 되면 해당 image로 container 생성시 app이 실행이 된다.

DockerHub

image04
Docker Image의 용량응 보통 수백메가로 수기가가 넘는 경우도 흔하다. 이렇게 큰 용량의 이미지를 서버에 저장하고 관리하는 것은 쉽지 않은데 Docker hub를 통해 공개 이미지를 무료료 관리해준다.

Command와 API

Docker Client의 Command 명령어는 정말 잘 만들어져있다. 대부분의 명령어는 직관적이고 사용하기 쉬우며 Container의 복잡한 시스템 구성을 이해하지 못하더라도 편하게 사용할 수 있다. 또한 http기반의 Rest API도 지원하여 확장성이 굉장히 좋고 훌륭한 3rd party tool이 나오기 좋은 환경이다.

훌륭한 생태계

커뮤니티 지원

다음엔 docker container를 실행해보고 명령어에 대해서 살펴볼 예정이다.

참고

https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html