WjExplor Story

위클리페이퍼_2026.03.08 본문

AI 엔지니어 부트캠프/추론 최적화와 모델 배포

위클리페이퍼_2026.03.08

더블유제이플로어 2026. 3. 8. 20:40

Docker & Kubernetes 발표 자료

Q1. Docker 이미지와 컨테이너의 차이를 설명해보세요.

핵심 요약

Docker 이미지는 컨테이너를 만들기 위한 읽기 전용 템플릿이고,
Docker 컨테이너는 그 이미지를 실행한 독립된 런타임 인스턴스입니다.


Docker 이미지란?

Docker 이미지는 서비스 운영에 필요한 서버 프로그램, 소스코드, 라이브러리, 컴파일된 실행 파일을 하나로 묶은 파일입니다.
특정 프로세스를 실행하기 위한 모든 파일과 환경 설정을 포함하고 있으며, 추가로 의존성을 설치하거나 컴파일할 필요가 없는 상태입니다.

  • 용량은 보통 수백 MB ~ 수 GB이지만, 가상 머신 이미지에 비하면 훨씬 작습니다.
  • 불변(Immutable) 합니다. 한번 생성된 이미지는 수정이 불가능하며, 변경이 필요하면 새 이미지를 빌드해야 합니다.
  • 하나의 이미지로 여러 개의 컨테이너를 생성할 수 있습니다.
  • GitHub과 유사한 DockerHub를 통해 버전 관리 및 배포(push/pull)가 가능합니다.
  • Dockerfile이라는 파일을 통해 이미지를 빌드합니다. Dockerfile에는 소스, 의존성 패키지, 설정 파일이 명시됩니다.

Docker 컨테이너란?

이미지를 실행한 상태로, 응용 프로그램과 그 종속성을 함께 패키징하여 격리된 공간에서 프로세스를 실행하는 기술입니다.

  • 컨테이너는 이미지 레이어 위에 읽기/쓰기(read-write) 레이어를 추가하여 생성됩니다.
  • 여러 컨테이너를 생성해도 이 추가 레이어만큼의 용량만 사용되므로 효율적입니다.
  • 컨테이너를 종료해도 메모리에서 자동 삭제되지 않습니다. 명시적으로 삭제해야 하며, 종료 후에도 재시작이 가능합니다.
  • 컨테이너를 삭제하면 컨테이너 내부에서 생성된 파일(예: DB 데이터)도 함께 삭제됩니다.
  • 여러 컨테이너는 서로 독립적으로 실행되며, 커널 공간과 호스트 OS 자원은 공유합니다.

비교 정리

항목 Docker 이미지 Docker 컨테이너
정의 컨테이너 생성을 위한 템플릿 이미지를 실행한 런타임 인스턴스
생성 위치 Dockerfile Docker 이미지
가변성 불변 (Immutable) 변경 가능 (Mutable)
계층 구조 읽기 전용 레이어 읽기 전용 + 추가 읽기/쓰기 레이어
사용 방식 저장, 공유, 재사용 생성 후 실행, 필요 없으면 삭제

실행 명령어 예시

docker run -it MyImage bash

이 명령어는 MyImage라는 이미지에서 컨테이너를 생성하고, -it 옵션으로 가상 터미널을 열어 bash를 실행합니다.

출처


Q2. Docker Compose는 어떤 상황에서 유용하며, 일반 Dockerfile과 어떤 차이가 있나요?

핵심 요약

Dockerfile은 단일 컨테이너 하나를 정의하는 파일이고,
Docker Compose는 여러 컨테이너를 하나의 파일에서 정의하고 함께 실행할 수 있는 도구입니다.


Dockerfile이란?

개별 컨테이너를 빌드하는 역할을 합니다. FROM, RUN, ENTRYPOINT 등의 명령어로 이미지를 정의하고, docker run 명령어와 함께 옵션을 직접 입력해 컨테이너를 실행합니다.

FROM : Dockerfile에서 베이스 이미지를 지정하는 명령어

FROM node

RUN : NGINX(엔진엑스) 이미지를 기반으로 node-server라는 이름의 컨테이너를 실행 명령어

docker run --name node-server -d -p 4000:4000 nginx

ENTRYPOINT : 컨테이너가 실행될 때 항상 실행되는 명령어

ENTRYPOINT ["python", "app.py"]
CMD ["python", "app.py"]

 


ENTRYPOINTCMD 차이

  ENTRYPOINT CMD
고정 여부 고정됨, 덮어쓰기 어려움 덮어쓰기 가능
용도 무조건 실행할 명령어 기본값 명령어 (변경 가능)

실제로 어떻게 다른가

CMD를 사용한 경우

FROM python
CMD ["python", "app.py"]
docker run myimage                  # python app.py 실행됨
docker run myimage python other.py  # other.py로 덮어써짐

docker run 뒤에 명령어를 붙이면 CMD가 무시되고 교체됩니다.

ENTRYPOINT를 사용한 경우

FROM python
ENTRYPOINT ["python", "app.py"]
docker run myimage                  # python app.py 실행됨
docker run myimage python other.py  # python app.py python other.py 로 뒤에 붙어버림

docker run 뒤에 붙인 내용이 교체가 아니라 ENTRYPOINT 뒤에 인자로 추가됩니다.


그래서 언제 뭘 쓰나?

CMD가 적합한 경우

개발 중에 app.py 말고 다른 파일을 실행해볼 일이 있거나, 컨테이너 실행 시 명령어를 바꿔야 할 상황이 생길 수 있을 때 CMD가 더 유연합니다.

ENTRYPOINT가 적합한 경우

웹서버, API 서버처럼 컨테이너 목적이 하나로 고정되어 있고, 절대 다른 명령어로 실행되면 안 될 때 사용합니다.


