메인 콘텐츠로 건너뛰기

Docker & Docker Compose 필수 가이드

요약

1. Docker 기본 개념

핵심 용어

  • 이미지(Image): 애플리케이션 실행에 필요한 모든 것을 포함한 템플릿 (설계도)

  • 컨테이너(Container): 이미지를 실행한 인스턴스 (실제 실행 중인 프로그램)

  • Dockerfile: 이미지를 만들기 위한 설정 파일

  • Docker Compose: 여러 컨테이너를 한 번에 관리하는 도구

비유로 이해하기

이미지 = 붕어빵 틀
컨테이너 = 실제 붕어빵
Dockerfile = 붕어빵 틀 만드는 설명서
Docker Compose = 붕어빵 가게 운영 매뉴얼

2. Docker 명령어

이미지 관련

# 이미지 다운로드
docker pull nginx:latest

# 이미지 목록
docker images

# 이미지 삭제
docker rmi image_name

# 모든 미사용 이미지 삭제
docker image prune -a

컨테이너 관련

# 컨테이너 실행
docker run -d -p 8080:80 --name myapp nginx

# 실행 중인 컨테이너 보기
docker ps

# 모든 컨테이너 보기 (중지된 것 포함)
docker ps -a

# 컨테이너 중지/시작/재시작
docker stop container_name
docker start container_name
docker restart container_name

# 컨테이너 삭제
docker rm container_name

# 컨테이너 로그 보기
docker logs container_name
docker logs -f container_name  # 실시간

# 컨테이너 내부 접속
docker exec -it container_name bash

정리 명령어

# 중지된 컨테이너 모두 삭제
docker container prune

# 미사용 이미지, 컨테이너, 네트워크 모두 정리
docker system prune -a

# 디스크 사용량 확인
docker system df

3. Dockerfile 작성

기본 구조

# 베이스 이미지
FROM python:3.10-slim

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

# 파일 복사
COPY requirements.txt .
COPY . .

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

# 포트 노출
EXPOSE 8000

# 실행 명령
CMD ["python", "app.py"]

주요 명령어

  • FROM: 베이스 이미지 지정

  • WORKDIR: 작업 디렉토리 설정

  • COPY: 파일 복사

  • RUN: 빌드 시 실행할 명령

  • EXPOSE: 포트 노출 (문서화 용도)

  • CMD: 컨테이너 실행 시 기본 명령

  • ENV: 환경 변수 설정

4. Docker Compose

기본 구조 (docker-compose.yml)

services:
  web:
    image: nginx:latest        # 또는 build: .
    container_name: my-web
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    environment:
      - ENV_VAR=value
    networks:
      - mynetwork
    restart: unless-stopped

  db:
    image: postgres:14
    container_name: my-db
    environment:
      - POSTGRES_PASSWORD=secret
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - mynetwork

volumes:
  db-data:

networks:
  mynetwork:
    driver: bridge

Docker Compose 명령어

# 시작 (이미지 다운로드/빌드 + 컨테이너 실행)
docker-compose up
docker-compose up -d  # 백그라운드 실행

# 빌드만 (Dockerfile 사용 시)
docker-compose build
docker-compose build --no-cache  # 캐시 없이

# 시작 + 빌드
docker-compose up -d --build

# 중지/삭제
docker-compose down  # 컨테이너 중지 및 삭제
docker-compose down -v  # 볼륨도 함께 삭제

# 상태 확인
docker-compose ps
docker-compose logs
docker-compose logs -f service_name

# 서비스별 명령
docker-compose restart service_name
docker-compose stop service_name
docker-compose start service_name

# 스케일링
docker-compose up -d --scale web=3

5. image vs build 차이

image 사용 (이미 만들어진 이미지)

services:
  app:
    image: nginx:latest  # Docker Hub에서 가져옴
  • Dockerfile 불필요

  • docker-compose up -d만 실행

build 사용 (직접 빌드)

services:
  app:
    build: .  # Dockerfile 필요
    # 또는
    build:
      context: ./app
      dockerfile: Dockerfile.prod
  • Dockerfile 필요

  • docker-compose buildup -d

  • 또는 docker-compose up -d --build

