개발 환경 구성의 어려움

웹 애플리케이션을 개발하다 보면 데이터베이스, 캐시 서버, 메시지 큐 등 다양한 미들웨어가 필요하다. 각각의 미들웨어를 설치하고 설정하는 과정은 번거롭고 시간도 많이 걸린다. 새로운 팀원이 합류할 때마다 이 과정을 반복해야 한다면 더욱 비효율적이다.

도커 컴포즈의 필요성

도커 컴포즈는 이러한 문제를 해결하는 도구다. YAML 파일 하나로 여러 컨테이너의 구성을 정의하고, 한 번의 명령으로 전체 환경을 실행할 수 있다. 버전 관리 시스템에 이 파일을 포함하면 모든 팀원이 동일한 환경을 쉽게 구성할 수 있다.

기본 구성 파일

docker-compose.yml 파일의 기본 구조는 다음과 같다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
version: "3.8"

services:
    web:
        build: .
        ports:
            - "3000:3000"

    db:
        image: mysql:8.0
        environment:
            MYSQL_ROOT_PASSWORD: secret

실전 개발 환경 구성

Node.js + MySQL + Redis 환경

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
version: "3.8"

services:
    app:
        build:
            context: .
            dockerfile: Dockerfile
        volumes:
            - .:/app
            - /app/node_modules
        ports:
            - "3000:3000"
        environment:
            - NODE_ENV=development
            - DB_HOST=db
            - REDIS_HOST=redis
        depends_on:
            - db
            - redis

    db:
        image: mysql:8.0
        volumes:
            - mysql_data:/var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: secret
            MYSQL_DATABASE: myapp
        ports:
            - "3306:3306"

    redis:
        image: redis:alpine
        ports:
            - "6379:6379"

volumes:
    mysql_data:

React + Spring Boot + PostgreSQL 환경

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
version: "3.8"

services:
    frontend:
        build:
            context: ./frontend
            dockerfile: Dockerfile
        volumes:
            - ./frontend:/app
            - /app/node_modules
        ports:
            - "3000:3000"
        environment:
            - REACT_APP_API_URL=http://localhost:8080

    backend:
        build:
            context: ./backend
            dockerfile: Dockerfile
        volumes:
            - ./backend:/app
        ports:
            - "8080:8080"
        environment:
            - SPRING_PROFILES_ACTIVE=dev
            - DB_URL=jdbc:postgresql://db:5432/myapp
        depends_on:
            - db

    db:
        image: postgres:13
        volumes:
            - postgres_data:/var/lib/postgresql/data
        environment:
            POSTGRES_DB: myapp
            POSTGRES_USER: user
            POSTGRES_PASSWORD: secret
        ports:
            - "5432:5432"

volumes:
    postgres_data:

유용한 설정

볼륨 마운트

소스 코드 변경을 실시간으로 반영한다.

1
2
3
volumes:
    - .:/app # 소스 코드 마운트
    - /app/node_modules # node_modules 제외

환경 변수 파일

민감한 정보는 .env 파일로 분리한다.

1
2
3
4
services:
    web:
        env_file:
            - .env.development

네트워크 설정

서비스 간 통신을 위한 네트워크를 구성한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
services:
    web:
        networks:
            - frontend
            - backend

    db:
        networks:
            - backend

networks:
    frontend:
    backend:

개발 편의 기능

로그 설정

서비스별 로그를 관리한다.

1
2
3
4
5
6
7
services:
    web:
        logging:
            driver: "json-file"
            options:
                max-size: "10m"
                max-file: "3"

상태 체크

서비스 의존성을 체크한다.

1
2
3
4
5
6
7
services:
    web:
        healthcheck:
            test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
            interval: 30s
            timeout: 10s
            retries: 3

실행 명령어

주요 도커 컴포즈 명령어:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 서비스 시작
docker-compose up -d

# 서비스 중지
docker-compose down

# 로그 확인
docker-compose logs -f

# 서비스 재시작
docker-compose restart

# 컨테이너 상태 확인
docker-compose ps

문제 해결

볼륨 권한 문제

1
2
3
services:
    app:
        user: "1000:1000" # 현재 사용자 UID:GID

메모리 제한

1
2
3
4
5
6
services:
    app:
        deploy:
            resources:
                limits:
                    memory: 512M

포트 충돌

1
2
3
4
services:
    web:
        ports:
            - "127.0.0.1:3000:3000" # localhost만 접근 가능

프로덕션 고려사항

  1. 환경별 설정 파일 분리
1
2
3
docker-compose.yml          # 기본 설정
docker-compose.dev.yml      # 개발 환경
docker-compose.prod.yml     # 운영 환경
  1. 보안 설정
1
2
3
4
services:
    web:
        security_opt:
            - no-new-privileges:true

도커 컴포즈는 개발 환경 구성을 단순화한다. 모든 서비스를 하나의 파일로 관리하고 버전 관리 시스템에 포함할 수 있다. 이는 팀 전체의 개발 환경 일관성을 보장한다.