logo
Published on

Docker 환경 구성 가이드

Authors
  • avatar
    Name
    Geurim
    Twitter

해당글은 프론트엔드 (Next.js), 백엔드 (Django)를 예시로 작성되었습니다.

Docker 환경 구성 가이드 🐳

Docker를 사용하는 이유와 장점

Docker는 현대적인 소프트웨어 개발 환경에서 필수 도구로 자리 잡았습니다. Docker를 사용하면 아래와 같은 이점을 누릴 수 있습니다:

  1. 환경 일관성 보장

    • 개발, 테스트, 운영 환경이 동일하게 유지됩니다.
    • “로컬에서는 잘 되는데 서버에서 안 돼요.” 같은 문제가 줄어듭니다.
  2. 의존성 관리

    • 각 컨테이너는 필요한 라이브러리와 종속성을 포함하므로 충돌을 방지할 수 있습니다.
    • 다양한 애플리케이션을 서로 격리하여 실행할 수 있습니다.
  3. 확장성 및 유연성

    • 서비스 기반 아키텍처(Microservices)를 손쉽게 구성하고 관리할 수 있습니다.
    • 필요할 때 컨테이너를 추가하거나 제거해 유연하게 확장 가능합니다.
  4. 손쉬운 배포

    • Docker 이미지를 통해 일관된 배포가 가능합니다.
    • CI/CD와 통합하면 자동화된 배포 프로세스를 구현할 수 있습니다.
  5. 자원 효율성

    • VM(가상 머신)보다 경량으로 실행되며, 더 적은 리소스를 사용합니다.
    • 컨테이너는 OS 커널을 공유하므로 빠르게 시작하고 종료됩니다.
  6. 협업 효율성

    • 모든 팀원이 동일한 Docker 이미지를 사용하므로 협업이 간편해집니다.
    • 새로운 팀원이 프로젝트를 시작할 때 복잡한 환경 설정이 필요 없습니다.

사전 준비사항

시작하기 전에 다음이 준비되어야 합니다:

  • Docker Desktop 설치
  • Git 설치
  • 프로젝트 코드 준비

프로젝트 구조 설정

# 프로젝트 루트 디렉토리
your-project/
├── frontend/
├── backend/
└── docker-compose.yml

Dockerfile 생성 🛠️

백엔드 Dockerfile

# backend/Dockerfile 생성
cd backend
touch Dockerfile

Dockerfile 내용:

FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

프론트엔드 Dockerfile

# frontend/Dockerfile 생성
cd ../frontend
touch Dockerfile

Dockerfile 내용:

FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
ENV NODE_ENV=development
CMD ["npm", "run", "dev"]

docker-compose.yml 작성

프로젝트 루트 디렉토리에 docker-compose.yml 파일을 생성합니다:

cd ..
touch docker-compose.yml

docker-compose.yml 내용:

version: '3'

services:
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_DATABASE: 'your_db'
      MYSQL_USER: 'your_user'
      MYSQL_PASSWORD: 'your_password'
      MYSQL_ROOT_PASSWORD: 'your_root_password'
    ports:
      - '3306:3306'
    volumes:
      - mysql_data:/var/lib/mysql
    healthcheck:
      test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost']
      timeout: 5s
      retries: 5

  backend:
    build: ./backend
    ports:
      - '8000:8000'
    volumes:
      - ./backend:/app
    environment:
      - DEBUG=1
      - DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1,backend
      - MYSQL_HOST=db
      - MYSQL_DATABASE=your_db
      - MYSQL_USER=your_user
      - MYSQL_PASSWORD=your_password
    depends_on:
      db:
        condition: service_healthy

  frontend:
    build: ./frontend
    ports:
      - '3000:3000'
    volumes:
      - ./frontend:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development
    depends_on:
      - backend

volumes:
  mysql_data:

환경변수 설정

프론트엔드 환경변수 설정

# frontend/src/config/index.ts 생성
mkdir -p frontend/src/config
touch frontend/src/config/index.ts

index.ts 내용:

export const BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://backend:8000'

백엔드 설정 수정

Django의 settings.py에 아래 내용을 추가합니다:

ALLOWED_HOSTS = [
    'localhost',
    '127.0.0.1',
    'backend',
]

CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",
    "http://frontend:3000",
]

CORS_ALLOW_CREDENTIALS = True

실행 및 관리

docker 서비스 시작

# 이미지 빌드 및 컨테이너 시작
docker-compose up --build

# 백그라운드 실행
docker-compose up -d --build

서비스 종료

# 실행 중인 서비스 종료
docker-compose down

# 볼륨까지 삭제
docker-compose down -v

로그 확인

# 전체 로그
docker-compose logs

# 특정 서비스 로그
docker-compose logs backend
docker-compose logs frontend