Spring Microservice

docker compose 파일 분석 및 실행

헬로우월드 2025. 3. 13. 20:54

🛠️ docker compose 설정 완벽 분석

📌 개요

이 글에서는 Docker Compose 설정, Vault 구성, PostgreSQL 초기화 스크립트를 분석합니다. 🧐

 

🗂️ 프로젝트 파일 구성

📦 chapter05

📦 chapter05
├── 📂 configserver             # Spring Cloud Config Server 프로젝트
├── 📂 licensing-service        # 라이선스 관리 서비스 (Licensing Service)
├── 📂 docker                   # Docker Compose 및 Vault 설정
│   ├── 📂 vault
│   │   ├── 📂 config           # Vault의 Raft 설정 (미사용)
│   │   ├── 📂 file             # 환경별 설정 파일 저장소
│   │   │   ├── application.json
│   │   │   ├── application_dev.json
│   │   │   ├── default.json
│   │   │   ├── dev.json
│   │   │   ├── prod.json
│   │   ├── vault-init.sh       # Vault 초기화 스크립트
│   ├── docker-compose.yml      # Docker Compose 설정 파일
│   ├── data.sql                # PostgreSQL 초기 데이터 삽입 스크립트
│   └── init.sql                # PostgreSQL 테이블 초기화 스크립트
│
├── pom.xml                     # 전체 프로젝트 Maven 빌드 파일
├── build-for-m1.sh             # macOS M1/M2용 빌드 스크립트
└── README.md                   # 프로젝트 설명 파일

 

🐳 Docker Compose 설정 분석

이 프로젝트에서는 Vault, PostgreSQL, Config Server, Licensing ServiceDocker Compose를 통해 컨테이너로 실행합니다. 각 서비스의 역할을 철저히 분석해보겠습니다. 🔍

 

🏗️ 네트워크 설정

networks:
  backend:
    driver: bridge

네트워크 설정 분석

  • networks: Docker 컨테이너 간의 통신을 관리하는 네트워크 설정.
  • backend: 모든 서비스(PostgreSQL, Config Server, Licensing Service, Vault)가 연결될 네트워크.
  • driver: bridge:
    • Docker의 디폴트 네트워크 드라이버이며, 서로 다른 컨테이너들이 동일한 네트워크 내에서 통신할 수 있도록 설정.
    • 각 컨테이너는 고유한 IP 주소를 가지며, 컨테이너 이름을 도메인 이름처럼 사용하여 접근 가능.
    • 내부 DNS를 활용하여 컨테이너 간 통신을 가능하게 함 (database, configserver, vault 등의 서비스 명으로 접근 가능).

 

🏗️ 데이터베이스 서비스 (PostgreSQL)

database:
  image: postgres:latest
  ports:
    - "5432:5432"
  environment:
    POSTGRES_USER: "postgres"
    POSTGRES_PASSWORD: "postgres"
    POSTGRES_DB: "ostock_dev"
  volumes:
    - ./init.sql:/docker-entrypoint-initdb.d/1-init.sql
    - ./data.sql:/docker-entrypoint-initdb.d/2-data.sql
  networks:
    backend:
      aliases:
        - "database"
  healthcheck:
    test: ["CMD-SHELL", "pg_isready -U postgres"]
    interval: 10s
    timeout: 5s
    retries: 5

PostgreSQL 설정 분석

  • image: 최신[latest] PostgreSQL 이미지를 사용하여 데이터베이스 컨테이너를 실행.
  • ports: 5432 포트를 컨테이너 외부에 노출하여 애플리케이션 및 다른 서비스가 접근 가능.
  • environment:
    • POSTGRES_USER: PostgreSQL의 디폴트 사용자 (postgres).
    • POSTGRES_PASSWORD: PostgreSQL 접속을 위한 비밀번호 (postgres).
    • POSTGRES_DB: 초기 생성할 데이터베이스 이름 (ostock_dev).
  • volumes:
    • init.sql: 초기 테이블 생성 SQL 스크립트.
    • data.sql: 초기 데이터 삽입 SQL 스크립트.
  • networks:
    • backend 네트워크에 연결되어 있으며, 타 서비스는 database 서비스명으로 database 서비스 접근 가능.
  • healthcheck:
    • pg_isready 명령을 사용하여 데이터베이스가 정상적으로 실행되고 있는지 확인.
    • 10초마다 체크하며, 최대 5번 재시도 가능.

 

🔹 Config Server 서비스

configserver:
  image: ostock/configserver:0.0.1-SNAPSHOT
  ports:
    - "8071:8071"
  environment:
    ENCRYPT_KEY: "fje83Ki8403Iod87dne7Yjsl3THueh48jfuO9j4U2hf64Lo"
    VAULT_HOST: "vault"
  networks:
    backend:
      aliases:
        - "configserver"

Config Server 설정 분석

  • ports: 8071 포트를 컨테이너 외부에 노출하여 구성 서버에 접근 가능.
  • environment:
    • ENCRYPT_KEY: 설정 값 복호화에 사용되는 키.
    • VAULT_HOST: Vault에서 설정을 가져올 서버 지정 (vault 컨테이너와 연결됨).
  • networks: backend 네트워크를 사용하며, 타 서비스는 서비스 명 configserver로 configserver 접근 가능.

🔹 Licensing Service 서비스

licensingservice:
  image: ostock/licensing-service:0.0.2-SNAPSHOT
  environment:
    PROFILE: "dev"
    CONFIGSERVER_URI: "http://configserver:8071"
    CONFIGSERVER_PORT: "8071"
    DATABASESERVER_PORT: "5432"
    ENCRYPT_KEY: "fje83Ki8403Iod87dne7Yjsl3THueh48jfuO9j4U2hf64Lo"
  depends_on:
    database:
      condition: service_healthy
    configserver:
      condition: service_started
  ports:
    - "8080:8080"
  networks:
    - backend

