Docker 입문 가이드: 컨테이너 기술 이해하기

들어가며

Docker는 애플리케이션을 컨테이너로 패키징하여 어디서든 동일하게 실행할 수 있게 해주는 플랫폼입니다. “내 컴퓨터에서는 되는데…“라는 문제를 해결해주는 핵심 도구입니다.

Docker 아키텍처
그림 1: Docker 아키텍처 구조

Docker란?

Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 기존 가상머신(VM)과 달리 경량화된 가상화를 제공합니다.

컨테이너 vs 가상머신

컨테이너와 가상머신 비교
그림 2: 컨테이너와 가상머신의 구조 비교
특성컨테이너가상머신
시작 시간초 단위분 단위
메모리 사용MB 단위GB 단위
격리 수준프로세스 격리완전한 격리
OS호스트 OS 공유개별 Guest OS
이식성매우 높음높음

Docker 설치

Windows/macOS

Docker Desktop을 공식 웹사이트에서 다운로드하여 설치합니다.

Linux (Ubuntu)

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io

sudo systemctl start docker

docker --version

설치 확인

docker run hello-world

Docker 핵심 개념

이미지 (Image)

이미지는 컨테이너를 생성하기 위한 읽기 전용 템플릿입니다.

Docker 이미지 레이어
그림 3: Docker 이미지의 레이어 구조

컨테이너 (Container)

컨테이너는 이미지의 실행 가능한 인스턴스입니다.

레지스트리 (Registry)

이미지를 저장하고 배포하는 저장소입니다. Docker Hub가 대표적입니다.

기본 명령어

이미지 관련

docker pull nginx

docker images

docker rmi nginx

docker build -t myapp:1.0 .

컨테이너 관련

docker run nginx

docker run -d nginx

docker run -d -p 8080:80 nginx

docker run -d --name web nginx

docker ps

docker ps -a

docker stop web

docker start web

docker rm web
-d 옵션은 백그라운드 실행, -p는 포트 매핑, --name은 컨테이너 이름 지정입니다.

컨테이너 내부 접속

docker exec -it web bash

docker logs web

docker logs -f web

Dockerfile 작성

Dockerfile은 이미지를 빌드하기 위한 명령어 모음입니다.

기본 예제

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000

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

Dockerfile 명령어

명령어설명
FROM베이스 이미지 지정
WORKDIR작업 디렉토리 설정
COPY파일 복사
RUN명령어 실행
EXPOSE포트 노출
ENV환경 변수 설정
CMD컨테이너 시작 명령어
ENTRYPOINT컨테이너 진입점

이미지 빌드

docker build -t myapp:1.0 .

docker build -t myapp:1.0 -f Dockerfile.dev .

데이터 관리

볼륨 (Volume)

docker volume create mydata

docker run -v mydata:/app/data nginx

docker volume ls

docker volume rm mydata

바인드 마운트

docker run -v $(pwd)/data:/app/data nginx

Docker Compose

여러 컨테이너를 함께 관리하는 도구입니다.

docker-compose.yml 예제

version: '3.8'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgresql://db:5432/mydb
    depends_on:
      - db

  db:
    image: postgres:15
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Compose 명령어

docker-compose up

docker-compose up -d

docker-compose down

docker-compose logs

docker-compose ps

docker-compose exec web bash
개발 환경에서는 docker-compose up으로 모든 서비스를 한 번에 시작하고, docker-compose down으로 정리할 수 있습니다.

네트워크

네트워크 종류

드라이버설명
bridge기본 네트워크 (컨테이너 간 통신)
host호스트 네트워크 공유
none네트워크 비활성화
overlay다중 호스트 네트워크

네트워크 명령어

docker network create mynet

docker run --network mynet nginx

docker network ls

docker network inspect mynet

이미지 최적화

멀티 스테이지 빌드

FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

최적화 팁

  1. 작은 베이스 이미지 사용: alpine 태그 선호
  2. 레이어 캐싱 활용: 자주 변경되는 부분을 나중에 배치
  3. 불필요한 파일 제외: .dockerignore 활용
  4. 멀티 스테이지 빌드: 빌드 도구 제외

실전 예제: Python 웹 앱

프로젝트 구조

myapp/
├── app.py
├── requirements.txt
├── Dockerfile
└── docker-compose.yml

Dockerfile

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 5000

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

빌드 및 실행

docker build -t myapp:1.0 .

docker run -d -p 5000:5000 --name myapp myapp:1.0

curl http://localhost:5000

마치며

Docker는 현대 개발 환경에서 필수적인 도구가 되었습니다. 로컬 개발부터 프로덕션 배포까지 일관된 환경을 제공하여 “내 컴퓨터에서는 되는데…” 문제를 해결해줍니다. 기본 명령어와 Dockerfile 작성법을 익히고, Docker Compose로 복잡한 애플리케이션도 쉽게 관리해보세요.

참고 자료