-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
230 lines (212 loc) · 8.46 KB
/
docker-compose.yml
File metadata and controls
230 lines (212 loc) · 8.46 KB
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
version: '3.8'
services:
# ----------------------------------------
# 1. 인프라 서비스 (DB, Message Queue)
# ----------------------------------------
postgres-db:
image: postgres:15 # PostgreSQL 15 버전 이미지 사용
container_name: postgres-db
environment:
# application.yml에 설정한 값과 일치해야 합니다.
POSTGRES_USER: your_postgres_user
POSTGRES_PASSWORD: your_postgres_password
POSTGRES_DB: delivery_db # delivery-service가 사용할 DB 이름
ports:
- "5432:5432" # 로컬 PC에서 DB에 직접 접속할 때 사용
volumes:
- ./postgres-data-volumes/postgres-data-delivery:/var/lib/postgresql/data # 데이터 영속화
postgres-db-order:
image: postgres:15 # PostgreSQL 15 버전 이미지 사용
container_name: postgres-db-order
environment:
# application.yml에 설정한 값과 일치해야 합니다.
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 123
POSTGRES_DB: order_db # delivery-service가 사용할 DB 이름
ports:
- "5433:5432" # 로컬 PC에서 DB에 직접 접속할 때 사용
volumes:
- ./postgres-data-volumes/postgres-data-order:/var/lib/postgresql/data # 데이터 영속화
rabbitmq-server:
image: rabbitmq:3-management # RabbitMQ 관리자 UI가 포함된 이미지
container_name: rabbitmq-server
environment:
# application.yml에 설정한 값과 일치해야 합니다.
RABBITMQ_DEFAULT_USER: your_rabbitmq_user
RABBITMQ_DEFAULT_PASS: your_rabbitmq_password
ports:
- "5672:5672" # AMQP 포트 (서비스 연결용)
- "15672:15672" # 관리자 UI 포트 (http://localhost:15672)
redis-server:
image: redis:7.4.2-alpine
container_name: redis-server
ports:
- 6379:6379
command: [ "redis-server" ]
networks:
- redis-network
volumes:
- redis_volume_data:/data
redisinsight:
image: redis/redisinsight:latest
container_name: redisinsight
ports:
- 5540:5540
networks:
- redis-network
depends_on:
- redis-server
volumes:
- redis_insight_volume_data:/db
# ----------------------------------------
# 2. MSA 공통 서비스 (Eureka, Gateway)
# ----------------------------------------
# ★★★ Config Server 추가 (수정됨)
config-server:
build:
context: .
dockerfile: ./config-server/Dockerfile # Config Server Dockerfile 지정
args:
# Dockerfile의 ARG JAR_FILE 변수에 실제 JAR 경로 전달
JAR_FILE: ./config-server/build/libs/*.jar
container_name: config-server
ports:
- "8888:8888" # Config Server 기본 포트 8888 노출
volumes:
- ./config-server/src/main/resources/config-repo:/etc/config-repo
environment:
# application.yml에서 사용된 변수 값 설정
- CONFIG_SERVER_PORT=8888
- EUREKA_DEFAULT_ZONE=http://eureka-server:8761/eureka/
- CONFIG_SERVER_PORT=${CONFIG_SERVER_PORT}
- API_GATEWAY_PORT=${API_GATEWAY_PORT}
- ORDER_SERVICE_PORT=9001
- SPRING_CLOUD_CONFIG_SERVER_NATIVE_SEARCHLOCATIONS=file:///etc/config-repo
depends_on:
- eureka-server # 유레카에 등록해야 하므로 유레카가 먼저 떠야 함
eureka-server:
build:
context: . # 모노레포 루트에서 빌드 시작
dockerfile: ./eureka-server/Dockerfile # 유레카 Dockerfile 지정
args:
# Dockerfile의 ARG JAR_FILE 변수에 실제 JAR 경로 전달
JAR_FILE: ./eureka-server/build/libs/*.jar
container_name: eureka-server
ports:
- "8761:8761"
environment:
- EUREKA_SERVER_PORT=8761
- EUREKA_DEFAULT_ZONE=http://eureka-server:8761/eureka/
- EUREKA_HOST=eureka-server
# 유레카는 DB나 MQ에 의존하지 않으므로 먼저 실행
api-gateway:
build:
context: .
dockerfile: ./api-gateway/Dockerfile # 게이트웨이 Dockerfile 지정
args:
JAR_FILE: ./api-gateway/build/libs/*.jar
container_name: api-gateway
ports:
- "8000:8000" # ★ MSA의 유일한 외부 진입점
environment:
- API_GATEWAY_PORT=8000
# Docker 내부 네트워크에서는 localhost 대신 컨테이너 이름(eureka-server)으로 통신
- EUREKA_DEFAULT_ZONE=http://eureka-server:8761/eureka/
- SPRING_CLOUD_CONFIG_URI=http://config-server:8888
depends_on:
- eureka-server # 유레카가 실행된 후에 실행
- config-server # ★ Config Server에 의존성 추가 (가장 중요)
- hub-service
- ai-service
# ----------------------------------------
# 3. 비즈니스 서비스 (TDD로 개발한)
# ----------------------------------------
delivery-service:
build:
context: .
dockerfile: ./delivery-service/Dockerfile # 배송 Dockerfile 지정
args:
JAR_FILE: ./delivery-service/build/libs/*.jar
container_name: delivery-service
ports:
- "8088:8088" # (테스트용)
# environment:
# # [핵심] application.yml의 설정을 덮어쓰기하여 Docker 내부망을 사용
# - EUREKA_DEFAULT_ZONE=http://eureka-server:8761/eureka/
# - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres-db:5432/delivery_db
# - SPRING_DATASOURCE_USERNAME=your_postgres_user
# - SPRING_DATASOURCE_PASSWORD=your_postgres_password
# - SPRING_RABBITMQ_HOST=rabbitmq-server
# - SPRING_RABBITMQ_USERNAME=your_rabbitmq_user
# - SPRING_RABBITMQ_PASSWORD=your_rabbitmq_password
environment:
# Config Client는 유레카 주소만 필요
- EUREKA_DEFAULT_ZONE=http://eureka-server:8761/eureka/
- SPRING_CLOUD_CONFIG_URI=http://config-server:8888
# --- 👇 [핵심] Feign Client가 유레카 대신 WireMock을 바라보도록 설정 ---
# (FeignClient(name="hub-route-service")의 유레카 조회를 비활성화하고,
# 아래의 정적 주소(WireMock 컨테이너)를 사용하도록 강제합니다.)
- HUB-SERVICE_RIBBON_LISTOFSERVERS=http://hub-service:8080
- AI-SERVICE_RIBBON_LISTOFSERVERS=http://ai-service:8080
depends_on:
- eureka-server
- postgres-db
- rabbitmq-server # 3개의 인프라가 모두 실행된 후에 실행
- config-server # ★ Config Server에 의존성 추가
- api-gateway
# ----------------------------------------
# 4. 🎭 가짜(Mock) 외부 서비스 (WireMock) - (신규 추가)
# ----------------------------------------
hub-service:
image: wiremock/wiremock:latest # WireMock 공식 이미지 사용
container_name: hub-service
ports:
- "8089:8080" # (디버깅용) 로컬 8089에서 가짜 허브 서비스 확인
volumes:
# 1단계에서 만든 hub-route-service/mappings 폴더를
# WireMock 컨테이너의 /home/wiremock/mappings 폴더에 마운트
- ./mocks/hub-service:/home/wiremock
command: [ "--verbose" ] # (로그 출력)
ai-service:
image: wiremock/wiremock:latest
container_name: ai-service
ports:
- "8090:8080" # (디버깅용) 로컬 8090에서 가짜 AI 서비스 확인
volumes:
# 1단계에서 만든 ai-service/mappings 폴더를 마운트
- ./mocks/ai-service:/home/wiremock
command: [ "--verbose" ]
order-service:
build:
context: .
dockerfile: ./order-service/Dockerfile # 배송 Dockerfile 지정
args:
JAR_FILE: ./order-service/build/libs/*.jar
container_name: order-service
ports:
- "9001:9001" # (테스트용)
environment:
# Config Client는 유레카 주소만 필요
- EUREKA_DEFAULT_ZONE=http://eureka-server:8761/eureka/
- SPRING_CLOUD_CONFIG_URI=http://config-server:8888
# --- 👇 [핵심] Feign Client가 유레카 대신 WireMock을 바라보도록 설정 ---
# (FeignClient(name="hub-route-service")의 유레카 조회를 비활성화하고,
# 아래의 정적 주소(WireMock 컨테이너)를 사용하도록 강제합니다.)
- HUB-SERVICE_RIBBON_LISTOFSERVERS=http://hub-service:8080
- AI-SERVICE_RIBBON_LISTOFSERVERS=http://ai-service:8080
depends_on:
- eureka-server
- postgres-db
- postgres-db-order
- rabbitmq-server # 3개의 인프라가 모두 실행된 후에 실행
- config-server # ★ Config Server에 의존성 추가
- hub-service
- ai-service
volumes:
postgres-data-delivery: # PostgreSQL 데이터 저장을 위한 볼륨
postgres-data-order:
redis_volume_data:
redis_insight_volume_data:
networks:
redis-network:
driver: bridge