개발 환경 구성의 어려움#
웹 애플리케이션을 개발하다 보면 데이터베이스, 캐시 서버, 메시지 큐 등 다양한 미들웨어가 필요하다. 각각의 미들웨어를 설치하고 설정하는 과정은 번거롭고 시간도 많이 걸린다. 새로운 팀원이 합류할 때마다 이 과정을 반복해야 한다면 더욱 비효율적이다.
도커 컴포즈의 필요성#
도커 컴포즈는 이러한 문제를 해결하는 도구다. 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
2
3
 | docker-compose.yml          # 기본 설정
docker-compose.dev.yml      # 개발 환경
docker-compose.prod.yml     # 운영 환경
 | 
- 보안 설정
| 1
2
3
4
 | services:
    web:
        security_opt:
            - no-new-privileges:true
 | 
도커 컴포즈는 개발 환경 구성을 단순화한다. 모든 서비스를 하나의 파일로 관리하고 버전 관리 시스템에 포함할 수 있다. 이는 팀 전체의 개발 환경 일관성을 보장한다.