docker compose 파일 분석 및 실행
🛠️ 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 Service를 Docker 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