Docker는 무엇인가
in Web-Programming on MSA
Docker
Dock은 사전적인 언어로 부두란 뜻이다. 부두라는 이미지를 떠올려 보자. 부둣가 항구엔 바다가 있고, 그 바다에서 넘어온 배들이 있고, 그 배들이 컨테이너를 통해 물건을 선적하는 이미지가 떠오른다. 그런 이미지를 컴퓨터내에서 하는 사람들, 즉 Dock + er 를 합친게 바로 Docker인 것이다.
그래서 개발 개념에서 본 Docker의 개념은 애플리케이션을 쉽게 만들고, 테스트하고, 배포할 수 있게 도와주는 소프트웨어 플랫폼이다. 즉 애플리케이션을 컨테이너라는 가볍고 이식성 있는 패키지로 실행시켜 주는 플랫폼인 것이다. 애플리케이션을 실행하는 데 필요한 모든 것(코드, 런타임, 시스템 도구, 시스템 라이브러리 등)을 포함한 것이 컨테이너 내 실행이 되고 이를 Docker 이미지라 한다.
Docker의 특징
- 컨테이너화: 애플리케이션과 필요한 모든 것을 한 패키지로 묶어 어디서든 실행 가능하다.
- 경량화: Docker는 운영 체제의 커널을 공유, 가상 머신보다 훨씬 가볍고 빠르게 실행가능 하다.
- 이식성: Docker 컨테이너는 어디서든 동일하게 실행된다. (개발자의 컴퓨터에서 테스트 서버, 운영 서버까지 동일하게 동작)
- 확장성: Docker를 사용시 여러 개의 컨테이너를 효율적으로 관리하고 쉽게 확장 가능하다.
Docker의 필요성 대두
Docker이전에 우리는 어떻게 프로그램을 배포하고 실행하였을까? 일일히 배포 환경에 맞춰서 OS에 맞게 따로 개발을 해왔다. 그러다 VM 가상 환경이 탄생하였지만, VM으로 배포하기엔 OS를 포함해야했기멩 무겁고 느리게 개발되고 배포가 되었다. 그래서 나온게 바로 2013년에 Solomon Hykes가 dotCloud라는 PaaS(Platform as a Service) 회사에서 개발한 기술인 Docker인 것이다. 한 번 빌드하면 어디서든 실행할 수 있는 솔루션인 것이다. 앞서 Docker의 특징으로 컨테이너화하여 컨테이너 내부에 애플리케이션과 필수 라이브러리만 포함하고 운영체제 커널을 공유함으로써 보다 빠르고 효율적인 배포가 가능한 경량화를 가지고 있다. 위 둘의 특징을 기반으로 컨테이너가 언제 어디서든지 동일하게 실행될 수 있는 이식성을 가지고 있으며, 여러 개 컨테이너로 확장 가능한 확장성을 가지고 있다.
그래서 언제 써먹어?
Docker의 특징에 따른 사용처는 다음과 같다.
- 일관된 개발 환경이 필요할 때
- 개발, 테스트, 운영 환경이 다를 때 발생하는 문제를 피하고자 할 때
- Docker를 사용하면 모든 환경에서 동일한 컨테이너를 실행할 수 있어, 환경 차이로 인한 문제 감소
- 애플리케이션을 빠르게 배포하고 싶을 때
- 애플리케이션을 빠르고 쉽게 배포 가능. Docker 이미지를 빌드하고 이를 컨테이너로 실행하면, 필요한 모든 구성 요소가 포함되어 있어 별도의 설치 과정 없이 바로 실행 가능.
- 마이크로서비스 아키텍처를 도입할 때
- 각 서비스가 독립적으로 배포되고 실행 가능, 여러 개의 컨테이너를 통해 다양한 서비스를 쉽게 관리 가능
- CI/CD 파이프라인을 구축할 때
- 코드를 변경할 때마다 자동으로 빌드, 테스트, 배포할 수 있도록 설정 가능
- 개발 주기를 단축 / 배포의 신뢰성 증대
- 리소스 효율성을 높이고 싶을 때
- 가상 머신보다 적은 리소스를 사용. 운영 체제의 커널을 공유하므로, 더 많은 애플리케이션을 동일한 하드웨어에서 실행 가능
- 애플리케이션 격리가 필요할 때:
- 각 컨테이너가 서로 격리되어 실행
- 애플리케이션 간의 충돌 방지 및 보안 강화
- 쉽게 스케일링하고 싶을 때:
- 컨테이너 기반의 애플리케이션을 쉽게 확장 가능.
- 필요한 만큼 컨테이너를 추가하여 수평 확장이 가능, 오케스트레이션 도구와 결합하여 자동 확장도 가능
- 쿠버네티스(Kubernetes)와 함께 사용하고자 할 때
- 쿠버네티스는 컨테이너 오케스트레이션 도구
- 다수의 Docker 컨테이너를 관리하고 자동 배포, 확장, 운영을 지원
- Docker 컨테이너를 쿠버네티스 클러스터에 배포시, 애플리케이션의 가용성과 확장성 증가