Docker 이전의 개발 환경

  1. 종속성 문제:
    • 버전 충돌: 소프트웨어는 다양한 라이브러리 및 종속성에 의존합니다. 개발 환경이나 운영 환경에서 사용하는 종속성의 버전이 다를 경우, 애플리케이션의 동작이 달라질 수 있습니다. 이는 개발자에게 큰 골칫거리였으며, "환경이 다르면 버그가 발생할 수 있다"라는 문제로 이어졌습니다.
    • 복잡한 설정: 각 개발 환경에 맞추어 정확한 버전의 종속성을 설치하고 설정하는 과정이 복잡하고 시간이 많이 소요되었습니다. 특히, 프로젝트가 커질수록 이러한 문제는 더 심각해졌습니다.
  2. 확장성 부족:
    • 수작업 설치: 서버에 직접 소프트웨어를 설치하고 설정하는 과정이 필요했으며, 이는 인적 오류의 위험을 증가시켰습니다.
    • 자동화의 한계: 인프라의 자동화가 어려워 확장이 필요할 때마다 인스턴스를 수동으로 설정해야 했습니다.
  3. 비일관성:
    • 개발, 테스트, 운영 환경이 각각 다를 경우 환경 간의 비일관성으로 인해 오류가 발생할 가능성이 높았습니다. 이는 배포 시의 예측 가능성을 감소시켰습니다.

Docker란?

https://d1.awsstatic.com/acs/characters/Logos/Docker-Logo_Horizontel_279x131.b8a5c41e56b77706656d61080f6a0217a3ba356d.png

Docker

  • Docker는 애플리케이션을 쉽게 만들고, 테스트하고, 배포할 수 있게 도와주는 소프트웨어 플랫폼입니다.
  • 애플리케이션을 컨테이너라는 가볍고 이식성 있는 패키지로 실행할 수 있습니다.
  • Docker 이미지는 애플리케이션을 실행하는 데 필요한 모든 것(코드, 런타임, 시스템 도구, 시스템 라이브러리 등)을 포함합니다.

주요 특징

  • 컨테이너화: 애플리케이션과 그 종속성을 하나의 패키지로 묶어 어디서든 동일한 환경에서 실행할 수 있습니다.
  • 경량: Docker는 운영 체제의 커널을 공유하므로 가상 머신보다 훨씬 가볍고 빠르게 실행됩니다.
  • 이식성: Docker 컨테이너는 어디서든 동일하게 실행되므로 개발 환경, 테스트 서버, 운영 서버 간의 환경 차이를 제거합니다.
  • 확장성: 여러 개의 컨테이너를 효율적으로 관리하고 쉽게 확장할 수 있습니다.

주요 구성 요소 및 키워드

  • 이미지 (Image): 애플리케이션과 필요한 모든 파일을 포함하는 읽기 전용 템플릿으로, 컨테이너를 생성하는 데 사용됩니다.
  • 컨테이너 (Container): 이미지를 실행한 동적인 상태로, 애플리케이션이 실행되는 격리된 환경입니다. 하나의 시스템에서 여러 개의 컨테이너를 독립적으로 실행할 수 있습니다.
  • Dockerfile: 이미지를 생성하기 위한 스크립트 파일로, 이미지 빌드 과정을 자동화하고 일관성 있게 만듭니다.
  • Docker Hub: Docker 이미지를 저장하고 공유하는 중앙 저장소로, 다양한 공개 이미지를 다운로드하거나 자신만의 이미지를 업로드할 수 있습니다.
  • 볼륨 (Volume): 컨테이너의 데이터를 지속적으로 저장할 수 있는 메커니즘으로, 데이터를 컨테이너와 독립적으로 관리할 수 있습니다.
  • 네트워크 (Network): 컨테이너 간의 통신을 관리하는 방식입니다. Docker는 다양한 네트워크 설정을 지원합니다.

네트워크 종류

  • 브리지 네트워크 (Bridge Network): 기본 네트워크로, 동일한 브리지 네트워크에 연결된 컨테이너들이 서로 통신할 수 있도록 합니다. 단일 호스트에서 여러 컨테이너를 연결할 때 사용됩니다.
docker network create my-bridge-network
docker run -d --name container1 --network my-bridge-network nginx
docker run -d --name container2 --network my-bridge-network nginx
  • 호스트 네트워크 (Host Network): 컨테이너가 호스트의 네트워크 스택을 직접 사용하여 성능이 중요한 애플리케이션에 사용됩니다. 네트워크 격리가 없기 때문에 보안상의 주의가 필요합니다.
docker run -d --network host nginx​
  • 오버레이 네트워크 (Overlay Network): 여러 Docker 호스트에 걸쳐 있는 컨테이너를 연결할 때 사용되며, Swarm 모드나 Kubernetes와 같은 오케스트레이션 도구와 함께 사용됩니다. 클라우드 환경에서 분산 시스템을 구축할 때 유용합니다.

Docker와 가상 머신의 비교

Docker의 장점과 단점

https://www.redhat.com/rhdc/managed-files/virtualization-vs-containers.png

Docker의 장점

  • 빠른 시작 시간과 낮은 오버헤드: Docker 컨테이너는 운영 체제의 핵심 부분을 공유하여 애플리케이션만 실행하므로, 가상 머신보다 빠르게 시작할 수 있습니다.
  • 높은 이식성과 확장성: Docker 컨테이너는 한 번 만들면 어디서든지 동일하게 실행됩니다. 개발, 테스트, 운영 환경 모두에서 같은 방식으로 동작하며, 여러 컨테이너를 쉽게 추가하고 관리할 수 있어 애플리케이션을 확장하기 쉽습니다.

