개인의 기록
  • 소개
  • 프로젝트
  • 글
  • 링크

© 2026 newgirok

← 글 목록

Docker — 컨테이너로 애플리케이션 실행

2026년 4월 12일
AWSDocker컨테이너

Docker는 애플리케이션을 컨테이너라는 단위로 패키징하여 어떤 환경에서도 동일하게 실행할 수 있게 해주는 플랫폼입니다. "내 컴퓨터에서는 됐는데 서버에서 안 된다"는 환경 불일치 문제를 해결하는 것이 Docker의 핵심 가치입니다.

컨테이너 vs 가상 머신(VM)

컨테이너와 VM은 모두 애플리케이션을 격리된 환경에서 실행하지만, 격리 방식이 근본적으로 다릅니다.

VM 구조                          Container 구조

+----------+ +----------+        +------+ +------+ +------+
|  App A   | |  App B   |        | App A| | App B| | App C|
+----------+ +----------+        +------+ +------+ +------+
|  Guest   | |  Guest   |        |Container Runtime (Docker)|
|  OS      | |  OS      |        +--------------------------+
+----------+ +----------+        |      Host OS Kernel       |
|       Hypervisor        |        +--------------------------+
+-------------------------+        |       Hardware            |
|       Hardware          |        +--------------------------+
+-------------------------+

각 VM: 수 GB, 부팅 수분          각 컨테이너: 수 MB, 수초 이내 시작

VM은 하이퍼바이저 위에 완전한 게스트 OS를 올려 강한 격리를 제공합니다. 반면 컨테이너는 호스트 OS 커널을 공유하면서 프로세스 수준에서 격리합니다. 이 덕분에 컨테이너는 VM보다 훨씬 가볍고 빠릅니다.

비교 항목VM컨테이너
OS각자 Guest OS 포함Host OS 커널 공유
이미지 크기수 GB수 MB ~ 수백 MB
시작 시간수 분수 초 이내
격리 수준강함 (OS 수준)보통 (프로세스 수준)
이식성제한적높음

Docker Image — 실행 가능한 패키지

Docker Image는 애플리케이션을 실행하는 데 필요한 모든 것(코드, 런타임, 라이브러리, 설정 파일)이 담긴 읽기 전용 템플릿으로, 레이어(Layer) 구조로 구성되어 중복을 최소화합니다.

이미지는 레이어 구조로 쌓입니다. 예를 들어 Ubuntu → Python 설치 → 애플리케이션 코드 순서로 레이어가 쌓이며, 하위 레이어가 같은 이미지들은 해당 레이어를 공유하여 저장 공간을 절약합니다.

Dockerfile — 이미지 빌드 명세서

Dockerfile은 Docker 이미지를 어떻게 빌드할지 정의하는 텍스트 파일입니다. 각 명령어가 이미지의 한 레이어가 됩니다.

# 베이스 이미지 지정
FROM node:18-alpine

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

# 의존성 파일 복사 및 설치
COPY package*.json ./
RUN npm install

# 소스 코드 복사
COPY . .

# 포트 노출
EXPOSE 3000

# 컨테이너 시작 시 실행할 명령
CMD ["node", "server.js"]

주요 Dockerfile 명령어는 다음과 같습니다.

  • FROM: 베이스 이미지 지정 (모든 Dockerfile의 시작점)
  • WORKDIR: 이후 명령이 실행될 작업 디렉토리
  • COPY: 호스트 파일을 이미지 안으로 복사
  • RUN: 이미지 빌드 시 실행할 명령 (레이어 생성)
  • EXPOSE: 컨테이너가 사용할 포트 문서화
  • CMD: 컨테이너 시작 시 기본으로 실행할 명령

컨테이너 실행 흐름

Dockerfile
    |
    | docker build
    v
Docker Image (로컬 또는 레지스트리)
    |
    | docker run
    v
Container (실행 중인 인스턴스)

이미지 하나에서 여러 컨테이너를 동시에 실행할 수 있습니다. 이미지는 불변이고, 컨테이너는 이미지 위에 읽기/쓰기 레이어를 추가한 실행 환경입니다.

AWS에서의 Docker 활용

AWS에서는 Docker를 다음과 같이 활용합니다.

  • ECR(Elastic Container Registry): Docker 이미지를 저장하는 AWS 전용 이미지 저장소
  • ECS(Elastic Container Service): AWS에서 컨테이너를 오케스트레이션하는 서비스
  • EKS(Elastic Kubernetes Service): Kubernetes 기반 컨테이너 오케스트레이션
  • Fargate: 서버 관리 없이 컨테이너를 실행하는 서버리스 컨테이너 서비스
개발자 로컬
    |
    | docker build & docker push
    v
ECR (이미지 저장)
    |
    | 이미지 pull
    v
ECS / Fargate (컨테이너 실행)

Docker를 사용하면 개발, 테스트, 운영 환경을 동일한 이미지로 통일할 수 있어 "환경 차이로 인한 버그"를 원천적으로 줄일 수 있습니다.

← 이전 글LocalStack — AWS 서비스를 로컬에서 테스트