[Infrastructure]Docker란?

Yeon Jeffrey Seo·2022년 1월 30일

Infrastructure

목록 보기
1/1

도커란?

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼 이다.

다양한 프로그램, 실행 황경을 컨테이너로 추상화 하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다. 백엔드 프로그램, 데이터베이스 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화할 수 있고 어디에서든 실행할 수 있다.

컨테이너(Container)

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술이다. 가상화 기술 중 하나지만 기존 방식과는 차이가 있다.

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

자주 사용했던 VMWare, VirtualBox 같은 가상 머신은 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식이다. 이 방식은 여러 OS를 가상화할 수 있고, 비교적 사용법이 간단하지만 무겁고 느려서 운영 환경에서는 사용할 수 없다.

이를 개선하기 위해 CPU의 가상화 기술을 이용한 KVM(Kernel-based Virtual Machine)과 반가상화(Paravirtualization) 방식의 Xen이 나온다. 이러한 방식은 게스트 OS가 필요하긴 하지만 전체 OS를 가상화하는 방식이 아니었기 때문에 호스트형 가상화 방식에 비해 성능이 향상되었다.

전가상화든 반가상화든 추가적인 OS를 설치하여 가상화하는 방법은 성능 문제가 있으므로 이를 개선하기 위해 프로세스를 격리하는 방식이 등장한다.
리눅스에서는 이 방식을 르눅스 컨테이너라고 하고 단순히 프로세스를 격리시키기 때문에 가볍로 빠르게 동작한다. CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로 손실이 거의 없다.

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

이미지(Image)

도커에서 가장 중요한 개념은 컨테이너와 함게 이미지라는 개념이다.
이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것 으로 상태값을 가지지 안고 변하지 않는다(Immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되도라도 이미지는 변하지 않고 그대로 남아있다.

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

이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 의존성 파일을 컴파일하고 이것 저것 설피할 필요가 없다. 새로운 서버가 추가되면 미리 만들어놓은 이미지를 다운받고 컨테이너를 생성만 하면 된다. 하나의 서버에 여러 개의 컨테이너를 실행할 수 있고, 수천 대의 서버도 문제 없다.

왜 이렇게 핫한가?

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

레이어 저장 방식

도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 용량이 수백 메가에 이른다. 처음 이미지를 다운 받을 댄 크게 부담이 안 되지만, 기존 이미지에 파일 하나를 추가했다고 수백 메가를 다시 다운받는다면 매우 비효율적일 수 있다.

도커는 이런 문제를 해결하기 위해 레이어라는 개념을 사용하고 유니언 파일 시스템을 이용하여 여러 개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해준다. 이미지는 여러 개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.

ubuntu 이미지가 A + B + C 의 집합이라면 이를 베이스로 만든 nginx 이미지는 A + B + C + nginx 가 된다. web app 이미지를 nginx 이미지 기반으로 만들었다면 A + B + C + nginx + source 로 구성된다. 만약 web app 소스를 수정하면 A, B, C, nginx 를 제외한 새로운 sourceV2 레이어만 다운받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있다.

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

이미지 경로

이미지는 url 방식으로 관리하며 태그를 붙일 수 있다. ubuntu 14.04 이미지는 docker.io/library/ubuntu:14.04 또는 docker.io/library/ubuntu:trusty 이고 docker.io/library 는 생략 가능하여 ubuntu:14.04 로 사용할 수 있다.

참고자료

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

profile
The best time to plant a tree was twenty years ago. The second best time is now.

0개의 댓글