본문 바로가기

ETC

도커(Docker)란?

728x90
반응형

Docker란?

Docker(도커)는 애플리케이션을 컨테이너(Container)라는 단위로 패키징하고 배포, 실행할 수 있는 오픈소스 플랫폼이다. Docker는 컨테이너라는 격리된 환경에서 애플리케이션을 실행하는 기술을 제공하며, 개발자와 운영팀이 일관성 있는 환경에서 애플리케이션을 배포할 수 있도록 도와준다.

컨테이너는 애플리케이션 코드, 런타임, 시스템 도구, 라이브러리 등을 모두 포함한 독립적인 패키지로, 컨테이너 기반 가상화 기술을 활용해 리소스 효율성을 극대화하면서도 운영체제(OS)의 커널을 공유하여 가상머신(VM)보다 더 가벼운 환경을 제공한다.


Docker의 주요 개념

      • 이미지(Image)
        • Docker 이미지는 애플리케이션을 실행하는 데 필요한 모든 파일, 라이브러리, 설정 등을 포함한 불변의 템플릿이다. 이미지는 컨테이너를 생성하는 데 사용되며, 여러 레이어(layer)로 구성되어 있어 효율적으로 관리되고, 여러 컨테이너가 동일 이미지를 공유할 수 있다.
        • Docker 이미지 파일은 계층적 구조를 갖고 있어 중복 데이터를 최소화하고, 레이어 기반 캐싱 메커니즘을 통해 빌드 시간을 단축할 수 있다.
      • 컨테이너(Container)
        • 컨테이너는 이미지를 기반으로 생성된 실행 가능한 인스턴스이다. 애플리케이션과 그 종속성을 포함하는 독립된 환경에서 실행되며, 가상 머신과는 달리 호스트 운영체제의 커널을 공유하여 가볍고 빠르게 실행된다.
        • 컨테이너는 기본적으로 고립된 환경에서 실행되지만, 필요한 경우 네트워크나 볼륨을 통해 다른 컨테이너 및 호스트와 데이터를 주고받을 수 있다.
      • Dockerfile
        • Dockerfile은 이미지를 생성하는 데 사용되는 텍스트 파일로, 이미지 빌드 과정을 정의한다. 각 명령어는 이미지의 레이어로 추가되며, 다음은 기본적인 Dockerfile 예시이다.
# 베이스 이미지를 지정 (예: Python)
FROM python:3.9-slim

# 애플리케이션 소스 파일 복사
COPY . /app

# 작업 디렉토리 설정
WORKDIR /app

# 의존성 설치
RUN pip install -r requirements.txt

# 컨테이너 시작 시 실행할 명령어
CMD ["python", "app.py"]

 

    • Docker 허브(Docker Hub)
      • Docker Hub는 Docker 이미지의 중앙 저장소로, 수많은 공개 및 개인 이미지를 호스팅한다. 사용자는 Docker Hub에서 이미지를 다운로드(pull)하거나, 자신이 만든 이미지를 업로드(push)할 수 있다.
      • 예를 들어, 사용자는 공식 Python 이미지를 docker pull python 명령을 통해 로컬 환경에 다운로드할 수 있다.
    • 볼륨(Volume)
      • 볼륨은 컨테이너가 생성, 종료되더라도 데이터를 영구적으로 저장하는 방법이다. 컨테이너 내 파일 시스템은 기본적으로 비휘발성이며, 컨테이너가 종료되면 해당 데이터도 사라진다. 볼륨을 사용하면 데이터를 호스트 파일 시스템에 저장하거나 다른 컨테이너와 공유할 수 있다.
    • 네트워크(Networking)
      • Docker는 기본적으로 독립된 네트워크 환경을 제공하지만, 컨테이너 간의 네트워크 연결을 설정할 수 있다. Docker는 여러 네트워크 모드(브리지, 호스트, 오버레이 등)를 지원하여 복잡한 네트워크 토폴로지를 구성할 수 있다.

Docker의 작동 방식

  1. 이미지 생성
    • Dockerfile을 작성하여 애플리케이션 빌드 과정을 정의하고, 이 파일을 기반으로 docker build 명령을 사용해 Docker 이미지를 생성한다. 이미지는 계층 구조로 이루어져 있으며, 각 명령은 새로운 레이어로 추가된다.
  2. 컨테이너 실행
    • 이미지를 기반으로 컨테이너를 실행하려면 docker run 명령을 사용한다. 컨테이너는 고유한 네트워크와 파일 시스템을 갖춘 상태로 실행되며, 종료 시 해당 환경이 제거된다.
      docker run -d -p 8080:80 --name mycontainer nginx
    • 위 명령은 Nginx 컨테이너를 백그라운드에서 실행하며, 로컬 호스트의 8080 포트를 컨테이너의 80 포트와 연결합니다.
  3. 컨테이너 관리
    • docker ps: 현재 실행 중인 컨테이너 목록을 확인할 수 있다.
    • docker stop <컨테이너 이름>: 실행 중인 컨테이너를 중지한다.
    • docker rm <컨테이너 이름>: 중지된 컨테이너를 삭제한다.

