Docker - #1 Intro

Joshua Song / 송성현·2020년 3월 16일
1

백엔드

목록 보기
5/8

Introduction

주말간 지금까지 공부해왔던 걸 복습했던 시간을 가졌고, 실질적인 데디캣츠의 테스트케이스는 당시 프로젝트를 진행하던 페어분과 같이 진행해 보기로 해 그 중간 시간에 면접 준비와 새로운 것에 대해서 공부를 하고 싶었다. 공부하고 싶고, 또 새로운 기술들이 너무나도 많기에 오히려 토픽을 고를 때 시간을 많이 소비했다. 그리고 엄청 길거라 예상하지만 한번은 공부하고 넘어가야 된다고 예상했던 걸 시작하려 한다. 실제 많이 회사들도 사용하고, 사용해보고 싶었지만 아직 뭔지 몰라 사용하지 못했던...MariaDB가 물개였다면 이번엔 고래다. Docker이다!

What is Docker?

서버를 구축하고 관리하다 보면 여러개의 프로그램과 환경을 설치하고 설정해줘야 하는데, 컴퓨터를 옮겨가며 새로운 OS에 서버를 셋팅하면 리눅스 배포판의 차이와 환경의 차이로 문제가 생길 수 있다. 서로 사용하는 라이브러리의 버전이 다르거나 동일한 포트를 사용하는 경우도 있고, 서버의 환경도 다 다를 수 있어 서버 관리를 하기 매우 힘들다. A라는 사람은 CentOS를 쓰고 B라는 사람은 Ubuntu를 사용한다고 하면 A의 서버를 B의 컴퓨터에서 구축해 사용을 원한다면, 환경이 다르고 OS가 다르기에 많은 이슈가 생기고, 또 설치가 굉장히 까다로울 수 있다.

이러한 문제를 해결하기 위해, 도커 (Docker)라는 컨테이너 기반의 오픈소스 가상화 플랫폼이 2013년도에 탄생했다. 이제는 모르는 사람을 찾는게 더 어려울 수도 있는 도커는 과연 무엇일까? 일단 난 모르니까...알아보자!

What is container?

먼저 도커를 왜 사용해야 하는지 알려면, 컨테이너라는 개념부터 알아야 한다. 컨테이너는 항구에서 화물선이 실고 다니는 화물 수송용 박스를 생각하기 쉬운데, 비슷하게 운송수단으로 생각할 수 있다.

서버에서의 컨테이너는 다양한 프로그램, 실행환경을 컨테이너로 추상화 함으로 똑같은 인터페이스를 제공해 프로그램의 배포 및 관리를 단순화 해준다. 백엔드 프로그램, 데이터베이스 서버 등 어떤 프로그램도 컨테이너로 추상화할 수 있고 AWS, Azure, Google Cloud등 어디에서든 실행할 수 있다!

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술.

How is it special?

  • 기존의 프로그램의 가상화 / 추상화 방식은 OS를 가상화 해 사용했다. VMware 혹은 VirtualBox 같은 가상 머신은 우리가 사용하는 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식이었는데 이 방법은 여러가지 OS를 가상화 할 수 있고 사용법이 간단하지만 무겁고 느려 운영환경에서는 사용할 수 없었다.
  • 이러한 전체 가상화의 상황을 개선하기 위해 CPU의 가상화 기술(HVM)을 이용한 KVM(Kernel-based Virtual Machine)반가상화(Paravirtualization) 방식의 Xen(가상화를 하기 위해 필요한 시스템 프로그램. Type 1 하이퍼바이저)이 등장한다. 게스트 OS가 필요하긴 하지만, 전체 OS를 가상화 하진 않기 때문에 성능이 향상 되었다.
  • 전가상화, 반가상화 모두 추가적인 OS를 설치하여 가상화를 진행해서 성능문제가 없을 수 없었고 프로세스를 격리하는 방식을 통해 개선을 찾기 시작했다. 리눅스에서는 리눅스 컨테이너라고 하는 이 방식은 프로세스를 격리 하기 때문에 가볍고 빠르게 동작하고, CPU 및 메모리는 딱 프로세스가 필요한만큼 사용하고 성능도 거의 손실이 없다 (도커의 기본 네트워크 모드는 Bridge모드로 약간의 성능 손실이 있다).
  • 하나의 서버에 독립적인 컨테이너 여러 개를 실행해도 서로 영향을 미치지 않고 실행중인 컨테이너에 접속하여 명령어 입력, 패키지 설치 그리고 사용자도 추가해 여러 개의 프로세스를 백그라운드로 실행이 가능하다. CPU 나 메모리 사용량을 제한할 수 있고, 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것 처럼 사용할 수도 있다. 새로운 컨테이너는 만드는데 걸리는 시간은 1-2초 밖에 안되기에 가상머신보다 매우 빠르다.
  • 컨테이너라는 개념은, 도커 전 리눅스의 리눅스 컨테이너(LXC)가, FreeBSD에는 Jail이, Solaris에서는 Solaris Zones라는 기술로 프로세스를 격리하였고 구글에서는 직접 컨테이너 기술을 만들어 사용하고 lmctfy(let me contain that for you)라고 오픈소스 컨테이너 기술을 공개하기도 했다 (실패).

