# Docker

Docker 출처: Docker 홈페이지

# Docker란?

Docker란 컨테이너 기반의 오픈소스 가상화 플렛폼입니다.

Docker의 핵심은 경량화 가상화 컨테이너입니다. Docker를 활용하면 OS 및 개발, 테스트, 실행 환경을 모두 포함하여 하나의 컨테이너 형태로 배포가 가능합니다. 레거시 개발/테스트 환경에서는 OS 및 필요한 패키지들을 설치하고 소스를 별도로 배포해야 했으나, Docker 이후에는 그 모든 환경이 하나로 묶어서 통째로 배포가 가능합니다.

TIP

Docker는 기존에는 Linux 기반으로만 작동을 했는데, Docker팀과 마이크로소프트의 협업으로 Windows Core를 기반으로 현재 Docker를 이용한 Windows 가상화가 가능하고 이는 기존의 하이퍼바이저와는 구조가 다릅니다.

# 컨테이너

Container vs VM Container vs VM 출처

기존의 가상화 기술은 하이퍼바이저를 이용하여 Guest OS를 설치하고 그 위에 어플리케이션을 올리는 구조였습니다. Docker는 LXC(Linux Container)를 기반으로 OS를 마치 프로세스단위로 격리하여 사용합니다. LXC의 핵심은 Linux Kernel을 공유한다는 것입니다. 하이퍼바이저 방식은 반가상화이던 전가상화이던 커널을 공유하지 않고 이에 따른 오버헤드가 발생합니다. Docker의 컨테이너 기술은 커널을 공유함으로써 마치 하나의 운영체제에서 어플리케이션과 같은 형태로 가상화된 OS가 돌아갈 수 있게 되는 것입니다. Docker로 실행한 컨테이너는 거의 프로세스 수준으로 실행이 되기 때문에 단 1초만에 부팅이 될 정도로 엄청 빠르고 수백~수천개를 띄울 수도 있습니다.

# 이미지

Docker Image Docker Image 출처

Docker에서 이미지란 컨테이너를 구동시키기 위한 필요한 파일과 설정값 등을 저장한 것입니다. 이미지는 변하지 않고(Immutable) 상태를 가지지 않습니다(Stateless). 이미지는 단지 컨테이너의 구동할 때만 사용될 뿐, 실행 중에 변경된 내용은 컨테이너에 저장이 됩니다. 컨테이너 구동을 위한 스냅샷이라고 이해하셔도 됩니다.

Docker Image Layer Docker Image Layer 출처

Docker 이미지의 핵심은 레이어의 형태로 되어있다는 것입니다. 유니온 파일 시스템을 이용해 여러 개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해줍니다. 이미지는 여러 개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정될 때 새로운 레이어가 생성됩니다.

여러 이미지를 가지고 있다고 하여도 중복된 부분은 하나만 가지고 있어서 공간 효율적이고 확장이 좋습니다. 이런 확장성을 바탕으로 DockerHub에는 다양한 이미지들이 존재하고 80억이 넘는 다운로드가 이루어지고 있습니다.

# 시나리오

Docker를 처음 접하는 분들을 위해서 간단한 하나의 시나리오로 설명을 하겠습니다. Docker에 대한 설명은 실로 방대하여 이 포스팅에 다 담기가 힘듭니다. 공식 홈페이지를 참고 바랍니다.

Roy는 서버 100대를 관리합니다. 서비스를 하기 위해서 OS를 일일이 설치하고 그 위에 Apache와 Node.js를 설치하고 소스 코드를 다운로드하고 구동시킵니다. 이 같은 일을 100번 해야 합니다.

이번에 Apache를 NginX로 교체하기로 합니다. 소스 코드야 git등을 통해서 원격으로 쉽게 다운로드가 가능하지만, Apache나 Nginx 같은 환경에 대한 교체는 쉽지 않습니다. 일일이 100대의 머신에서 Apache를 제거하고 NginX를 설치해야 합니다. 만약 OS를 CentOS에서 Ubuntu로 교체한다고 한다면 일일이 모두 포멧하고 모든 과정을 반복해야 합니다.

Docker를 사용할 경우, CentOS + Apache + Node.js + Source 형식의 이미지를 하나만 준비하고 원격으로 한 번에 모두 배포 및 구동합니다. Apache가 Nginx로 교체된다면 CentOS + Nginx + Node.js + Source 의 형태로 이미지만 다시 제작하여 100대를 한 번에 배포한 후 컨테이너만 다시 가동시키면 됩니다. OS의 경우도 마찬가지입니다.

극단적으로 예를 들긴 한 것이지만 그 만큼 Docker를 활용하여 단순히 비즈니스 어플리케이션을 넘어서 환경 자체를 배포하기 쉽다는 것만 이해하시면 됩니다.

# Docker의 실무 활용

Docker의 활용도는 무궁무진 합니다. 다음은 주로 사용되는 몇 가지 예입니다.

# CI/CD

CI/CD는 무결성을 위하여 가급적 동일한 환경에서 실행을 해야 합니다. Docker의 이미지를 통해서 매번 고정된 깨끗한 환경에서 CI/CD를 실행할 수 있습니다.

# 개발/테스트

Docker를 통하여 아주 간단하고 빠르게 개발 및 테스트 환경을 구현할 수 있습니다. Docker 이미지를 통해서 다양한 환경에 대한 테스트 또한 가능합니다.

# 서비스 배포

특정 플렛폼에 종속적인 서비스를 배포하기 편리합니다. 특정 버전의 JAVA나 Python이 필요하다면 Docker에서 이미지에서 해당 버전을 고정하여 전체 환경 자체를 배포하면 됩니다.

# 마이크로 서비스

Docker 컨테이너 하나가 하나의 마이크로서비스로 구현이 가능합니다. 컨테이너라는 것이 OS와 환경, 소스를 포함한 모든 환경이기 때문에 하나의 서비스 자체가 될 수 있습니다.

# 정리

저희 팀에서는 Docker를 다양한 곳에 적극 활용합니다. Docker를 제대로 다루기 위해서는 Orchestration에 대해서 알아야 합니다. 주로 Kubernetes를 활용합니다.

Docker를 알고 모르고에 따라서 아키텍처의 영역이 달라집니다. 프론트앤드 개발자라고 해도 Docker를 활용하여 간단히 개발/테스트 환경을 구축할 수 있습니다. 꼭 풀스택 개발자가 아니라도 Docker와 Orchestration에 대해서 어느 정도 숙지하는 것을 추천드립니다.

Last Updated: 10/29/2020, 4:06:41 PM