아티클

도커 이해하기

깊게 생각하고 최선을 다하자 2022. 9. 4. 01:01

1) 도커란?

- 도커는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. 

  소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며,  

  컨테이너는 라이브러리, 시스템 도구, 코드 등 소프트웨어 실행에 필요한 모든 것이 포함되어 있습니다. 

  즉, 도커는 컨테이너 환경에서 독립적으로 애플리케이션을 실행할 수 있도록,

  컨테이너를 만들고 관리하는 것을 도와줍니다.  

  도커를 통해 애플리케이션을 실행하면 독립된 환경에서 일관된 결과를 보장합니다. 

  도커의 핵심은 이미지와 컨테이너입니다.

 

2) 컨테이너란?

- 컨테이너는 격리된 공간에서 프로세스가 동작하는 기술입니다. 가상화 기술의 하나이지만 기존 방식과는 차이가 있습니다. 기존의 가상화 방식은 주로 OS를 가상화 하였습니다. 우리에게 익숙한 VMWare나 VirtualBox 같은 가상머신은 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용합니다. 이 방식은 여러가지 OS를 가상화할 수 있고, 비교적 사용법이 간단하지만, 무겁고 느려서 운영환경에서는 사용할 수 없습니다. 

 

- 이러한 상황을 개선하기 위해 CPU의 가상화 기술을 이용한 KVM(Kernel-based Virtual Machine)과 반가상화(Paravirtualization) 방식의 Xen이 등장합니다. 이러한 방식은 게스트 OS가 필요하긴 하지만, 전체 OS를 가상화하는 방식이 아니였기 때문에, 호스트형 가상화 방식에 비해 성능이 향상되었습니다. 이러한 기술들은 OpenStack이나 AWS와 같은 클라우드 서비스에서 사용하는 가상 컴퓨팅 기술의 기반이 되었습니다.    

 

- 전가상화든 반가상화든 추가적인 OS를 설치하여 가상화하는 방법은 어쨌든 성능 문제가 있었고,

  이를 개선하기 위해 프로세스를 격리하는 방식이 등장합니다.

 

- 리눅스에서 프로세스를 격리하는 방식을 리눅스 컨테이너라고 합니다. 단순히 프로세스를 격리하기 때문에 가볍고 빠르며, CPU나 메모리는 프로세스가 필요한만큼만 추가 사용하여서 성능적으로 거의 손실이 없습니다. 

 

- 도커의 장점은 다음과 같습니다.

(1)  하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고

      독립적으로 실행되어 마치 가벼운 VM을 사용하는 느낌을 줍니다. 

(2)  실행중인 컨테이너에 접속하여 명렁어를 입력할 수 있고, apt-get이나 yum으로 패키지를 설치할 수 있으며,

      사용자도 추가하고 여러 개의 프로세스를 백그라운드로 실행할 수도 있습니다.

(3) CPU나 메모리 사용량을 제한할 수도 있고, 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를

     내부 디렉토리인 것처럼 사용할 수 있습니다.

(4) 새로운 컨테이너를 만드는데 걸리는 시간은 겨우 1-2초로 가상머신과 비교도 할 수 없이 빠릅니다. 

 

 

2) 이미지(Image)

- 도커에서 가장 중요한 개념은 컨테이너와 함께 이미지라는 개념입니다.

  이미지는 컨테이너 실행에 필요한 파일과 설정값 등을  포함하고 있는 것으로

  상태값을 가지지 않고 변하지 않습니다(Immutable).

 

- 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도

  이미지는 변하지 않고 그대로 남아 있습니다.

 

- Ubuntu 이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있고,

  MySQL 이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보 등을 가지고 있습니다.

  좀 더 복잡한 예로 Gitlab 이미지는 centos를 기반으로 Ruby, Go, Database, Redis, Gitlab, Source, Nginx 등을 가지고 있습니다.

 

- 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 

   이것저것 설치할 필요가 없습니다. 이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운 받고

   컨테이너를 생성만 하면 됩니다. 한 서버에 여러 개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천대의 서버도 문제 없습니다.

 

- 도커 이미지는 Docker hub에 등록하거나, Docker Registry 저장소를 직접 만들어 관리할 수 있습니다.

   현재 공개된 도커 이미지는 50만개가 넘고, Docker hub의 이미지 다운로드 수는 80억회에 이릅니다. 

 

 

3) Dockerfile

- 도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSL 언어를 이용하여 이미지 생성 과정을 적습니다. 

  이것은 굉장히 간단하지만 유용한 아이디어입니다. 서버에 어떤 프로그램을 설치하려고 의존성 패키지를 설치하고

  설정파일을 만들었던 경험이 있다면 더 이상 그럴 필요 없이 Dockerfile로 관리하면 됩니다.  

 

- Dockerfile을 사용하면 누구나 이미지 생성 과정을 쉽게 수정하고 관리할 수 있습니다. 

 

 

4) Docker hub

- 도커 이미지의 용량은 보통 수백MB나 수GB를 넘는 경우도 흔합니다. 도커는 Docker hub를 통해 공개 이미지를 

   무료로 관리해줍니다. 하루에도 엄청난 용량의 이미지가 전세계에서 다운로드 되는데 전부 무료입니다. 

 

 

참고

- 도커 이해하기 https://tecoble.techcourse.co.kr/post/2021-08-14-docker/

- 초보를 위한 도커 안내서 https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html