Judaeng

Docker(1) - 알아보기 본문

DevOps/Docker

Docker(1) - 알아보기

Judaeng 2022. 4. 1. 01:20

도커는 컨테이너를 관리하는 플랫폼

Docker란? 

Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. (Docker는 컨테이너를 관리하는 플랫폼)

 

컨테이너라 하면 배에 실는 네모난 화물 수송용 박스를 생각할 수 있는데 각각의 컨테이너 안에는 옷, 신발, 전자제품, 술 과일 등 다양한 화물을 넣을 수 있고 규격화되어 컨테이너선이나 트레일러 등 다양한 운송수단으로 쉽게 옮길 수 있다.

 

서버에서 이야기하는 컨테이너도 이와 비슷한데 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해 준다.

백엔드 프로그램, 데이터베이스 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립 PC, AWS, Azure, Google cloud 등 어디에서든 실행할 수 있다.

 

컨테이너를 가장 잘 사용하고 있는 기업은 구글인데 2014년 발표에 따르면 구글은 모든 서비스들이 컨테이너로 동작하고 매주 20억 개의 컨테이너를 구동한다고 한다.

 

컨테이너(Container)란?

Docker Container

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

가상화 기술의 하나지만 기존 방식과는 차이가 있다.

 

기존의 가상화 방식은 주로 OS를 가상화하였다.

 

우리에게 익숙한 VMwareVirtualBox 같은 가상 머신은 호스트 OS위에 게스트 OS 전체를 가상화하여 사용하는 방식이다.

이 방식은 여러 가지 OS를 가상화(Linux에서 Window를 돌린다던가)할 수 있고 비교적 사용법이 간단하지만 무겁고 느려서 운영환경에선 사용할 수 없었다.

 

이러한 상황을 개선하기 위해 CPU의 가상화 기술(HVM)을 이용한 KVM(Kernel-based Virtual Machine)과 반가상화(Paravirtualization) 방식의 Xen이 등장한다.

이러한 방식은 게스트 OS가 필요하긴 하지만 전체 OS를 가상화하는 방식이 아니었기 때문에 호스트형 가상화 방식에 비해 성능이 향상되었다.

이러한 기술들은 OpenStack이나 AWS, Rackspace 같은 클라우드 서비스에서 가상 컴퓨팅 기술의 기반이 되었다.

* VMware: 가상 머신(Virtual Machine) -> 가상의 기계 장치

* VirtualBox: 오라클에서 만든 가상 머신 솔루션, 오픈소스, 무료

* 가상 머신(Virtual Machine): 하드웨어를 소프트웨어적으로 구현해서 그 위에서 운영체제가 작동하도록 하는 기술 

* HVM(Hardware Virtual Machine): 하드웨어 가상 머신

* KVM(Kernel-based Virtual Machine: 커널 기반 가상 머신): Linux에 구축되는 오픈소스 가상화 기술

* Xen: 오픈소스 하이퍼바이저 중 하나로, 하드웨어 위에서 실행되는 Type1의 형태 또는 베어 메탈 형태의 가상화 기술

* OpenStack: 풀링된 가상 리소스를 사용하여 프라이빗 및 퍼블릭 클라우드를 구축하고 관리하는 오픈소스 플랫폼

* Rackspace: AWS와 비슷한 컴퓨팅 기업, 텍사스주 샌안토니오에 있는 매니지드 클라우드 컴퓨팅 기업

 

가상머신과 도커

전 가상화든 반가상화든 추가적인 OS를 설치하여 가상화하는 방법은 성능 문제가 있었고 이를 개선하기 위해 프로세스를 격리하는 방식이 등장한다.

 

리눅스에서는 이 방식을 리눅스 컨테이너라고 하고 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작한다.

CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로도 거의 손실이 없다.

 

하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 VM(Vrtual Machine)을 사용하는 느낌을 준다.

실행 중인 컨테이너에 접속하여 명령어를 입력할 수 있고 apt-get이나 npm, yum으로 패키지를 설치할 수 있으며 사용자도 추가하고 여러 개의 프로세스를 백그라운드로 실행할 수도 있다.

CPU나 메모리 사용량을 제한할 수 있고, 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉터리를 내부 디렉터리인 것처럼 사용할 수도 있다.

 

Docker는 하이브리드 클라우드의 모든 레이어에서 컨테이너를 배포한다.

Docker 컨테이너는 고객 데이터 센터의 온-프레미스, 외부 서비스 공급자 또는 Azure의 클라우드에서, 어디서나 실행할 수 있다.

Docker 이미지 컨테이너는 Linux 및 Windows에서 기본적으로 실행할 수 있다.

그러나 Windows 이미지는 Windows 호스트에서만 실행할 수 있고 Linux 이미지는 Linux 호스트 및 Windows 호스트(지금까지 Hyper-V Linux VM 사용)에서 실행할 수 있다.

