본문 바로가기

Backend study/Backend theory

Docker - Docker란?

도커(Docker)는 컨테이너 기반의 오픈 소스 플랫폼으로, 애플리케이션을 보다 효율적으로 배포, 실행 및 관리할 수 있게 해주는 도구이다. 도커는 가상화 기술을 사용하지만, 전통적인 가상머신(VM)과는 다르게 더 가볍고 빠른 방식으로 애플리케이션을 격리하고 실행할 수 있다. 오늘날 많은 개발자와 기업이 도커를 통해 애플리케이션의 배포 및 확장성을 향상시키고 있다.

도커의 주요 개념들

  1. 컨테이너(Container): 컨테이너는 애플리케이션과 그 애플리케이션이 동작하는데 필요한 라이브러리, 종속성 등을 모두 포함한 독립적인 실행 환경이다. 컨테이너는 호스트 운영체제의 커널을 공유하지만, 프로세스 격리, 네트워크 격리 등을 통해 애플리케이션 간의 충돌 없이 독립적으로 실행할 수 있다. 이를 통해 하나의 서버에서 여러 컨테이너를 동시에 실행해도 성능 저하 없이 안전하게 구동할 수 있다.
  2. 이미지(Image): 도커 이미지는 컨테이너를 실행하기 위한 템플릿이다. 이미지에는 애플리케이션의 실행에 필요한 파일 시스템과 설정 정보가 포함되어 있으며, 이미지는 불변(immutable)하다. 즉, 한 번 생성된 이미지는 변경되지 않으며, 새로운 버전을 만들고자 할 경우 기존 이미지에 레이어(Layer)를 추가하여 관리한다. 이러한 레이어 구조는 이미지를 효율적으로 저장하고, 중복된 파일을 공유함으로써 저장소를 절약하는 데 기여한다.
  3. 도커파일(Dockerfile): 도커 이미지를 빌드하는 데 사용되는 스크립트 파일이다. Dockerfile에는 애플리케이션을 어떻게 구성할지, 어떤 라이브러리를 설치할지, 어떤 명령을 실행할지 등이 명시되어 있다. Dockerfile을 통해 이미지를 자동으로 생성할 수 있으며, 이를 통해 개발 환경의 일관성을 유지할 수 있다.
  4. 도커 허브(Docker Hub): 도커 이미지를 저장하고 공유할 수 있는 퍼블릭 레지스트리이다. 사용자들은 도커 허브에서 다양한 이미지를 다운로드하여 사용할 수 있고, 자신만의 이미지를 업로드할 수도 있다. 이외에도 개인 레지스트리를 설정하여 비공개 이미지를 관리할 수도 있다.

 

도커의 배경: 컨테이너화와 가상화의 차이

1. 가상머신(Virtual Machine):

가상머신(VM)은 물리적인 서버의 자원을 논리적으로 분리하여 여러 운영체제(OS)를 실행할 수 있게 한다. VM은 각자 자신의 OS를 포함하고 있어 완전히 격리된 환경을 제공한다. 그러나 이 격리를 위해 각 VM마다 별도의 OS를 실행하기 때문에 리소스 사용이 많고, 시작 속도도 느리다.

2. 컨테이너(Container):

컨테이너는 VM과 유사하게 애플리케이션을 격리하지만, 운영체제 커널을 공유한다. 각각의 컨테이너는 자신만의 파일 시스템, 네트워크 인터페이스, 프로세스를 가지지만, 호스트 커널을 공유하여 훨씬 가볍고 빠르게 실행된다. 이로 인해 리소스 사용이 적고 애플리케이션의 시작 속도가 매우 빠르다.

도커는 이러한 컨테이너화 기술을 기반으로 하며, 컨테이너의 작동을 쉽게 관리할 수 있게 해주는 도구이다. 도커가 등장하기 전에도 컨테이너 기술은 존재했지만, 도커는 이를 사용자 친화적으로 만들고, 배포 및 관리 시스템을 표준화하는 데 기여했다.

 

