CI&CD/Docker

[Docker] 당신의 application을 dockerizing해야 하는 이유; Docker 알아보기

magae 2023. 6. 4. 00:09
반응형

도커(Docker)가 필요한 세상

소프트웨어 개발론에서 대두되는 개발방식은 애자일 방법론이다. 애자일(Agile)신속한 반복 작업을 통해 실제 작동 가능한 소프트웨어를 개발하여 지속적으로 제공하기 위한 소프트웨어 개발 방식을 말한다. 이는 고객의 피드백에 빠르게 반응할 수 있고, 시장 변화에 쉽게 적응할 수 있어 소프트웨어의 리스크를 쉽게 관리할 수 있다. 이런 '신속한 반복 작업'과 '지속적 제공'을 편리하게 자동화하기 위한 개발 방법이나 개발 도구를 CI(Continuous Integration; 지속적 통합)/CD(Continuous Delivery; 지속적 인도)라고 한다. Docker는 대표적인 CI/CD이다.

애자일 방법론을 표현한 다이어그램(이미지 출처)


가상화(Virtualize)와 컨테이너화(Containerize)

어플리케이션을 가상화(virtualize)하여 물리적 머신과 분리하고자 하는 기술은 이미 존재하여 많은 곳에서 사용되고 있는 개념이다. 가상화는 하이퍼바이저(hypervisor)라는 레이어를 통해 물리적 머신으로부터 분리하고, 이 레이어 위에 OS를 올리고, 다시 그 위에 어플리케이션을 작동시키는 기술을 말한다. 이를 가상 머신(virtual machine)이라고 하며, 각 머신들은 완전히 독립적으로 작동한다. 대표적으로 BlueStaks, VirtualBox 등이 있다.

BlueStacks은 모바일 OS을 가상화해주는 가상화 소프트웨어이다.

하지만, 가상화에게는 큰 단점이 있다. 하이퍼바이저 위에 깔리는 OS는 일반적인 물리 머신에 사용되는 OS를 그대로 이용한다.  따라서, 파일의 크기가 매우 크며(Windows 10 1511 (10586): 13.66GB, Linux: >= 4GB), 높은 자원을 소비한다.

도커의 컨테이너화(좌)와 가상화(우)

도커는 이를 도커 엔진(Docker Engine)이라는 소프트웨어를 통해 해결한다. 컨테이너 이미지(Container Image)를 작동시키면 컨테이너(Container)가 되며, 컨테이너들은 도커 엔진 위에 실행된다. 컨테이너 이미지는 여러 개의 레이어들로 이뤄져 있는데, 이들은 하나의 어플리케이션을 작동시키기 위한 의존성(dependency)을 만족시켜준다. 이는 리눅스 커널과 같이 OS의 일부분만으로 이뤄져도 상관없다. 따라서, 가상머신에 비해 가볍고, 빠르게 실행가능하다.


이미지(Image)와 컨테이너(Container)

이미지와 컨테이너는 OOP에서 클래스와 객체의 관계와 유사하다. 컨테이너 이미지, 즉 이미지(Image)는 여러 개의 레이어(layer)들을 스택(stack)처럼 쌓아놓은 무상태(stateless) 템플릿이다. 이용자가 Dockerfile을 통해 각 레이어들을 정의하고 빌드 요청을 보내면 도커 데몬 내의 빌더(builder)가 Dockerfile을 토대로 이미지를 빌드한다. 기본적으로 Dockerfile 내의 한줄이 하나의 레이어로 빌드된다. 또, 각 레이어들은 빌드되는 과정에서 캐시(cache)에 저장되는데, 이는 같은 의존성을 갖는 레이어가 빌드되는 경우에 재사용하기 위함이다.

이미지 빌드과정. Dockerfile의 한줄은 하나의 레이어로 빌드된다.


이미지는 햄버거에 비유하여 설명할 수 있다. 모든 햄버거는 번이라는 빵을 맨 밑에 두고, 그 위의 재료들은 메뉴에 따라 달라진다. 도커의 이미지 역시 베이스 이미지를 맨 밑에 두고, 그 위의 레이어들은 사용자가 원하는 대로 설정할 수 있다. 다만, 번 없이 햄버거를 만들 수 없듯 베이스 이미지를 설정하지 않고 이미지를 빌드할 순 없다. 베이스 이미지(Base Image)는 가장 기본이 되는 이미지로, 'OS', 'OS + 특정 프로그래밍 언어의 컴파일 도구', 'OS + 특정 소프트웨어' 등으로 다양하다. 대부분은 도커 공식 이미지로 제공되며, 이를 주로 이용한다.

도커 공식 이미지들. 단순 OS에서 DB까지 다양하다.


컨테이너(container)는 이미지의 인스턴스(instance)로, 도커 호스트에 의해 실행된다. 기본적으로 컨테이너는 독립적으로 실행되기 때문에 각 컨테이너를 하나의 온전한 어플리케이션이라고 생각할 수 있다. 뿐만 아니라, 도커 호스트에서 볼륨(volume)을 통해 파일을 공유하거나, 도커 호스트 내부의 로컬 네트워크를 통해 통신도 가능하다는 특징을 가진다.

도커 공식 로고


도커 아키텍처(Docker Architecture)

도커는 클라이언트-서버 구조로 설계됐다. CLI이나 도커 데스크탑을 통해 API 요청을 보내면, 도커 데몬(Docker Daemon)이 요청을 듣고 해당 요청을 수행한다. 도커 데몬이 일종의 서버 역할을 하고 있다.

도커 아키텍처

명령어 실행내용
docker run images내의 이미지를 컨테이너로 실행한다.
docker build images내의 이미지를 빌드한다. 해당하는 이미지가 없을 경우 registry 내에서 이미지를 찾아 pull한 뒤 빌드한다.
docker pull registry 내의 해당하는 이미지를 찾아 pull한다