Docker(도커) 란?
도커는 컨테이너 기반 오픈소스 가상화 플랫폼이다.
컨테이너라 하면 배에 실는 네모난 화물 수송용 박스를 생각할 수 있는데 각각의 컨테이너 안에는 옷, 신발, 전자제품, 술, 과일등 다양한 화물을 넣을 수 있고 규격화되어 컨테이너선이나 트레일러등 다양한 운송수단으로 쉽게 옮길 수 있다.
서버에서 이야기하는 컨테이너도 이와 비슷한데 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다. 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립PC, AWS, Azure, Google cloud등 어디에서든 실행할 수 있다.
컨테이너를 가장 잘 사용하고 있는 기업은 구글인데 2014년 발표 에 따르면 구글은 모든 서비스들이 컨테이너로 동작하고 매주 20억 개의 컨테이너를 구동 한다고 한다.
Virtual Machine(가상머신)
호스트 운영체제 위에서 가상의 하드웨어를 서비스 하는 것
가상의 하드웨어에 게스트 운영체제 설치 후 사용하며, Hypervisor는 가상머신을 생성하고 컴퓨터 자원을 가상머신에게 배분하여 구동하는 프로그램이다.
장점으로는 호스트 운영체제와 게스트 운영체제의 완전한 분리가 된다. 즉, 호스트 운영체제와 게스트 운영체제가 달라도 가능하다는 이야기이다.
단점으로는 완전한 운영체제가 설치되기 때문에 대량의 메모리가 필요하다. 따라서 CPU 자원확보가 어렵다. 소프트웨어 개발과 시스템 운영에 대한 이해를 필요로하고, 운영체제를 업데이트할 경우 호스트와 개별의 게스트 운영체제를 개별적으로 패치하는 번거로움이 있다.
CONTAINERS 란?
컨테이너는 격리된 공간에서 프로세스가 동작하는 기술이다. 기존의 가상화 방식은 주로 OS를 가상화 했다. VM(Virtual Machine)은 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식이다. 이 방식은 여러가지 OS를 가상화할 수 있고 비교적 사용법이 간단하지만 무겁고 느리다.
이러한 상황을 개선하기 위해 CPU의 가상화 기술 (HVM -Hardware-assisted Vitrual Machine)을 이용한 KVM(Kernel-based Virtual Machine)과 반가상화(Paravirtualization) 방식의 Xen이 등장한다. 이러한 방식은 게스트 OS가 필요하긴 하지만 전체 OS를 가상화하는 방식이 아니었기 때문에 호스트형 가상화 방식에 비해 성능이 향상되었다.
전가상화든 반가상화든 추가적인 OS를 설치하여 가상화하는 방법은 어쨋든 성능문제가 있었고 이를 개선하기 위해 프로세스를 격리 하는 방식이 등장한다.
리눅스에서는 이 방식을 리눅스 컨테이너라고 하고 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작한다. CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로도 거의 없다.
장점으로는 부팅이 빠르다. 운영체제라는 개념 없이 프로세스를 띄우는 정도를 수행하기 때문이다. 그리고 호스트 커널을 공유하기 때문에 운영체제를 설치할 필요가 없어 메모리를 적게 사용한다.
단점으로는 가상머신과는 다르게 하드웨어를 직접 제어할 수 없어 자원 격리와 쿼터 제한의 어려움이 있다. 그리고 호스트 운영체제의 커널을 공유하기 때문에 호스트 운영체제의 환경을 그대로 가져간다. 따라서 리눅스에 컨테이너를 띄워 윈도우 환경을 만들 수 없다.
Image
도커에서 가장 중요한 개념은 컨테이너와 함께 이미지라는 개념이다.
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다(Immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있는다.
ubuntu이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고 MySQL이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보등을 가지고 있다. 좀 더 복잡한 예로 Gitlab 이미지는 centos를 기반으로 ruby, go, database, redis, gitlab source, nginx등을 가지고 있다.
말그대로 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다. 이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 된다. 한 서버에 여러개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천대의 서버도 문제없다.
subicura.com/2017/01/19/docker-guide-for-beginners-1.html