도커의 아키텍처

도커의 아키텍처는 크게 도커 클라이언트(Client), 도커 데몬(Daemon), 이미지(Image), 컨테이너(Container), 도커 레지스트리(Registry)로 구성된다.

  1. 도커 클라이언트 (Docker Client): 사용자가 도커 명령어를 통해 도커 데몬에 명령을 전달하는 인터페이스이다. 클라이언트는 주로 docker 명령어를 사용하여 도커 데몬과 상호작용하며, 도커 이미지를 빌드하거나 컨테이너를 실행하는 등의 작업을 처리한다.
  2. 예: docker run, docker build, docker stop 등.
  3. 도커 데몬 (Docker Daemon): 실제로 컨테이너를 실행하고 관리하는 백그라운드 프로세스이다. 도커 데몬은 클라이언트로부터 명령을 받아들이고, 컨테이너의 수명 주기를 관리한다. 또한 이미지를 관리하고, 네트워크 설정을 처리하며, 로컬 및 원격 레지스트리에서 이미지를 다운받아 컨테이너로 변환하는 역할을 한다.
  4. 이미지 (Image): 도커 이미지는 컨테이너의 불변(immutable) 스냅샷이다. 이미지에는 애플리케이션이 실행되기 위해 필요한 모든 파일, 라이브러리, 설정 등이 포함되어 있다. 이미지는 레이어(Layer)로 구성되어 있고, 여러 레이어를 중첩하여 효율적으로 저장 및 관리된다. 한 이미지에서 수정이 발생하면 새로운 레이어가 추가되고, 변경되지 않은 기존 레이어는 재사용된다.
  5. 컨테이너 (Container): 컨테이너는 이미지를 실행하여 만들어진 인스턴스이다. 이미지가 컨테이너의 템플릿 역할을 하며, 컨테이너는 독립적으로 실행되는 애플리케이션 환경을 제공한다. 컨테이너는 애플리케이션을 다른 프로세스와 분리된 독립된 환경에서 실행시키며, 필요에 따라 쉽게 시작, 중지, 삭제할 수 있다.
  6. 도커 레지스트리 (Docker Registry): 도커 이미지를 저장하고 배포하는 저장소이다. 도커 허브(Docker Hub)는 가장 많이 사용되는 퍼블릭 도커 레지스트리로, 여기에서 수천 개의 공개 도커 이미지를 다운받아 사용할 수 있다. 또한 개인 레지스트리를 설정하여 자신만의 이미지를 관리할 수도 있다.

 

도커 네트워크 및 저장소

  1. 도커 네트워크: 도커는 컨테이너 간 통신을 위해 다양한 네트워크 드라이버를 제공한다. 기본적으로 사용되는 네트워크 모드는 다음과 같다.
    • bridge: 기본 네트워크 모드로, 컨테이너 간 통신을 허용하면서도 외부와는 격리된 환경을 제공한다. 브리지 네트워크는 독립된 컨테이너 네트워크를 구축할 때 유용하다.
    • host: 컨테이너가 호스트와 동일한 네트워크 스택을 공유한다. 이 모드는 성능 최적화가 중요한 상황에서 사용된다.
    • none: 네트워크가 완전히 격리된 상태로, 컨테이너는 네트워크 인터페이스 없이 실행됩니다.
  2. 도커 볼륨 (Volume): 도커 컨테이너는 기본적으로 임시 파일 시스템에서 실행되며, 컨테이너가 종료되면 모든 데이터가 삭제된다. 그러나 볼륨을 사용하면 지속적인 데이터를 저장할 수 있다. 볼륨은 호스트 시스템에 저장되어 컨테이너가 재시작되더라도 데이터가 유지된다. 또한, 바인드 마운트(bind mount)를 사용하면 호스트의 특정 디렉토리를 컨테이너에 연결할 수도 있는데, 볼륨은 바인드 마운트보다 더 안전하고 관리하기 쉽다.

 

