도커(Docker)?
개발자라면, 도커가 무엇인지 정확히는 몰라도 들어보긴 많이 들어봤을 것이다. 그렇다면 도커가 무엇일까? 정의부터 천천히 읽어보자.
정의
리눅스의 응용프로그램을 프로세스 격리 기술을 사용해 컨테이너로 실행하고 관리하는 오픈소스 프로젝트이다.
컨테이너란?
코드와 의존성을 모두 패키징하는 소프트웨어 표준 단위이다. 이를 이용해 다른 컴퓨팅 환경에서도 애플리케이션을 빠르게 이식시킬 뿐만 아니라 신뢰성 있게 동작시킬 수 있다. 실행 중인 환경의 OS 에 관계 없이 동일한 동작을 보장한다.
왜 쓸까?
왜 쓰는지 알아야 도커를 이해하기 더욱 쉬울 것이다. 도커는 어떤 문제를 해결하고 있을까?
왜 쓸까 1 : 배포를 쉽게 하기 위해 사용한다
배포 경험이 어느정도 있는 개발자라면, 리눅스에서 만든 프로그램이 윈도우즈에서 올바르게 동작하지 않을 수 있다는 사실을 이해할 것이다.
사실 리눅스, 윈도우는 극단적인 예시이고, OS 끼리 큰 차이가 나지 않더라도 우분투 리눅스, 레드햇 리눅스, 맥 OS 등 리눅스와 비스무리하게 생긴 많은 비슷한 OS 도 엄연히 다른 OS 이다.
내가 개발했던 환경과 다른 OS 에 내가 만든 프로그램을 배포할 때는 환경에 따른 여러가지 설정들을 해줘야 하기 마련이다.
도커는 컨테이너라는 기술로 이러한 불편함에서 우리를 해방시켜준다.
왜 쓸까 2 : VMware 보다 가볍다.
사실 호환성 해결만 따져보면, 도커보다 더 널리 알려진 OS 호환성을 해결하기 위한 도구가 하나 있다.
보통 OS 호환성 때문에 VMware 를 이용해본 경험이 다들 한번씩은 있을 것이다. 그러나 VMware 가상머신은 너무 무겁다는 치명적 단점이 있다. 그런데 도커의 컨테이너는 VMware 에 비하면 매우 가볍다.
도커의 기타 장점
- VM ware 와 다르게 새로운 컨테이너를 만드는데 걸리는 시간도 1~2초로 가상머신과 비교도 안되게 짧다.
- 하나의 서버에 여러 개의 컨테이너를 실행해도 서로 영향을 미치지 않고 독립적으로 실행된다.
- 실행중인 컨테이너에 접속하여 명령어 입력도 가능하며,
apt-get
이나yum
등으로 패키지 설치도 가능하다. - CPU 나 메모리 사용량을 제한할 수도 있고, 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있다.
기술적으로 어떻게 이런 일이 가능할까?
도커는 VMware 나 VirtualBox 와 같이 호스트 OS 위에 게스트 OS 전체를 가상화하는 방식의 무겁고 느리다는 한계를 극복하기 위해 다른 방식의 가상화를 사용한다.
기술적 한계를 극복하기 위해 CPU 의 가상화 기술인 HVM (Hardware Virtual Machine)을 이용한 KVM (Kernel-based Virtual Machine) 과 반가상화 (Paravirtualization) 방식의 Xen 이 등장한다.
새롭게 등장한 기술도 역시 게스트 OS 가 필요하긴 하지만, 전체 OS 를 가상화하는 방식이 아니어서 호스트형 가상화 방식에 비해 큰 성능 향상이 있다. 이러한 기술은 클라우드에서 가상 컴퓨팅 기술의 기반이 되었다.
가상머신과 도커 비교
전가상화와 반가상화 기술 모두 추가적인 OS 를 설치해야 한다는 단점이 있었다. 이를 개선하기 위해서 프로세스 격리라는 방식이 등장한다.
리눅스에서는 이 방식을 리눅스 컨테이너라고 한다. 단순히 프로세스만 격리시키기 때문에 가볍고 빠르게 동작하며, CPU 나 메모리도 필요한 만큼만 이용해서 성능 손실도 거의 없다.
다만 도커의 기본 네트워크 모드는
Bridge
모드인데 약간의 네트워크 성능 손실이 있을 수 있다. 네트워크 성능이 중요한 프로그램이라면,--net=host
옵션을 고려하자.
컨테이너 개념은 도커가 처음 만든 것이 아니라 프로세스를 격리하는 방법으로 리눅스에서는 cgroups(control groups) 와 namespace 를 이용한 LXC(LinuX Container) 가 있었고 FreeBSD 에서는 Jail, Solaris 에서는 Solaris Zones 라는 기술이 있었다. 구글에서는 직접 컨테이너 기술을 만들어 사용했고, Imctfy(Let Me Contain That For You) 라는 오픈소스 컨테이너 기술을 공개했다가 잘 안 됐다.
도커 이미지(Docker Image) 란?
도커 이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것이다. 상태값을 가지지 않고, 변하지 않는다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.
ubuntu 이미지가 있다면, ubuntu 를 실행하기 위한 모든 파일을 가지고 있을 것이다. MySQL 이미지가 있다면, debian 기반으로 MySQL 을 실행하는데 필요한 파일과 실행 명령어, 포트 정보 등을 가지고 있다.
이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성을 컴파일하고 이것저것 설치할 필요가 없다. 새로운 서버가 추가되면 미리 만들어놓은 이미지를 다운받고 컨테이너를 생성하면 된다. 한 서버에 여러 개의 컨테이너를 실행 가능하고, 수십, 수백, 수천대의 서버도 문제 없다.
도커 이미지 찾기 & 배포하기
도커 이미지는 주로 Docker hub 에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다. 공개된 이미지는 50만 개가 넘고, Docker hub 의 이미지 다운로드 수는 80억 회에 이른다. 누구나 쉽게 이미지를 만들고 배포할 수 있다.
도커 이미지 경로
- url 방식으로 관리하며, 태그를 붙일 수 있다.
ubuntu 14.04
의 경우, 이미지는docker.io/library/ubuntu:14.04
또는docker.io/library/ubuntu:trusty
이고docker.io/library
는 생략 가능하다. 그래서ubuntu:14.04
로 사용해도 된다.- 이해하기 쉽고 편리하게 사용할 수 있으며 태그 기능을 잘 이용하면 테스트나 롤백도 쉽다.
도커의 레이어 저장방식
도커 이미지는 보통 컨테이너를 실행하기 위한 모든 정보를 갖고 있어 용량이 수백메가에 이른다. 그런데 만일 컨테이너를 실행하고 이미지에서 파일 한개정도만 추가한 뒤에 다시 저장한다면, 또 수백메가의 이미지를 저장해야 할까? 답은 아니오이다.
도커는 레이어(Layer) 라는 개념과 유니온 파일 시스템을 사용하여 이러한 문제를 해결한다. 이미지는 여러 개의 읽기 전용(read only) 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.
기존 우분투의 이미지가 A
+ B
+ C
라면, 여기에 nginx
를 저장하고 다시 이미지를 저장했다면, 완전히 새로운 파일이 탄생하는 것이 아니라, A
+ B
+ C
+ nginx
인 파일이 나오게 되는 것이다.
새롭게 추가된 레이어만 다운받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있다.
컨테이너를 생성할 때도 레이어 방식을 사용하는데, 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서, 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용한다.
도커의 Domain Specific Language: Dockerfile
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
도커는 이미지를 만들기 위해 Dockerfile
이라는 자체 DSL(Domain Specific Language) 을 이용하여 이미지 생성 과정을 적는다. 위의 파일을 대충 봐도 무엇을 하는지 대략적으로 알 수 있을만큼 간결하고 명료하다.
기존에 서버에 어떤 프로그램을 설치하려고 어떤 의존성을 추가해야 하는지 끙끙대며 까먹지 않게 메모했던 경험이 있다면, 이제는 Dockerfile
하나만 잘 작성해놓으면, 언제든 손쉽게 다시 프로그램을 설치할 수 있다.
Docker Hub
도커 허브에서는 커다란 용량의 도커 이미지도 무료로 제공해준다.
Command 그리고 API
직관적인 명령어를 가지고 있으며, 컨테이너의 복잡한 시스템 구성을 이해하지 못해도 편리하게 이용할 수 있다. HTTP 기반의 REST API 도 지원하여, 확장성이 굉장히 좋고 훌륭한 3rd party 툴이 나오기 좋은 환경이다.
유용한 새로운 기능들
이 시간에도 도커는 발전하고 있다. 사용하면서 부족하다고 느낀 부분은 빠르게 개선되며 새로운 버전이 나오면 유용한 기능이 대폭 추가된다.
훌륭한 생태계
커다란 생태계를 가지고 있고, 큰 기업들과 협력하여 사실상 클라우드 컨테이너 세계의 de facto
가 되었다. 로깅, 모니터링, 스토리지, 네트워크, 컨테이너 관리, 배포 등 다양한 분야에서 다양한 툴들이 존재하며 도커를 위한 OS 인 container linux 도 존재한다.
커뮤니티 지원
도커는 홍보와 커뮤니티 관리에 굉장히 신경을 쓰고 있다. 스티커나 티셔츠 등을 무료로 제공하며 필요하면 연사요청도 할 수 있다. 홈페이지에서 전세계에서 열리는 밋업 상황을 볼 수 있고 뉴스레터에서는 다양한 아티클을 볼 수 있다.
레퍼런스
'인프라 > 도커' 카테고리의 다른 글
하이퍼바이저 (Hypervisor) 란 무엇인가? (1) | 2024.02.04 |
---|---|
도커 실무 - Mariadb 를 사용하는 스프링부트 프로젝트 배포해보기 (0) | 2022.06.07 |
도커 명령어의 run -it 옵션은 어떤 의미일까? (0) | 2022.06.04 |
도커 자주 쓰이는 명령어 정리 (Docker Cheat Sheet) (0) | 2022.06.03 |
도커 소개 (Docker overview - get started 공식문서 번역) (0) | 2022.05.28 |