초보자를 위한 Docker 아키텍처 및 구성 요소

도커의 구조와 핵심 요소들을 자세히 살펴보겠습니다.

도커에 대한 기본적인 지식이 있다는 전제하에 설명합니다. 만약 도커에 익숙하지 않으시다면, 이전 글을 참고해 주시면 도움이 될 것입니다.

도커가 DevOps 환경에서 얼마나 중요한 역할을 하는지 이미 알고 계실 것이라 생각합니다. 이 강력한 도구의 기반에는 정교하고 세밀하게 설계된 아키텍처가 존재합니다. 그렇지 않나요?

이 아키텍처를 논하기 전에, 먼저 기존의 가상화 시스템과 현재의 가상화 시스템을 비교해 보겠습니다.

기존 가상화 방식과 차세대 가상화 방식

과거에는 가상 머신(VM)을 만들 때, 각 VM마다 독립된 운영체제(OS)를 포함시켜야 했기 때문에 용량이 크고 무거웠습니다.

하지만 도커 컨테이너를 사용하면 단일 OS를 공유하며, 컨테이너 간에 리소스를 공유하므로 가볍고 빠른 속도로 부팅이 가능합니다.

도커 아키텍처 개요

다음은 도커 아키텍처의 간략한 구조도입니다.

이제 도커 아키텍처를 구성하는 핵심 요소들을 설명해 드리겠습니다.

도커 엔진

도커 시스템 전체의 핵심적인 부분입니다. 도커 엔진은 클라이언트-서버 구조를 따르는 응용 프로그램으로, 호스트 시스템에 설치됩니다. 도커 엔진은 세 가지 주요 구성 요소로 이루어져 있습니다.

  • 서버: ‘dockerd’라는 이름의 도커 데몬으로, 도커 이미지 생성 및 관리, 컨테이너 관리, 네트워크 관리 등의 역할을 수행합니다.
  • Rest API: 도커 데몬에게 수행할 작업을 지시하는 데 사용되는 인터페이스입니다.
  • CLI (명령줄 인터페이스): 도커 명령을 입력하는 데 사용하는 클라이언트입니다.

도커 클라이언트

도커 사용자는 클라이언트를 통해 도커와 상호작용합니다. 도커 명령이 실행되면 클라이언트는 해당 명령을 ‘dockerd’ 데몬에게 전달하고, 데몬이 작업을 수행합니다. 도커 API는 도커 명령에서 활용됩니다. 도커 클라이언트는 하나 이상의 데몬과 통신할 수 있습니다.

도커 레지스트리

도커 이미지가 저장되는 장소입니다. 공용 도커 레지스트리 또는 개인 도커 레지스트리가 될 수 있습니다. Docker Hub는 도커 이미지의 기본 위치이자 공용 레지스트리입니다. 사용자는 자신만의 개인 레지스트리를 구축하여 운영할 수도 있습니다.

‘docker pull’ 또는 ‘docker run’ 명령을 실행하면, 설정된 레지스트리에서 필요한 도커 이미지를 가져옵니다. 반대로 ‘docker push’ 명령을 실행하면 도커 이미지가 설정된 레지스트리에 저장됩니다.

도커 객체

도커를 사용할 때 이미지, 컨테이너, 볼륨, 네트워크 등을 다루게 되는데, 이 모든 것들을 도커 객체라고 합니다.

이미지

도커 이미지는 도커 컨테이너를 생성하기 위한 지침이 포함된 읽기 전용 템플릿입니다. Docker Hub에서 이미지를 가져와 그대로 사용하거나, 기본 이미지에 추가 지침을 더하여 수정된 새로운 도커 이미지를 생성할 수 있습니다. 또한, Dockerfile을 사용하여 고유한 도커 이미지를 만들 수도 있습니다. 컨테이너를 만들고 실행하는 데 필요한 모든 지침이 Dockerfile에 담겨 있으며, 이를 통해 사용자 정의 도커 이미지를 생성할 수 있습니다.

도커 이미지는 읽기 전용인 기본 레이어를 가지며, 최상위 레이어는 쓰기 가능합니다. Dockerfile을 편집하고 이미지를 다시 빌드할 때, 수정된 부분만 최상위 레이어에서 다시 빌드됩니다.

컨테이너

도커 이미지를 실행하면 도커 컨테이너가 생성됩니다. 컨테이너 내에서 모든 응용 프로그램과 해당 환경이 실행됩니다. 도커 API 또는 CLI를 사용하여 도커 컨테이너를 시작, 중지 및 삭제할 수 있습니다.

다음은 우분투 도커 컨테이너를 실행하는 예시 명령입니다.

docker run -i -t ubuntu /bin/bash

볼륨

도커에서 생성되어 컨테이너에서 사용되는 영구 데이터는 볼륨에 저장됩니다. 볼륨은 도커 CLI 또는 도커 API를 통해 도커가 완전히 관리하며, Windows 및 Linux 컨테이너 모두에서 작동합니다. 컨테이너의 쓰기 가능 레이어에 데이터를 유지하는 것보다 볼륨을 사용하는 것이 더 좋습니다. 볼륨은 컨테이너의 수명 주기에 영향을 받지 않기 때문에, 볼륨을 사용해도 컨테이너 크기가 증가하지 않습니다.

‘-v’ 또는 ‘–mount’ 플래그를 사용하여 볼륨이 포함된 컨테이너를 시작할 수 있습니다. 아래 명령에서는 ‘koreantech.org’ 컨테이너와 함께 ‘geekvolume’ 볼륨을 사용하는 예시를 보여줍니다.

docker run -d --name koreantech.org -v geekvolume:/app nginx:latest

네트워크

도커 네트워킹은 격리된 컨테이너들이 서로 통신할 수 있는 통로입니다. 도커는 주로 다섯 가지 네트워크 드라이버를 제공합니다.

  • Bridge: 컨테이너의 기본 네트워크 드라이버입니다. 동일한 도커 호스트에서 실행되는 독립형 컨테이너 또는 여러 컨테이너가 서로 통신할 때 사용됩니다.
  • Host: 이 드라이버는 도커 컨테이너와 도커 호스트 사이의 네트워크 격리를 제거합니다. 호스트와 컨테이너 간에 네트워크 격리가 필요하지 않은 경우에 사용됩니다.
  • Overlay: 이 네트워크를 통해 스웜 서비스들이 서로 통신할 수 있습니다. 컨테이너가 여러 도커 호스트에서 실행 중이거나, 스웜 서비스가 여러 애플리케이션으로 구성될 때 사용됩니다.
  • None: 이 드라이버는 모든 네트워킹을 비활성화합니다.
  • Macvlan: 이 드라이버는 컨테이너에 MAC 주소를 할당하여 컨테이너가 마치 물리적 장치처럼 보이게 합니다. 트래픽은 MAC 주소를 통해 컨테이너 간에 라우팅됩니다. VM 설정을 마이그레이션하는 등 컨테이너를 물리적 장치처럼 보이게 해야 할 때 유용합니다.

결론

이 글이 도커 아키텍처와 핵심 구성 요소에 대한 이해를 높이는 데 도움이 되었기를 바랍니다. 도커에 대해 더 깊이 탐구하고 싶으시거나, 실습 교육에 관심 있으시다면, 도커 마스터리 코스를 살펴보세요.

재미있게 읽으셨나요? 이 글을 다른 사람들과 공유해 주시는 건 어떠신가요?