Licensing Service 설정 분석

  • environment:
    • PROFILE: 실행 환경(dev, prod 등 지정 가능).
    • CONFIGSERVER_URI: Config Server의 URL.
    • DATABASESERVER_PORT: DB 포트 지정.
    • ENCRYPT_KEY: 데이터 복호화 키.
  • depends_on:
    • database: 건강 상태(healthcheck)가 통과되면 실행.
    • configserver: 실행 완료 후 시작.
  • ports: 8080 포트를 컨테이너 외부로 노출.
  • networks: backend 네트워크를 사용.

 

🔐 Vault 설정 분석

Vault는 민감한 정보를 안전하게 저장하고 애플리케이션에서 안전하게 불러올 수 있도록 관리하는 도구입니다.

📌 vault-init.sh - Vault 초기화 스크립트

#!/bin/bash

echo "==> Vault 서버 실행 중"
# 개발 모드에서 Vault 서버 실행 (-dev 모드 사용)
vault server -dev -dev-root-token-id="myroot" -dev-listen-address="0.0.0.0:8200" &

# Vault 서버가 실행될 때까지 대기 (5초)
echo "==> Vault 서버가 시작될 때까지 대기 중 (5초)"
sleep 5

# Vault 환경 변수 설정
export VAULT_ADDR='http://0.0.0.0:8200'
export VAULT_TOKEN='myroot'

echo "==> Vault에 데이터를 저장 중"
# Vault의 Key-Value 스토리지에 JSON 데이터를 저장
VAULT_TOKEN=myroot vault kv put secret/application @/vault/data/application.json
VAULT_TOKEN=myroot vault kv put secret/application/dev @/vault/data/application_dev.json
VAULT_TOKEN=myroot vault kv put secret/licensing-service @/vault/data/default.json
VAULT_TOKEN=myroot vault kv put secret/licensing-service/dev @/vault/data/dev.json
VAULT_TOKEN=myroot vault kv put secret/licensing-service/prod @/vault/data/prod.json

echo "==> Vault 설정 완료. 서버 유지 중"
wait

Vault 초기화 과정 분석

  • -dev 모드로 실행되며, myroot 토큰을 사용하여 인증.
  • Vault 서버가 시작될 때까지 sleep 5로 대기하여 안정적인 실행 보장.
  • export VAULT_ADDR와 export VAULT_TOKEN을 통해 Vault 서버 주소 및 인증 토큰을 설정.
  • vault kv put 명령어를 사용하여 JSON 형식의 설정 파일을 Key-Value 스토리지에 저장.

📂 Vault 저장 JSON 파일 분석

Vault에는 환경별 설정을 저장하는 JSON 파일이 포함되어 있습니다.

🔹 application.json (디폴트 애플리케이션 설정)

{
  "management": {
    "endpoints": {
      "enabled-by-default": "true",
      "web": {
        "exposure": {
          "include": "*"
        }
      }
    }
  },
  "spring": {
    "main": {
      "allow-bean-definition-overriding": "true"
    }
  }
}

설정 분석

  • 모든 엔드포인트를 활성화하여 관리 기능을 노출함 (include: "*").
  • Spring Bean 중복 정의 허용 (allow-bean-definition-overriding: "true").

🔹 application_dev.json (개발 환경 설정)

{
  "management": {
    "endpoint": {
      "loggers": {
        "enabled": "true"
      }
    }
  },
  "logging": {
    "level": {
      "root": "DEBUG",
      "org.springframework.web": "DEBUG",
      "org.springframework.boot": "DEBUG",
      "org.springframework.data": "DEBUG",
      "org.springframework.cloud": "DEBUG",
      "org.hibernate.SQL": "DEBUG",
      "org.hibernate.type.descriptor.sql": "TRACE"
    },
    "file": {
      "name": "/var/logs/app-debug.log"
    }
  }
}

설정 분석

  • 모든 로깅 레벨을 DEBUG로 설정하여 상세한 디버깅 가능.
  • Hibernate SQL 쿼리를 TRACE 수준으로 출력.
  • 로그를 /var/logs/app-debug.log 파일에 저장.

🔹 dev.json (개발 환경 DB 설정)

{
  "spring": {
    "datasource": {
      "url": "jdbc:postgresql://database:5432/ostock_dev",
      "username": "postgres",
      "password": "{cipher}f4609209a3e75d8ac79a5e3063ce151c2cd28aa431170bb06974b9421e807b6a"
    }
  }
}

설정 분석

  • PostgreSQL 데이터베이스 ostock_dev에 연결.
  • 비밀번호는 {cipher}로 암호화된 값 사용하여 보안 강화.

🎯 Summary

이 글에서는 Docker Compose 설정, Vault 초기화 스크립트(vault-init.sh), Vault JSON 설정 파일을 분석했습니다. 🚀

Vault를 사용하여 보안성을 강화하고 환경 설정을 안전하게 관리

Docker Compose로 손쉽게 마이크로서비스 환경을 구축

Vault JSON 설정을 활용하여 실행 환경별 설정을 자동 적용

 

이제 이 환경을 활용하여 안정적인 마이크로서비스 아키텍처를 구축하세요! 💪

 

출처 : https://github.com/ihuaylupo/manning-smia/tree/master/chapter5/docker

 

manning-smia/chapter5/docker at master · ihuaylupo/manning-smia

Spring Microservices in Action - Second Edition - Code Examples - ihuaylupo/manning-smia

github.com