둘을 함께 쓰는 패턴도 있습니다

ENTRYPOINT ["python"]
CMD ["app.py"]

이렇게 쓰면 기본으로는 python app.py가 실행되고, docker run myimage other.py처럼 실행하면 python other.py로 유연하게 바꿀 수 있습니다. ENTRYPOINT로 실행기(python)를 고정하고, CMD로 기본 파일만 교체 가능하게 두는 방식입니다.


명령어가 길어질수록 관리가 어렵고, 여러 컨테이너를 동시에 관리하는 데 한계가 있습니다.

Docker Compose란?

복잡한 docker run 명령어 대신 YAML 파일(docker-compose.yml)로 컨테이너 설정을 정의하고, 단 하나의 명령어로 실행할 수 있습니다.

services:
  backend:
    container_name: node-server
    image: node:18-alpine
    ports:
      - 4000:4000
docker compose up -d   # 백그라운드 실행
docker compose down    # 컨테이너 + 네트워크 중지 및 삭제

Docker Compose가 특히 유용한 상황

프론트엔드, 백엔드, DB처럼 여러 컨테이너가 함께 동작해야 하는 환경에서 진가를 발휘합니다.

services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    depends_on:
      - backend
  backend:
    build: ./backend
    ports:
      - "4000:4000"
    depends_on:
      - db
  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb

depends_on을 통해 실행 순서(예: DB 실행 후 백엔드 실행)도 제어할 수 있습니다.

Dockerfile과 함께 사용하기

Docker Compose는 Dockerfile을 대체하는 것이 아니라 함께 사용할 수 있습니다.
Dockerfile이 동일한 폴더에 있다면 build: .으로 참조할 수 있습니다.

services:
  backend:
    container_name: node-server
    build: .

Dockerfile vs Docker Compose 비교

작업 Dockerfile Docker Compose
컨테이너 실행 docker run 여러 번 입력 docker compose up -d
컨테이너 종료 개별 컨테이너 중지 docker compose down
로그 확인 docker logs docker compose logs -f
환경변수 관리 직접 -e 옵션 사용 .env 파일 적용 가능
컨테이너 수 단일 컨테이너 여러 컨테이너 동시 정의

출처


Q3. Kubernetes의 기본 개념은 무엇이며, Docker와는 어떤 관계가 있나요?

핵심 요약

Kubernetes(쿠버네티스)는 Docker 컨테이너의 배포, 확장, 관리를 자동화하는 오픈 소스 컨테이너 오케스트레이션 플랫폼이며,
Docker가 컨테이너를 만드는 도구라면 Kubernetes는 그 컨테이너들을 대규모로 운영하는 도구입니다.


Kubernetes란?

컨테이너화된 애플리케이션의 배포, 관리, 확장을 예약하고 자동화하는 오픈소스 컨테이너 오케스트레이션 플랫폼입니다.
Google이 2014년 오픈소스 프로젝트로 공개했으며, 현재는 CNCF(Cloud Native Computing Foundation)에서 관리하고 있습니다.

핵심 개념

  • 컨테이너 오케스트레이션 : 많은 컨테이너를 자동으로 배포하고 관리해 주는 기술.
  • 클러스터(Cluster): 여러 서버(노드)를 묶어 하나의 시스템처럼 사용하는 환경.
  • 컨트롤 플레인(Control Plane, 마스터 노드): 클러스터 전체를 관리하며 어떤 서버에서 컨테이너를 실행할지 결정하는 관리자 역할.
  • 워커 노드(Worker Node): 실제 애플리케이션 컨테이너가 실행되는 서버.

Kubernetes의 주요 기능

기능 설명
자동화된 배포 VM이나 베어메탈 서버 등 여러 노드에 걸쳐 컨테이너 배포를 자동화
서비스 검색 및 로드 밸런싱 트래픽 급증 시 자동으로 부하 분산
자동 확장 CPU 사용량, 메모리 임계값 등에 따라 새 컨테이너 자동 시작
자가 치유 장애 발생 시 컨테이너를 재시작, 교체, 재스케줄링
자동 롤아웃 및 롤백 배포 문제 발생 시 자동으로 이전 버전으로 롤백
스토리지 오케스트레이션 로컬 또는 클라우드 스토리지를 필요에 따라 자동 마운트

Docker와 Kubernetes의 관계

Docker와 Kubernetes는 별개의 기술이지만 상호 보완적입니다.

  • Docker: 컨테이너화 기능 제공. 개발자가 애플리케이션을 작고 격리된 컨테이너로 패키징할 수 있게 해줍니다.
  • Kubernetes: Docker 컨테이너의 오케스트레이션 제공. IT 환경 전체에 컨테이너를 자동 배포하고 고가용성을 보장합니다.
  • 고가용성(High Availability, HA)은 시스템이 장애나 예상치 못한 중단 상황에서도 다운타임을 최소화하고, 99.9%~99.999% 수준의 높은 비율로 지속적으로 운영되는 기능과 특성

"테스트 중에 애플리케이션이 단일 노드에서 실행된다면 어디서나 실행됩니다. 하지만 수요가 급증하는 경우, Kubernetes가 Docker 컨테이너의 오케스트레이션을 제공합니다."

언제 Kubernetes가 필요한가?

  • 향후 인프라를 확장할 계획이 있는 기업이라면 처음부터 Kubernetes를 사용하는 것이 합리적입니다.
  • 이미 Docker를 사용하고 있다면, Kubernetes는 기존 컨테이너와 워크로드를 활용하면서 확장 시의 복잡한 문제를 해결해줍니다.
  • IBM Cloud, Google, Azure, AWS 등 주요 퍼블릭 클라우드 제공업체 모두에서 지원됩니다.

출처