Docker의 장점

  1. 이식성(Portability)
    • Docker는 애플리케이션과 종속성을 모두 컨테이너에 포함하여, 개발 환경과 프로덕션 환경 간의 일관성을 보장한다. 어디에서나 동일한 환경에서 애플리케이션을 실행할 수 있기 때문에, "개발 환경에서는 잘 됐는데 프로덕션에서는 안 돼요"라는 문제가 줄어든다.
  2. 효율성 및 경량성
    • 컨테이너는 기존의 가상 머신과는 다르게 운영체제를 가상화하지 않고 호스트의 커널을 공유하므로, 가상 머신보다 훨씬 가벼운 환경에서 빠르게 실행된다. 컨테이너는 리소스를 적게 사용하며, 더 많은 애플리케이션을 같은 하드웨어에서 실행할 수 있다.
  3. 빠른 배포 및 확장성
    • Docker 이미지는 빌드가 빠르고, 컨테이너는 즉시 실행되며, 수초 내에 스케일 아웃할 수 있다. 이를 통해 CI/CD 파이프라인의 효율성을 높이고, 애플리케이션의 배포와 업데이트가 용이해진다.
  4. 일관된 개발 환경
    • 모든 개발자, 테스트 및 운영 환경에서 동일한 이미지를 사용하므로 일관된 환경을 유지할 수 있다. 이는 팀 간 협업을 원활하게 하고, 환경에 따라 발생할 수 있는 문제를 최소화 시킬 수 있다.
  5. 마이크로서비스 지원
    • Docker는 마이크로서비스 아키텍처에 적합한 도구이다. 각각의 서비스가 독립된 컨테이너에서 실행되며, 서비스 간의 의존성 문제를 격리할 수 있다.
  6. 리소스 격리 및 보안
    • 각 컨테이너는 고립된 환경에서 실행되며, Docker는 cgroups와 네임스페이스를 활용하여 프로세스 간의 리소스 사용을 격리한다. 이를 통해 애플리케이션 간의 간섭을 최소화하고, 더 높은 수준의 보안을 제공한다.

Docker와 가상 머신의 차이점

Docker와 전통적인 가상 머신(Virtual Machine, VM)은 겉보기에는 유사해 보이지만, 내부적으로는 상당한 차이가 있다.

항목 Docker(컨테이너) 가상 머신(VM)
구조 호스트 OS의 커널을 공유하며, 애플리케이션과 라이브러리만 포함 독립된 운영체제(OS)를 포함한 전체 시스템
경량성 수 메가바이트(MB) 정도로 가볍고, 더 빠르게 실행 가능 수 기가바이트(GB) 용량이 필요하며, 부팅 시간이 걸림
성능 직접적인 하드웨어 접근과 OS 커널 공유로 높은 성능 제공 하이퍼바이저를 통해 간접적으로 하드웨어에 접근하여 성능 저하 가능성 있음
격리 수준 프로세스와 네트워크를 격리하지만, 완벽한 보안은 아님 완벽한 격리된 환경으로 더 높은 보안을 제공
시작 시간 수 초 내에 시작할 수 있음 수 분 정도의 시간이 소요됨

Docker 사용 사례

  1. 개발 환경 통일
    • 개발자들이 로컬에서 동일한 Docker 이미지를 사용하여 일관된 개발 환경을 유지할 수 있다. 이를 통해 "내 환경에서는 잘 됐는데..."와 같은 문제를 줄일 수 있다.
  2. CI/CD 파이프라인
    • Docker는 지속적 통합/배포(CI/CD) 파이프라인에서 자주 사용된다. 코드를 푸시할 때마다 Docker 이미지를 생성하고, 이를 통해 애플리케이션을 빠르게 배포할 수 있다.
  3. 마이크로서비스 아키텍처
    • Docker는 마이크로서비스를 각 컨테이너로 분리하여 실행할 수 있기 때문에, 각 서비스가 독립적으로 배포 및 관리될 수 있다.
  4. 애플리케이션 샌드박싱
    • 서로 다른 애플리케이션이나 버전을 Docker 컨테이너로 격리하여 동시에 실행하거나 테스트할 수 있다.

Docker는 현대 애플리케이션 개발에서 필수적인 도구로 자리 잡았으며, 컨테이너 기반 환경의 표준으로 사용된다.

컨테이너는 애플리케이션의 실행 환경을 경량화하고 일관성을 유지할 수 있게 해주며, 빠른 배포와 확장을 지원하는 뛰어난 장점을 가지고 있다.

728x90
반응형

'ETC' 카테고리의 다른 글

MSA (Micro Services Architecture)란?  (1) 2024.09.29
DDD (Domain-Driven Design)란?  (1) 2024.09.28
쿠버네티스(Kubernetes)란?  (3) 2024.09.26
[ETC] CORS ERROR란?  (0) 2024.09.25
[JavaScript] undefined와 null의 차이  (0) 2024.09.22