Docker란 무엇일까? 개발자라면 도커를 사용해보진 않았더라도 한 번쯤은 들어봤을 것이다. 많은 개발자들이 이미 도커를 사용하고 있고, 심지어 채용 우대사항에서도 Docker라는 이름을 심심치 않게 볼 수 있다. 대체 Docker란 무엇이기에 이렇게 많은 사람들이 열광하고 사용되고 있는 것일까? 이번 포스팅은 Docker의 간략한 역사와, 필요성, 그리고 그로 인해 달라진 우리의 개발환경에 관하여 이야기해보도록 하겠다.
Docker의 역사
Docker는 2013년 3월 산타클라라에서 열린 Pycon에서 Solomon Hykes가 The future of Linux Ciontainers(리눅스 컨테이너의 미래)라는 제목으로 세션을 발표하면서 세상에 알려졌다.
※ 발표자료: Youtube
영상을 보면 Solomon님이 단지 HelloWorld를 화면에 출력한 것뿐인데 많은 사람들이 열광한다. 무엇 때문에 사람들은 단지 HelloWorld를 보고 이렇게 열광하는 것일까? 그도 그럴것이 화면에 출력된 HelloWorld는 단지 몇 초의 시간만에 새로운 운영체제를 생성하고 그 운영체제에서 출력된 HelloWorld이기 때문이다. 이러한 영상에서도 알 수 있듯 Docker는 쉽게 말하면 컨테이너 기반의 가상화 플랫폼이라고 할 수 있다.
컨테이너는 독립된 공간에서 프로세스들이 운영되는 환경이다. Solomon님의 세션 제목에서도 알 수 있듯이, Container 기술은 Linux에서 이전에도 사용되고 있던 기술이었다. 다만 설정이 매우 복잡했고, 사용하기 어려웠기 때문에 많은 사람들이 사용하지 않았다. 하지만 Docker가 출시되고 단 몇 초 만에 새로운 운영체제를 생성하고 서비스를 배포할 수 있게 되면서 개발자들이 실질적으로 사용할 수 있는 편리성의 위치까지 해당 기술의 눈높이를 낮춘 것이다.
Virtual Machine과 Docker
우리는 흔히 가상화 기술을 떠올리면 VMware나 VirtualBox와 같은 가상 머신을 떠올린다. (window에서 linux를 OS를 사용할 때 많이들 사용해 보았을 것으로 생각된다.) 가상 머신은 Docker container와 비교했을 때 내부적으로 큰 차이가 있다. VM(가상 머신)은 응용 프로그램 소프트웨어, 종속성 및 게스트 OS가 포함되어 있다. 즉 배포할 각 애플리케이션 스택마다 별도의 VM과 게스트 OS가 필요하고, 이것은 이러한 것들은 곧 성능의 문제와 직결된다.
이와 비교해 Linux위에서의 Docker는 Host Linux의 시스템을 사용하고 프로세스 격리를 통해 응용 프로그램 및 종속성을 모듈 식 Container로 패키지 한다. 이로 인해 VM이 필요하지 않으며 App1과 App2의 OS 리소스는 서로 공유된다. 이로 인해 CPU나 Memory를 딱 필요한 만큼만 할당하게 되고 성능의 손실이 거의 발생하지 않는다.
마지막으로 Linux가 아닌 시스템에서의 Docker는 Docker가 동작하기 위한 미니 Linux가 포함된 경량 VM이 필요하다. VM과 비교하여 컨테이너의 수와 관계없이 단일 VM 및 Guest Linux System만을 필요하다는 장점이 있다.
하나의 서버에 여러 개의 컨테이너가 실행됨에도 서로 성능에 영향을 끼치지 않고 독립적으로 실행되며 새로운 컨테이너를 생성하는데 고작 1-2초 밖에 걸리지 않는다는 것이 도커의 가장 큰 매력이다.
Image 개념
이미지는 컨테이너를 정의하는 읽지 전용 템플릿으로 컨테이너가 실행되기에 필요한 라이브러리 및 종속성에 대한 정의가 포함되어 있다. 하나의 이미지에 여러개의 컨테이너가 생성될 수 있고, 컨테이너의 상태가 변하더라도 이미지는 변하지 않으며 추가적으로 변화된 값은 컨테이너에 저장된다.
컨테이너는 인스턴스화된(실행된) Docker의 이미지이다. 만약 우리가 서버를 확장해야 할 경우가 생긴다면 기존처럼 새롭게 서버를 만들고 그 안에 필요한 설정을 새롭게 할 필요 없이. Image를 생성하고 Container를 생성하기만 하면 된다. (Image는 Container가 실행되기 위한 모든 정보를 포함하고 있기 때문)
Docker를 사용해야 하는 이유
Docker를 사용하면 더 빨리 독립적인 코드를 전달할 수 있다. 또한 어플리에키연 운영을 표준화할 수 있어서 리소스 재사용률을 높여 비용을 절감할 수 있다. Docker는 간단한 구문만으로 어디에서나 안정적으로 실행될 수 있는 단일 객체이기 때문에 애플리케이션 배포의 신뢰성 또한 확보할 수 있다. 또한 컨테이너 각각을 Microservice로 사용하여 배포하는 형태로 손쉽게 마이크로서비스 아키텍처를 구축하고 실행할 수 있기 때문에 다양한 Cloud 서비스에서도 Docker의 사용을 적극 권장하고 있다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] docker-compose: 멀티 컨테이너를 손쉽게 배포하기 (0) | 2020.07.08 |
---|---|
[Docker] Docker Network를 이용하여 네트워크 공유하기 (0) | 2020.01.31 |
[Docker] Docker Tutorial (3) : 생성한 이미지 AWS에 배포하기 (2) | 2019.12.09 |
[Docker] Docker Tutorial (2) : 직접 이미지 만들기 (0) | 2019.12.09 |
[Docker] Docker Tutorial (1) : 기본적인 사용법 (0) | 2019.12.08 |