MSA Dockerizing 3

letthem·2025년 3월 19일

LG CNS AM CAMP 1기

목록 보기
35/42
post-thumbnail

🖥️ User Service

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

Api Gateway IP주소 변경

방법 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));

POSTMAN 테스트

회원가입

로그인

주문

회원 상세조회


  • outer: kafka, db, apigateway, eureka, config
  • inner: 핵심 로직 (user-service, order-service, catalog-service)

Inner Architecture

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
// 세 가지 컨테이너 로그 한 번에 출력

Outer Architecture

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

rabbitmq, mariadb, kafka, zipkin, mysql도 기동

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:

docker-compose-outer.yml 최종

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 서비스 모두 기동

Inner + 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

포스트맨 테스트

회원가입

로그인

주문

회원 상세조회

0개의 댓글