도커 오케스트레이션

도커는 단일 컨테이너만 관리하는 것이 아니라, 수백 수천 개의 컨테이너를 효율적으로 관리하고 배포할 수 있는 오케스트레이션 도구와 함께 사용된다. 대표적인 도구가 쿠버네티스(Kubernetes)도커 스웜(Docker Swarm)이다.

  1. 도커 스웜 (Docker Swarm): 도커에서 제공하는 자체 오케스트레이션 도구로, 여러 도커 엔진을 클러스터로 묶어 하나의 논리적인 도커 엔진처럼 동작하게 한다. 스웜 모드는 여러 컨테이너를 자동으로 배포하고 관리하며, 부하 분산 기능도 제공한다. 도커 스웜은 설정이 간단하고, 작은 규모의 클러스터에 적합한 오케스트레이션 도구다.
  2. 쿠버네티스 (Kubernetes): 쿠버네티스는 구글에서 개발한 컨테이너 오케스트레이션 도구로, 대규모 컨테이너 기반 애플리케이션을 관리하고 배포하는 데 최적화되어 있다. 쿠버네티스는 자동 스케일링, 롤링 업데이트, 자동 복구 등의 기능을 제공하여 복잡한 컨테이너 배포를 간소화한다. 대규모 클러스터에서 확장성과 복잡한 배포 전략을 관리할 수 있는 강력한 오케스트레이션 도구이다.

 

도커의 주요 이점

  • 경량화: 도커 컨테이너는 가상 머신에 비해 훨씬 가볍고 빠르다. VM은 운영체제(OS) 전체를 가상화하지만, 도커는 호스트 OS의 커널을 공유하여 리소스 사용을 최소화한다.
  • 이식성(Portability): 도커 이미지는 어디서나 실행될 수 있다. 로컬 개발 환경에서 구축한 도커 이미지를 그대로 테스트 환경, 프로덕션 환경 등으로 옮길 수 있어 일관된 배포가 가능하다.
  • 효율적인 리소스 사용: 여러 컨테이너가 동일한 호스트에서 실행되면서도 각기 격리된 환경을 제공하므로, 리소스 사용이 최적화된다.
  • 빠른 배포: 이미지를 기반으로 컨테이너를 실행하기 때문에 빠르게 애플리케이션을 배포하고 시작할 수 있다. 이미지를 미리 빌드해 두면 새로운 환경에서도 몇 초 만에 애플리케이션을 실행할 수 있다.

도커 사용 예시

# 도커 이미지 실행 (예: nginx 웹 서버)
docker run -d -p 80:80 --name mynginx nginx

위 명령어는 nginx라는 이름의 이미지를 다운로드한 후, 80번 포트에서 실행되는 mynginx라는 이름의 컨테이너를 백그라운드에서 실행하는 예시이다.

 

도커는 애플리케이션의 배포와 관리를 간소화하는 강력한 도구로, 컨테이너화 기술을 통해 빠르고 가벼운 애플리케이션 실행 환경을 제공한다. 가상머신보다 효율적인 리소스 사용과 빠른 시작 속도를 자랑하며, 쿠버네티스와 같은 오케스트레이션 도구와 결합해 대규모 시스템에서도 유연하게 활용될 수 있다. 도커는 개발자에게 일관된 환경을 제공하며, 운영자에게는 신속하고 안정적인 배포를 가능하게 해준다.

 

728x90

'Backend study > Backend theory' 카테고리의 다른 글

컨테이너 오케스트레이션  (3) 2024.09.06
Docker - Docker Compose  (0) 2024.09.06
CI/CD  (3) 2024.09.03
웹 애플리케이션 아키텍처  (1) 2024.09.03
가상화와 컨테이너  (4) 2024.09.03