Docker의 단점

  • 보안 격리가 가상 머신보다 약함: 동일한 운영 체제 커널을 공유하므로 보안 격리 수준이 낮아, 하나의 컨테이너에서 보안 문제가 발생하면 다른 컨테이너에도 영향을 줄 가능성이 있습니다.
  • 운영 체제 종속성 존재: 리눅스 커널을 사용하여 작동하므로, 리눅스 운영 체제에서 가장 잘 동작합니다. 윈도우나 맥에서는 호환성 문제가 있을 수 있으며, 리눅스 커널을 에뮬레이션하는 방식으로 작동해야 해서 성능 저하가 있을 수 있습니다.

가상 머신(VM)의 장점과 단점

https://www.redhat.com/rhdc/managed-files/virtualization-vs-containers.png

 

가상 머신(VM)의 정의

  • 가상 머신(VM)은 하이퍼바이저를 통해 물리적 하드웨어 위에 가상화된 운영 체제를 실행하는 기술입니다. 하이퍼바이저는 여러 운영 체제를 동시에 실행할 수 있도록 물리적 하드웨어를 가상화하는 소프트웨어입니다.

가상 머신(VM)의 장점

  • 격리된 환경 제공: 각 가상 머신은 독립된 운영 체제를 실행하므로, 하나의 VM에서 문제가 발생해도 다른 VM이나 호스트 시스템에 영향을 주지 않습니다.
  • 다양한 운영 체제 실행 가능: 한 물리적 서버에서 여러 종류의 운영 체제를 동시에 실행할 수 있어, 개발자나 테스트 팀이 다양한 환경을 쉽게 구축하고 사용할 수 있습니다.

가상 머신(VM)의 단점

  • 오버헤드가 크고 느린 부팅 시간: 가상 머신은 전체 운영 체제를 실행해야 하므로, 많은 메모리와 CPU 자원을 소비하며, 부팅 시간이 오래 걸립니다.
  • 높은 리소스 소비: 여러 가상 머신을 실행하면 각기 독립된 운영 체제를 실행해야 하므로 메모리와 CPU 사용량이 크게 증가하여 컴퓨터의 성능을 저하시킬 수 있습니다.

Docker는 언제 사용할까?

일관된 개발 환경이 필요할 때

  • 개발, 테스트, 운영 환경이 다를 때 발생하는 문제를 피하고자 할 때 Docker를 사용하면 좋습니다. Docker를 사용하면 모든 환경에서 동일한 컨테이너를 실행할 수 있어, 환경 차이로 인한 문제를 줄일 수 있습니다
  • 애플리케이션을 빠르게 배포하고 싶을 때
    • Docker를 사용하면 애플리케이션을 빠르고 쉽게 배포할 수 있습니다. Docker 이미지를 빌드하고 이를 컨테이너로 실행하면, 필요한 모든 구성 요소가 포함되어 있어 별도의 설치 과정 없이 바로 실행할 수 있습니다.
  • 마이크로서비스 아키텍처를 도입할 때
    • Docker는 마이크로서비스 아키텍처와 잘 맞습니다. 각 서비스가 독립적으로 배포되고 실행될 수 있어, 여러 개의 컨테이너를 통해 다양한 서비스를 쉽게 관리할 수 있습니다
  • CI/CD 파이프라인을 구축할 때
    • Docker는 CI/CD 파이프라인에 적합합니다. 코드를 변경할 때마다 자동으로 빌드, 테스트, 배포할 수 있도록 설정할 수 있어, 개발 주기를 단축하고 배포의 신뢰성을 높일 수 있습니다.
  • 리소스 효율성을 높이고 싶을 때
    • Docker 컨테이너는 가상 머신보다 적은 리소스를 사용합니다. 운영 체제의 커널을 공유하므로, 더 많은 애플리케이션을 동일한 하드웨어에서 실행할 수 있습니다.
  • 애플리케이션 격리가 필요할 때:
    • 여러 애플리케이션을 독립적으로 실행하고자 할 때 Docker를 사용하면 각 컨테이너가 서로 격리되어 실행됩니다. 이를 통해 애플리케이션 간의 충돌을 방지하고 보안을 강화할 수 있습니다.
  • 쉽게 스케일링하고 싶을 때:
    • Docker를 사용하면 컨테이너 기반의 애플리케이션을 쉽게 확장할 수 있습니다. 필요한 만큼 컨테이너를 추가하여 수평 확장이 가능하며, 오케스트레이션 도구와 결합하여 자동 확장도 가능합니다.
  • 쿠버네티스(Kubernetes)와 함께 사용하고자 할 때
    • Docker는 쿠버네티스와 함께 사용하기에 매우 적합합니다. 쿠버네티스는 컨테이너 오케스트레이션 도구로, 다수의 Docker 컨테이너를 관리하고 자동 배포, 확장, 운영을 지원합니다. Docker 컨테이너를 쿠버네티스 클러스터에 배포하면, 애플리케이션의 가용성과 확장성을 높일 수 있습니다.

참고

  • 팀스파르타코딩클럽 프로젝트 관리 심화 강의자료