
Dockerfile
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY target/user-service-1.0.jar user-service.jar
ENTRYPOINT ["java", "-jar", "user-service.jar"]
docker-compose-user.yml
# Use root/example as user/password credentials
version: '3.1'
services:
user-service:
image: user-service:1.0
environment:
spring.cloud.config.uri: http://config-service:8888
spring.rabbitmq.host: rabbitmq
spring.zipkin.base-url: http://zipkin-zipkin-1:9411
eureka.client.service-url.defaultZone: http://service-discovery:8761/eureka/
management.zipkin.tracing.endpoint: http://zipkin-zipkin-1:9411/api/v2/spans
networks:
my-network:
networks:
my-network:
external: true
name: ecommerce-network
실행
mvn clean compile package -DskipTests=true
docker build --tag user-service:1.0 -f Dockerfile .
docker-compose -f docker-compose-user.yml up -d
방법 1. 네트워크의 IP 주소 고정(예시)
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
networks:
my-network:
ipv4_address: 172.18.0.100
방법 2. WebSecurityNew에 Api Gateway 컨테이너 IP주소 직접 추가 ✅
http.authorizeHttpRequests((authz) -> authz
.requestMatchers(new AntPathRequestMatcher("/actuator/**")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/h2-console/**")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/users", "POST")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/welcome")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/health-check")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/swagger-resources/**")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/v3/api-docs/**")).permitAll()
// .requestMatchers("/**").access(this::hasIpAddress)
.requestMatchers("/**").access(
new WebExpressionAuthorizationManager(
"hasIpAddress('127.0.0.1') or hasIpAddress('::1') or " +
"hasIpAddress('192.168.0.221') or hasIpAddress('192.168.0.221/32') or " + // host pc ip address
"hasIpAddress('apigateway-service') or hasIpAddress('172.19.0.3/16')")) // api gateway container ip address
.anyRequest().authenticated()
)
.authenticationManager(authenticationManager)
.sessionManagement((session) -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS));




- outer: kafka, db, apigateway, eureka, config
- inner: 핵심 로직 (user-service, order-service, catalog-service)
docker-compose-inner.yml
services:
user-service:
image: letthem/user-service:lgcns_1
container_name: user-service
# ports:
# - "60000:60000"
environment:
spring.cloud.config.uri: http://config-service:8888
spring.rabbitmq.host: rabbitmq
spring.zipkin.base-url: http://zipkin-zipkin-1:9411
eureka.client.service-url.defaultZone: http://service-discovery:8761/eureka/
management.zipkin.tracing.endpoint: http://zipkin-zipkin-1:9411/api/v2/spans
# depends_on:
# - config-service
networks:
my-network:
# ipv4_address: 172.18.0.12
order-service:
image: letthem/order-service:lgcns_1
container_name: order-service
environment:
spring.rabbitmq.host: rabbitmq
spring.zipkin.base-url: http://zipkin-zipkin-1:9411
spring.datasource.url: jdbc:mariadb://mariadb-server:3306/mydb
eureka.client.service-url.defaultZone: http://service-discovery:8761/eureka/
management.zipkin.tracing.endpoint: http://zipkin-zipkin-1:9411/api/v2/spans
networks:
my-network:
catalog-service:
image: letthem/catalog-service:lgcns_1
container_name: catalog-service
environment:
spring.zipkin.base-url: http://zipkin-zipkin-1:9411
spring.datasource.url: jdbc:mariadb://mariadb-server:3306/mydb
eureka.client.service-url.defaultZone: http://service-discovery:8761/eureka/
management.zipkin.tracing.endpoint: http://zipkin-zipkin-1:9411/api/v2/spans
networks:
my-network:
networks:
my-network:
external: true
name: ecommerce-network
이미지 tag 변경 + 도커허브에 push
C:\Users\user>docker tag user-service:1.1 letthem/user-service:lgcns_1
C:\Users\user>docker tag order-service:1.0 letthem/order-service:lgcns_1
C:\Users\user>docker tag catalog-service:1.0 letthem/catalog-service:lgcns_1
C:\Users\user>docker push letthem/user-service:lgcns_1
C:\Users\user>docker push letthem/order-service:lgcns_1
C:\Users\user>docker push letthem/catalog-service:lgcns_1
실행 + 세 가지 컨테이너 로그 확인
C:\Users\user\Desktop\lgcns\msa\toy-msa> docker-compose -f docker-compose-inner.yml up -d
[+] Running 3/3
✔ Container toy-msa-user-service-1 Started 1.0s
✔ Container toy-msa-order-service-1 Started 1.0s
✔ Container toy-msa-catalog-service-1 Started 1.0s
C:\Users\user\Desktop\lgcns\msa\toy-msa> docker-compose -f docker-compose-inner.yml ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
toy-msa-catalog-service-1 letthem/catalog-service:lgcns_1 "java -jar catalog-s…" catalog-service 21 seconds ago Up 20 seconds
toy-msa-order-service-1 letthem/order-service:lgcns_1 "java -jar order-ser…" order-service 21 seconds ago Up 20 seconds
toy-msa-user-service-1 letthem/user-service:lgcns_1 "java -jar user-serv…" user-service 21 seconds ago Up 20 seconds
C:\Users\user\Desktop\lgcns\msa\toy-msa> docker-compose -f docker-compose-inner.yml logs -f
// 세 가지 컨테이너 로그 한 번에 출력
docker-compose-outer.yml
services:
config-service:
image: config-service:lgcns_1
container_name: config-service
ports:
- "8888:8888"
networks:
my-network:
service-discovery:
image: service-discovery:lgcns_1
container_name: service-discovery
ports:
- "8761:8761"
depends_on:
- config-service
networks:
my-network:
apigateway-service:
image: apigateway-service:lgcns_1
container_name: apigateway-service
ports:
- "8000:8000"
environment:
spring.rabbitmq.host: rabbitmq
depends_on:
- service-discovery
networks:
my-network:
networks:
my-network:
external: true
name: ecommerce-network
컨테이너 다 지우고
- config-server
- service-discovery
- apigateway-service
이렇게 세 가지를
스프링 빌드
mvn clean compile package -DskipTests=true
이미지 생성 (각각) 하고
docker build --no-cache --tag config-service:lgcns_1 -f .\Dockerfile .
toy-msa로 cd 이후
docker-compose-outer.yml 실행
docker-compose -f docker-compose-outer.yml up -d
docker-compose-outer.yml에
rabbitmq 추가
rabbitmq:
image: rabbitmq:4.0-management
container_name: rabbitmq
ports:
- "5671:5671"
- "15671:15671"
environment:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
networks:
my-network:
mariadb 추가
mariadb-server:
image: mariadb:latest
container_name: mariadb-server
ports:
- "3306:3306"
environment:
MARIADB_ROOT_PASSWORD: test1357
MARIADB_DATABASE: mydb
networks:
my-network:
kafka 추가
broker:
image: apache/kafka:latest
ports:
- "9092:9092"
container_name: broker
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://broker:9092,CONTROLLER://broker:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@broker:9093
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_NUM_PARTITIONS: 3
networks:
my-network:
zipkin, mysql 추가
zipkin:
image: openzipkin/zipkin
container_name: zipkin
ports:
- "9411:9411"
environment:
- STORAGE_TYPE=mysql
- MYSQL_DB=zipkin
- MYSQL_USER=zipkin
- MYSQL_PASS=zipkin
- MYSQL_HOST=mysql
networks:
my-network:
mysql:
image: mysql:5.7
platform: linux/amd64
container_name: mysql
volumes:
- C:\\Users\\user\\Desktop\\lgcns\\toy-msa\\zipkin\\initdb.d:/docker-entrypoint-initdb.d
environment:
MYSQL_DATABASE: zipkin
MYSQL_USER: zipkin
MYSQL_PASSWORD: zipkin
MYSQL_ROOT_PASSWORD: root
ports:
- "3307:3306"
networks:
my-network:
services:
rabbitmq:
image: rabbitmq:4.0-management
container_name: rabbitmq
ports:
- "5671:5671"
- "15671:15671"
environment:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
networks:
my-network:
mariadb-server:
image: mariadb:latest
container_name: mariadb-server
ports:
- "3306:3306"
environment:
MARIADB_ROOT_PASSWORD: test1357
MARIADB_DATABASE: mydb
networks:
my-network:
broker:
image: apache/kafka:latest
ports:
- "9092:9092"
container_name: broker
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://broker:9092,CONTROLLER://broker:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@broker:9093
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_NUM_PARTITIONS: 3
networks:
my-network:
zipkin:
image: openzipkin/zipkin
container_name: zipkin
ports:
- "9411:9411"
environment:
- STORAGE_TYPE=mysql
- MYSQL_DB=zipkin
- MYSQL_USER=zipkin
- MYSQL_PASS=zipkin
- MYSQL_HOST=mysql
networks:
my-network:
mysql:
image: mysql:5.7
platform: linux/amd64
container_name: mysql
volumes:
- C:\\Users\\user\\Desktop\\lgcns\\toy-msa\\zipkin\\initdb.d:/docker-entrypoint-initdb.d
environment:
MYSQL_DATABASE: zipkin
MYSQL_USER: zipkin
MYSQL_PASSWORD: zipkin
MYSQL_ROOT_PASSWORD: root
ports:
- "3307:3306"
networks:
my-network:
config-service:
image: config-service:lgcns_1
container_name: config-service
ports:
- "8888:8888"
networks:
my-network:
service-discovery:
image: service-discovery:lgcns_1
container_name: service-discovery
ports:
- "8761:8761"
depends_on:
- config-service
networks:
my-network:
apigateway-service:
image: apigateway-service:lgcns_1
container_name: apigateway-service
ports:
- "8000:8000"
environment:
spring.rabbitmq.host: rabbitmq
depends_on:
- service-discovery
networks:
my-network:
networks:
my-network:
external: true
name: ecommerce-network
outer 서비스들은 자바 코드가 아닌 이미지 바로 받아올 수 있으므로 스프링 빌드, 이미지 생성 과정 없이 바로 docker-compose up 하면 됨
docker-compose -f .\docker-compose-outer.yml up -d
8개 outer 서비스 모두 기동
zipkin 컨테이너 이름 변경 -> docker-compose-inner.yml 파일에 반영
services:
user-service:
image: letthem/user-service:lgcns_1
container_name: user-service
# ports:
# - "60000:60000"
environment:
spring.cloud.config.uri: http://config-service:8888
spring.rabbitmq.host: rabbitmq
spring.zipkin.base-url: http://zipkin:9411
eureka.client.service-url.defaultZone: http://service-discovery:8761/eureka/
management.zipkin.tracing.endpoint: http://zipkin:9411/api/v2/spans
# depends_on:
# - config-service
networks:
my-network:
# ipv4_address: 172.18.0.12
order-service:
image: letthem/order-service:lgcns_1
container_name: order-service
environment:
spring.rabbitmq.host: rabbitmq
spring.zipkin.base-url: http://zipkin:9411
spring.datasource.url: jdbc:mariadb://mariadb-server:3306/mydb
eureka.client.service-url.defaultZone: http://service-discovery:8761/eureka/
management.zipkin.tracing.endpoint: http://zipkin:9411/api/v2/spans
networks:
my-network:
catalog-service:
image: letthem/catalog-service:lgcns_1
container_name: catalog-service
environment:
spring.zipkin.base-url: http://zipkin:9411
spring.datasource.url: jdbc:mariadb://mariadb-server:3306/mydb
eureka.client.service-url.defaultZone: http://service-discovery:8761/eureka/
management.zipkin.tracing.endpoint: http://zipkin:9411/api/v2/spans
networks:
my-network:
networks:
my-network:
external: true
name: ecommerce-network
docker-compose -f docker-compose-outer.yml up -d
docker-compose -f docker-compose-outer.yml restart apigateway-service
docker-compose -f docker-compose-inner.yml up -d