6. 네트워크

네트워크 개념

  • 컨테이너 간 통신을 위한 가상 네트워크

  • 같은 네트워크의 컨테이너끼리만 통신 가능

  • 컨테이너 이름으로 호스트명 사용 가능

네트워크 설정

# 자동 생성
services:
  app:
    networks:
      - mynet
networks:
  mynet:
    driver: bridge

# 기존 네트워크 사용
networks:
  existing-net:
    external: true  # docker network create existing-net 필요

# 네트워크 없이 (기본 네트워크 자동 생성)
services:
  app:
    # networks 설정 없음

네트워크 명령어

# 네트워크 목록
docker network ls

# 네트워크 생성
docker network create mynetwork

# 네트워크 상세 정보
docker network inspect mynetwork

# 네트워크 삭제
docker network rm mynetwork

7. 볼륨 (데이터 저장)

볼륨 타입

services:
  app:
    volumes:
      # 호스트 경로 마운트 (개발용)
      - ./src:/app/src
      
      # Named 볼륨 (프로덕션용)
      - app-data:/app/data
      
      # Anonymous 볼륨
      - /app/temp

volumes:
  app-data:  # Named 볼륨 정의

볼륨 명령어

# 볼륨 목록
docker volume ls

# 볼륨 상세 정보
docker volume inspect volume_name

# 볼륨 삭제
docker volume rm volume_name

# 미사용 볼륨 정리
docker volume prune

8. 환경 변수

설정 방법

services:
  app:
    # 직접 설정
    environment:
      - NODE_ENV=production
      - DB_HOST=postgres
    
    # .env 파일 사용
    env_file:
      - .env
    
    # 호스트 환경변수 전달
    environment:
      - API_KEY=${API_KEY}  # .env 파일에서 읽음

.env 파일

# .env
API_KEY=secret123
DB_PASSWORD=mypassword
NODE_ENV=development

9. 실전 팁

개발 vs 프로덕션

# 개발용
services:
  app:
    build: .
    volumes:
      - ./src:/app/src  # 코드 실시간 반영
    command: python manage.py runserver  # 개발 서버

# 프로덕션용
services:
  app:
    image: myapp:v1.0.0
    restart: always
    command: gunicorn app:app  # 프로덕션 서버

헬스체크

services:
  app:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

리소스 제한

services:
  app:
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 2G
        reservations:
          cpus: '1.0'
          memory: 1G

10. 트러블슈팅

자주 발생하는 문제

  1. 포트 충돌

# 포트 사용 확인
netstat -ano | findstr :8080  # Windows
lsof -i :8080  # Mac/Linux
  1. 권한 문제

# Linux/Mac에서 sudo 필요할 수 있음
sudo docker-compose up -d
  1. 캐시 문제

# 캐시 없이 빌드
docker-compose build --no-cache
  1. 디스크 공간 부족

# 정리
docker system prune -a --volumes
  1. 네트워크 오류

# 네트워크 재생성
docker-compose down
docker network prune
docker-compose up -d

11. Azure 배포 준비

# 1. Azure Container Registry 로그인
az acr login --name myregistry

# 2. 이미지 태그
docker tag myapp:latest myregistry.azurecr.io/myapp:v1

# 3. 푸시
docker push myregistry.azurecr.io/myapp:v1

# 4. Azure Container Instance 생성
az container create 
    --resource-group mygroup 
    --name myapp 
    --image myregistry.azurecr.io/myapp:v1 
    --ports 80 
    --cpu 1 
    --memory 1.5

요약 체크리스트

시작 전

  • Dockerfile 또는 image 지정 확인

  • 포트 충돌 확인

  • .env 파일 생성

실행

  • docker-compose up -d

  • docker-compose ps로 상태 확인

  • docker-compose logs로 로그 확인

문제 발생 시

  • docker-compose down

  • docker system prune -a

  • 다시 시작

종료

  • docker-compose down

  • docker-compose down -v (볼륨 삭제 필요 시)