여기서 호스트는 서버 또는 VM을 의미한다.

 

개발자는 Windows, Linux 또는 macOS에서 개발 환경을 사용할 수 있다.

개발자는 개발 컴퓨터에서 앱 및 해당 종속성을 비롯하여 Docker 이미지가 배포된 Docker 호스트를 실행한다.

Linux 또는 macOS에서 작업하는 개발자는 Linux 기반의 Docker 호스트를 사용하고 Linux 컨테이너용 이미지만 만들 수 있다.

macOS에서 작업하는 개발자는 macOS에서 코드를 편집하거나 Docker CLI를 실행할 수 있지만, 이 작성 시점에는 컨테이너가 macOS에서 직접 실행되지 않는다.

Windows에서 작업하는 개발자는 Linux 또는 Windows 컨테이너용 이미지를 만들 수 있다.

출처: https://docs.microsoft.com/ko-kr/dotnet/architecture/microservices/container-docker-introduction/docker-defined

 

이미지(Image)

Docker image

Docker에서 가장 중요한 개념은 컨테이너와 함께 이미지라는 개념이다.

 

이미지는 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않는다.(Immutable).

컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다.

같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.

 

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

GitLab 이미지는 Centos를 기반으로 Ruby, Go, Database, Redis, GitLab, Source, Nginx 등을 가지고 있다.

 

말 그대로 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다.

이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운로드하고 컨테이너를 생성만 하면 된다.

한 서버에 여러 개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천 대의 서버도 문제없다.

 

Docker Hub

Docker image는 Docker Hub에 등록하거나 DockerRegistry.  저장소를 직접 만들어 관리할 수 있다.

현재 공개된 Docker image는 50만 개가 넘고 Docker Hub의 이미지 다운로드 수는 80억 회에 이른다고 한다.

누구나 쉽게 이미지를 만들고 배포할 수 있다.

 

Docker는 완전히 새로운 기술은 아니다.

이미 존재하는 기술을 잘 포장했다고 볼 수 있다.

 

컨테이너, 오버레이 네트워크(Overlay Network), 유니온 파일 시스템(Union File Systems)등 이미 존재하는 기술을 Docker처럼 잘 조합하고 사용하기 쉽게 만든 것은 없었고 사용자들이 원하는 기능을 간단하지만 획기적인 아이디어로 구현하였다.

 

🤷‍♂️ Docker를 사용하는 이유는?

레이어 저장 방식

Docker Layer

Docker image는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백 메가(MB)에 이른다.

처음 이미지를 다운로드할 땐 크게 부담이 안되지만 기존 이미지에 파일 하나 추가했다고 수백 메가를 다시 다운로드한다면 매우 비효율적일 수밖에 없다.

 

Docker는 이런 문제를 해결하기 위해 레이어(layer)라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러 개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해 준다.

이미지는 여러 개의 읽기 전용(Read Only) 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성됩니다.

ubuntu 이미지가 A + B + C의 집합이라면, ubuntu 이미지를 베이스로 만든 Nginx 이미지는 A + B + C + nginx 가 된다.

web app 이미지를 nginx 이미지 기반으로 만들었다면 예상대로 A + B + C + nginx + source 레이어로 구성된다.

web app 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운로드하면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있다.

 

컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기(Read-Write) 레이어를 추가한다.

이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용한다.

 

가상화의 특성상 이미지 용량이 크고 여러 대의 서버에 배포하는 걸 감안하면 단순하지만 엄청나게 영리한 설계라고 한다.

 

이미지 경로

Docker image URL

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

ubuntu 14.04 이미지는 docker.io/library/ubuntu:14.04 또는 docker.io/library/ubuntu:trusty이고 docker.io/library는 생략 가능하여 ubuntu:14.04로 사용할 수 있다.

이러한 방식은 이해하기 쉽고 편리하게 사용할 수 있으며 태그 기능을 잘 이용하면 테스트나 롤백도 쉽게 할 수 있다고 하니 알아두자.

 

Docker는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSL(Domain-specific language) 언어를 이용하여 이미지 생성 과정을 적는다.

코드는 따로 올리지 않는다. Docker를 설치해보고, 컨테이너를 실행하는 글을 작성할 때 다뤄볼 예정이다.

 

서버에 어떤 프로그램을 설치하려고 이것저것 의존성 패키지를 설치하고 설정 파일을 만들었던 경험이 있다면 더 이상 그 과정을 블로깅하거나 메모장에 적지 말고 Dockerfile로 관리하면 된다.

이 파일은 소스와 함께 버전 관리되고 원한다면 누구나 이미지 생성과정을 보고 수정할 수 있다.

 

Docker Hub

Docker Hub Hits 5 Billion Pulls(2016/08)

Docker image의 용량은 보통 수백 메가로 수기가가 넘는 경우도 흔하다고 한다.

