오늘은 Docker에 대해서 이야기해보도록 하겠습니다. 저는 기존에 Conda 가상환경을 사용헀었는데요, 비슷한 듯 다른 두 개념을 비교하면서 이야기해보겠습니다.

What is Docker?

Docker는 컨테이너 기술을 사용하여 애플리케이션을 격리된 환경에서 실행하고 배포할 수 있는 플랫폼입니다. 이를 통해 개발자와 운영자는 동일한 환경에서 애플리케이션을 실행할 수 있어서 한 번 빌드하고 어디서든 실행 이라는 철학을 실현할 수 있습니다.

What is Container

두괄식으로 요약하자면 컨테이너는 애플리케이션과 해당 애플리케이션을 실행하는 데 필요한 모든 것을 포함한 경량 가상 환경입니다.

먼저 가상머신(Virtual Machine, VM)을 알아야 하는데요. VM은 하나의 서버를 여러 서버로 바꾸는 물리적 하드웨어의 추상화입니다. 각 VM에는 운영체제, 애플리케이션, 필요한 바이너리 및 라이브러리의 전체 사본이 포함되어 수십 GB를 차지합니다. 하이퍼바이저를 사용하면 여러 VM이 단일 머신에서 실행될 수 있습니다.

컨테이너는 코드와 종속성을 함게 패키징하는 앱 계층의 추상화입니다. 여러 컨테이너가 동일한 머신에서 실행되고 다른 컨테이너와 OS 커늘을 공유하며, 각각은 사용자 공간에서 격리된 프로세스로 실행됩니다. 컨테이너는 VM보다 공간을 적게 차지하고 더 많은 애플리케이션을 처리합니다. 컨테이너 이미지는 일반적으로 수십 MB 크기입니다.

  • 가상머신과 차이점: 컨테이너는 운영체제를 공유하므로 가상머신보다 가볍고 빠릅니다. 가상머신은 OS와 애플리케이션을 모두 포함하여 더 많은 자원을 소모합니다.
Container and VM

[그림 1] Container and VM

Docker의 주요 구성 요소

  1. 이미지

    • 컨테이너를 실행하기 위한 템플릿입니다.

    • 애플리케이션과 필요한 라이브러리를 포함합니다.

  2. 컨테이너

    • Docker 이미지를 기반으로 실행되는 독립적인 환경입니다.

    • 각 컨테이너는 자체 파일 시스템, CPU, 메모리를 사용할 수 있지만 호스트와 격리됩니다.

  3. Dockerfile

    • Docker 이미지를 빌드하는 데 사용되는 스크립트입니다.

    • Dockerfile에 명령을 작성하여 애플리케이션 환경을 구성할 수 있습니다.

     FROM python:3.8
     WORKDIR /app
     COPY . /app
     RUN pip install -r requirements.txt
     CMD ["python", "app.py"]
    
  4. Docker Hub

    • Docker 이미지를 공유하는 공식 저장소입니다.

    • 사용자는 Docker Hub에서 이미지를 가져오거나, 자신만의 이미지를 업로드할 수 있습니다.

Docker의 주요 명령어

명령어 설명
docker pull <이미지> Docker 이미지를 Docker Hub에서 다운로드
docker run <이미지> 컨테이너를 생성하고 실행
docker ps 실행 중인 컨테이너 목록 보기
docker ps -a 종료된 컨테이너를 포함한 모든 컨테이너 보기
docker stop <컨테이너> 컨테이너 중지
docker rm <컨테이너> 컨테이너 삭제
docker images 로컬에 저장된 이미지 목록 보기
docker rmi <이미지> Docker 이미지 삭제

Docker와 Conda 가상환경의 비교