도커는 초반 LXC를 기반으로 개발됬지만, 나중에 Libcontainer라는 자체 런타임을 만들었다

  • 컨테이너에 더 풍부한 서비스 계층을 제공하고, 리눅스와 별개로 도커 컨테이너 기술을 개발하도록 도와준다.

What is image?

  • 도커에서 이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고, 변하지도 않는다 (immutable). 컨테이너는 이미지가 실행된 상태라고 볼 수 있고, 변화가 일어나면 컨테이너에 저장이 된다. 같은 이미지에서 여러 개의 컨테이너를 생성하고 컨테이너의 상태가 바뀌거나, 삭제되도 이미지는 남아있다.
  • 이미지에 따라, 그 프로그램을 실행하귀 위한 모든 파일을 가지고 있다. 데이터베이스 이미지일 경우 실행 명령어, 포트 정보까지 가지고 있다. 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기에 다른것들을 설치할 필요가 없다. 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성하기만 하면 된다. 한 서버에서 여러개의 컨테이너 실행도 문제없다!
  • Github 처럼 Docker hub 또는 Docker Registry에 도커 이미지를 등록하거나 관리할 수 있다. 누구나 쉽게 이미지를 만들고 배포할 수 있다!

Why Docker?

도커는 이미 존재하는 기술을 잘 조합해 사용하기 쉽게 만들어 사용자들이 원하는 기능만을 엄선해 구현했다. 도커 컨테이너는 컨테이너 런타임 환경을 지원하는 모든 장치에서 실행된다. 호스트 운영체제와 애플리케이션을 연결할 필요가 없다!

Docker Layer

  • 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기에 파일이 추가될 때마다 계속 이미지를 다운 받는다면 매우 heavy하고 비효율적이다. 그렇기에 도커에서는 레이어(layer) 라는 개념을 사용한다.
  • 유니온 파일 시스템을 이용해, 하나의 이미지가 여러개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.
  • 위 이미지를 보면 초기 ubuntu의 이미지는 레이어 A, B, C의 집합이다. 이후 ubuntu 이미지에 nginx를 추가해 nginx 이미지를 만든다면 맨 위에 nginx 레이어만 추가된다. webapp 이미지를 또 nginx 이미지를 기반으로 만든다면, 또 맨 위에 필요한 레이어만 추가한다. 이렇게 레이어 별로 변화가 있을 때마다 추가되고, 또 그 레이어만 다운 받으면 되니 굉장이 효율적이다.
  • 컨테이너에서도 레이어 방식을 사용하는데 이미지 레이어위에 읽기/쓰기 레이어를 추가한다. 따라서 컨테이너가 이미지 레이어를 사용해 실행중일 때 생성 또는 변경되는 내용은 읽기/쓰기 레이어에 저장되기에 최소한의 용량만 사용한다.

Image Path

  • 이미지는 url 방식으로 관리하며, 태그를 붙일 수도 있다.

Dockerfile

  • 도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSL(Domain-specific language)를 이용하여 이미지 생성과정을 적는다.
  • 도커파일로 설정을 관리할 수 있고 소스와 함께 버전관리 되기에 누구나 이미지 생성과정을 보고 수정할 수 있다.

Docker Hub

  • 깃헙같이 도커는 Docker Hub을 통해 큰 용량의 이미지를 서버에 저장하고 관리한다. (무료)

Command and API

  • 대부분의 도커 클라이언트의 커맨드 명령어는 직관적이고 쉬우며 편하게 사용할 수 있다.
  • HTTP 기반의 Rest API도 지원한다! 확장성이 좋다.

Fast Updates and Excellent Environment

  • 도커는 발전속도가 아주 빠른 오픈소스여서 빠르게 개선되고 또 새로운 버전이 출시되면 유능한 기능이 많이 추가된다.
  • 도커는 홍보와 커뮤니티 관리도 잘 되있다. 덤으로 다양한 툴들도 존재한다. (Even OS for Docker?)

Conclusion

Docker의 기본적인 개념을 공부하며, 왜 이렇게 핫한지, 왜 다들 쓰라고 나에게 추천해주는지 알 것같다. 실제로 이렇게 이미지를 생성해 다운받아 컨테이너로 실행한다면, CI/CD (Continuous Integration / Continuous Deployment) 측면에서 엄청난 장점인 것 같다. 기본적인 이론을 정리한 파트 #1은 끝이다. 수많은 리소스를 둘러보며 공부했는데, 블로그를 정리할 때는 가장 개인적으로 이해하기 쉽고 잘 organize 되있는 분의 블로그를 많이 참조했다. 정말 똑똑하신 것 같다...나도 언젠간...

빨리 Docker를 사용해보고 싶다!

참조
https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
https://www.researchgate.net/figure/An-example-of-dockerfile_fig1_326103912
https://medium.com/@_oleksii_/set-up-automated-builds-using-github-and-docker-hub-12c3e0f18eba
https://tech.peoplefund.co.kr/2017/04/03/what-is-docker-ko.html
http://www.itworld.co.kr/news/110748
https://www.docker.com/why-docker

profile
Grow Joshua, Grow!

0개의 댓글