큰 용량의 이미지를 서버에 저장하고 관리하는 것은 쉽지 않은데 Docker는 Docker Hub를 통해 공개 이미지를 무료로 관리해 준다.

하루에도 엄청난 용량의 이미지가 전 세계에서 다운로드되고 트래픽 비용만 해도 어마어마할 것 같은데 그것이 다 무료이다.

 

Command와 API

Docker 클라이언트의 커맨드 명령어는 정말 잘 만들어져 있다고 한다.

대부분의 명령어는 직관적이고 사용하기 쉬우며 컨테이너의 복잡한 시스템 구성을 이해하지 못하더라도 편하게 사용할 수 있다고 한다.

Http 기반의 Rest API도 지원하여 확장성이 굉장히 좋고 훌륭한 3rd party 툴이 나오기 좋은 환경이라고 한다.

*3rd party(서드파티): 다른 회사 제품에 이용되는 소프트웨어나 하드웨어를 개발하는 회사 

 

훌륭한 생태계

Docker는 굉장히 큰 생태계를 가지고 있고 커다란 기업과 협력하여 사실상 클라우드 컨테이너 세계의 de facto가 되었다.

로깅, 모니터링, 스토리지, 네트워크, 컨테이너 관리, 배포 등 다양한 분야에서 다양한 툴들이 존재하며 아예 Docker를 위한 OS(coreos -> container linux)도 존재한다고 한다.

 

현재 Docker를 기반으로 한 오픈소스 프로젝트는 10만 개가 넘고 굉장히 활발하게 진행되고 있다고 한다.

 

커뮤니티 지원

Docker는 기술 기업답지 않게 홍보와 커뮤니티 관리에 굉장히 신경 쓰고 있다고 한다.

커뮤니티를 위한 스티커나 티셔츠를 무료로 제공하고 필요하면 연사 요청도 할 수 있다고 한다.

홈페이지에서는 전 세계에서 열리는 밋업 상황을 볼 수 있고 일주일마다 발송되는 뉴스레터에는 다양한 개발자들의 글이 실려있다고 한다.

 

📝블로그 정리 요약

Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. (Docker는 컨테이너를 관리하는 플랫폼)

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

하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 VM(Vrtual Machine)을 사용하는 느낌을 주고, 실행 중인 컨테이너에 접속하여 명령어를 입력할 수 있고, apt-get이나 npm, yum으로 패키지를 설치할 수 있으며 사용자도 추가하고 여러 개의 프로세스를 백그라운드로 실행할 수도 있다.

✅ 이미지는 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않는다.

컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다.

이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다.

새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운로드하고 컨테이너를 생성만 하면 된다.

✅ Docker image는 Docker Hub에 등록하거나 Docker Registry. 저장소를 직접 만들어 관리할 수 있다.

✅ Docker를 사용하는 이유 레이어 저장 방식, 이미지 경로, Docker Hub, Command와 API, 훌륭한 생태계, 커뮤니티 지원 등이 있다.

 

🤔 블로그 정리 후, 느낀 점

음.. Docker라는 말을 처음 들었을 땐, 귀여운 고래 아이콘을 사용하는 프로그램이고, 여러 개의 서버를 간단하게 하나의 가상현실에서 띄워주는 편리한 기술 스택으로만 알고 있었다. 

정리하면서 느낀 점인데, 너무 어렵다.
진짜 내용을 자세하게 알고, 사용하는 사람은 몇 없을 것 같다는 느낌이 들었다.

또 Docker는 새로운 기술이 아닌, 다른 기술들이 많이 합쳐진 기술이라고 한다. 그것도 굉장히 편리한 쪽으로!

그래서 함부로 "나 도커라는 기술을 정말 자세하게 알아!!!"라고 이야기를 못하겠다😂

그래도 정리하면서 Docker는 어떤 식으로 사용되고, 구조는 어떤식으로 되어 있는지 등 그것 외에도 많은 것을 배울 수 있었던 것 같다.

참고로 내 블로그 글은 subicura님의 블로그 글을 몇 번씩 읽으면서 이해하려고 노력하고, 정리한 글이다.

참고 사이트들을 많이 보면서 이해하면 좋을 것 같다.

내 글에서 부족하다고 생각한 글은 "Docker를 그래서 왜 사용하는 거야?"라는 질문에 대한 답이 부족한 것 같다.

이 부분은 참고 사이트에 올리고 그 페이지를 보는 것이 제일 좋을 것 같다 😃

 

📝이번 게시물을 만들기 위해 참고한 사이트

1. 도커 공식 홈페이지 문서

2. 초보를 위한 도커 안내서 - 도커란 무엇인가(subicura)

3. Docker란 무엇입니까?(AWS) - Docker는 왜 사용할까?

4. Microsoft Docker란 무엇인가요?

5. Docker란 무엇인가? - 조대협

6. Docker(도커)란? - Red Hat

7. KVM이란? - Red Hat

8. OpenStack이란? - Red Hat

Comments