Docker와 Conda 모두 격리된 환경을 제공하지만 사용 목적, 격리 수준, 구현 방식 에서 차이가 있습니다. 둘의 개념과 차이를 살펴보겠습니다.

  1. 기본 개념

    특징 Conda Docker
    목적 주로 Python 및 라이브러리 관리와 격리 애플리케이션 실행에 필요한 모든 것을 포함한 환경을 격리
    구성 요소 Python 버전, 라이브러리, 패키지 애플리케이션, 운영 체제, 라이브러리 등 애플리케이션 실행에 필요한 모든 것 포함
    격리 수준 같은 OS 내에서의 가상 환경 격리 OS 수준의 완벽한 격리 (컨테이너는 운영 체제를 포함함)
  2. 설치 및 사용 방식

    • Conda :

    • Python과 관련된 라이브러리와 종속성을 같은 가상환경 내에 설치.

    • OS에 영향을 미치지 않지만, 같은 OS의 자원을 공유.

     conda create -n myenv python=3.8
     conda activate myenv
    
    • Docker :

    • 특정 애플리케이션 환경을 독립된 컨테이너로 실행.

    • 컨테이너 안에 애플리케이션 실행에 필요한 운영 체제, 라이브러리, 애플리케이션 코드 등을 포함.

     docker pull python:3.8
     docker run -it python:3.8
    
  3. 격리 수준

    • Conda :

    • 격리 수준: 같은 OS 안에서 Python과 라이브러리만 격리.

    • 영향 범위: OS와 직접적인 연결이 있으며, 라이브러리가 충돌하지 않도록 보장.

    • 의존성 충돌 방지: 서로 다른 환경에 라이브러리를 설치해 충돌 방지.

    • Docker :

    • 격리 수준: 컨테이너 내부에 독립된 운영 체제를 포함해 애플리케이션을 완전히 격리.

    • 영향 범위: 호스트 OS와 완전히 독립적이며, 다른 컨테이너와도 영향을 미치지 않음.

    • 완벽한 독립성: 컨테이너마다 다른 OS를 사용할 수도 있음.

  4. 패키지 및 환경 관리

    • Conda :

    • Python 중심: Python과 관련된 라이브러리 관리에 특화.

    • 환경 구성: 환경 생성 시 Python 버전과 필요한 패키지를 명시적으로 설치.

    • 공유: 환경 파일 (environment.yml)로 환경을 쉽게 재구성.

    • Docker :

    • 언어 불문: Python뿐만 아니라, Node.js, Java, Ruby 등 모든 언어와 애플리케이션 환경을 지원.

    • 환경 구성: Dockerfile에 필요한 OS, 패키지, 라이브러리, 애플리케이션 실행 방법을 정의.

    • 공유: 이미지를 Docker Hub 같은 플랫폼에서 공유 가능.

  5. 운영 범위

    • Conda :

    • 주로 로컬에서 사용:

      • 데이터 과학, 머신러닝, Python 애플리케이션 개발.

      • 같은 머신에서 여러 프로젝트를 관리하기에 적합.

    • Docker :

    • 배포 및 운영 환경:

      • 로컬뿐만 아니라 클라우드, 서버 환경에서 동일한 애플리케이션 실행 가능.

      • CI/CD(Continuous Integration/Deployment)와 결합해 배포 자동화 가능.

  6. 속도와 성능

    • Conda :

    • 속도: 환경 생성이나 라이브러리 설치가 비교적 빠름.

    • 자원 사용: 같은 OS와 자원을 공유하므로 가볍게 실행.

    • Docker :

    • 속도: 이미지 실행 속도는 빠르지만, 이미지 빌드 및 다운로드는 느릴 수 있음.

    • 자원 사용: 운영 체제 전체를 포함하므로 자원 사용량이 더 큼.

  7. 장단점 비교

    특징 Conda Docker
    장점 Python 중심, 설치와 사용이 간편 OS 수준의 완벽한 독립성, 다양한 언어와 환경 지원
    단점 Python 외의 환경은 관리하기 어려움 이미지 크기가 큼, 설정 및 사용 학습 곡선이 있음
    주요 사용 사례 데이터 과학, 머신러닝 프로젝트 애플리케이션 배포, 마이크로서비스 관리

결론

Conda는 Python 및 데이터 과학 작업에 최적화된 가상환경을 제공하고, Docker는 운영체제 수준의 격리와 배포 자동화에 강점을 지닙니다. 프로젝트의 목적과 범위에 따라 선택하거나, 두 기술을 조합해서 사용할 수도 있습니다. 예를 들어, Conda 가상환경을 Docker 컨테이너 안에 포함하여 배포하는 방법도 가능합니다!! 오늘 포스팅은 여기서 마무리하겠습니다. 감사합니다😎