0. 네트워크 구성 정보
h2 : h2-version2
jdbc:h2:tcp://172.20.0.2:1521/test
172.20.0.2:8081
config: config-server
eureka
gateway
item
1. network 설정
docker network create msa-version2
docker network ls
docker network inspect msa-version2
2. H2 생성
컨테이너 다운 받아 생성
docker run --network msa-version2 -d -p 1521:1521 -p 8081:81 -e H2_OPTIONS="-ifNotExists" --name=h2-version2 oscarfonts/h2
데이터베이스 기본 설정
docker exec -it h2-version2 /bin/bash
cd /opt/h2/bin
ls
java -cp h2-2.1.214.jar org.h2.tools.Shell
⇒ 생성된 데이터베이스 Host os 위치 주소 : jdbc:h2:tcp://localhost:1521/test
네트워크에 붙어서 주소 할당이 되었는지 확인
docker network inspect msa-version2
⇒ "IPv4Address": "172.20.0.2/16",
개별 네트워크 접속이 가능한지 확인
localhost:8081 로 접속 ⇒ jdbc:h2:tcp://localhost:1521/test or jdbc:h2:tcp://172.20.0.2:1521/test 접속
3. 각 Server yaml 주의점
파일명 규칙:
- Spring Boot는 프로파일에 따라 application-{profile}.yaml 또는 application-{profile}.properties 파일을 자동으로 로드합니다.
- 여기서 {profile}은 docker와 같은 프로파일 이름입니다. 따라서 application-docker.yaml 파일은 docker 프로파일이 활성화될 때 자동으로 로드됩니다.
- 현재 각 server에 존재하는 yaml 파일은 로컬 환경에 작동하도록 설정이 되어 있다
- spring.profiles.active : local 이므로 docker 버전 yaml을 생성한다
- 각 서버 별로 생성한 docker 용 yaml 파일을 가지고 Dockerfile에서 설정을 한다
- 각각의 서버는 network로 연결되어 있기에 서로의 네트워크 값을 순서대로 넣어서 yaml 파일을 생성해야 한다
- 순서
- config → eureka → gateway→ item
- 단, 각 서버의 yaml에는 서로의 주소가 존재한다 이때 각 주소를 서로 참조하고 있으므로 한꺼번에 변경하지 못한다
- ex) http://localhost:8080 (현재 로컬)
- 그렇기에 각 주소 이름을 컨테이너의 이름으로 설정하면 연결이 된다고 한다
- ex) http://eureka-server:8761 (docker)
4. Config server yaml 파일들
application.yaml
각 설정이 다른 것은 eureka, gateway, item이므로 application.yaml은 변경하지 않는다
eureka-server-docker.yaml
유레카 자기자신이지만 새로운 network 망에 들어가게 되므로 defaultZone 설정을 바꾼다
네트워크 주소는 생성한 네트워크의 gateway 주소를 넣는다
# logging 관련 설정
logging:
file:
name: logs/api.log
max-size: 500MB
max-history: 10
level:
root: info
org.msa.eurekaserver: debug
# spring 관련 설정
spring:
application:
name: eureka-server
server:
port: 8761
eureka:
instance:
hostname: eureka-server # 유레카의 서비스명을 의미
client:
serviceUrl:
defaultZone: <http://172.20.0.1>:${server.port}/eureka/
register-with-eureka: false
fetch-registry: false
gateway-server-docker.yaml
유레카의 주소를 컨테이너의 주소로 변경한다
logging:
file:
name: logs/gateway.log
max-size: 500MB
max-history: 10
level:
root: info
org.msa.gatewayserver: debug
# gateway 의 proxy 설정
spring:
cloud:
gateway:
# routes 는 클라이언트의 요청 URI 에 대해서
# 어떤 마이크로 서비스로 요청 데이터를 전달할 것인지와 같은
# 라우팅 관련 설정
routes:
# id 는 라우팅을 위한 식별 id 임.
- id: item-service
# uri 는 이동할 마이크로 서비스 명임.
# lb 는 load balancing 의 약자임.
# item-service 는 유레카 서버에 등록된 마이크로 서비스명임.
uri: lb://item-service
# predicates 의 path 설정은 실제 요청 들어온 uri 주소임.
# /v1/item/ 으로 시작하는 요청이 들어왔을 때
# item-servoce 마이크로 서비스로 요청을 전달하겠다는 의미임.
predicates:
- Path=/v1/item/**
eureka:
instance:
prefer-ip-address: true
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: <http://eureka-server:8761/eureka>
item-service-docker.yaml
h2의 정보 (db address, id, password), 유레카 주소를 변경해준다
logging:
file:
name: logs/api.log
level:
root: info
org.msa.item: debug
logback:
rolling policy:
max-file-size: 500MB
max-history: 10
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:tcp://172.20.0.2:1521/test
username: sa
password:
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create
show-sql: true
properties:
hibernate:
format_sql: true
eureka:
instance:
prefer-ip-address: true
client:
register-with-eureka: true
fetch-register: true
service-url:
defaultZone: <http://eureka-server:8761/eureka>
5. Config Server docker 생성
Dockerfile
FROM openjdk:17-jdk-alpine AS builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +x ./gradlew
RUN dos2unix ./gradlew
RUN ./gradlew bootJar
FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=builder build/libs/*.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
dockerfile로 이미지를 생성한다
docker build -f <Dockerfile 경로> -t <이미지 이름> <빌드 컨텍스트 경로>
docker build -f Dockerfile.config -t config-server-image .
container 생성
docker run --network msa-version2 -d -p 8080:8080 --name=config-server config-server-image
로그 파일 확인
docker logs -f config-server
네트워크 설정 확인
- h2, config server가 네트워크에 붙어 있는지 확인
docker network inspect msa-version2
6. Eureka Server
bootstrap-docker.yaml
- docker용 버전을 생성이때 yaml에서 active 설정을 없애야 Dockerfile과 충돌이 일어나지 않는다
- uri는 네트워크에 설정된 config의 주소(config의 컨테이너 명)로 바꾼다
- spring.profile.active는 파일 이름에 명시하면 도커에서 알아서 인식을 하기 때문에 이름에 active 명을 적고 dockerfile에서 active 명을 실행하라고 명령한다
spring:
application:
name: eureka-server
cloud:
config:
uri: <http://172.20.0.3:8080>
loadbalancer:
ribbon:
enabled: false
Dockerfile
#
# docker build -t eureka-server-image:1.0 .
#
FROM openjdk:17-jdk-alpine AS builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN rm src/main/resources/bootstrap.yaml
RUN mv src/main/resources/bootstrap-docker.yaml src/main/resources/bootstrap.yaml
RUN chmod +x ./gradlew
RUN dos2unix ./gradlew
RUN ./gradlew bootJar
FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=builder build/libs/*.jar /app/app.jar
EXPOSE 8761
ENTRYPOINT ["java", "-jar", "app.jar"]
dockerfile로 이미지를 생성한다
docker build -f <Dockerfile 경로> -t <이미지 이름> <빌드 컨텍스트 경로>
docker build -f Dockerfile -t eureka-server-image .
container 생성
docker run --network msa-version2 -d -p 8070:8070 --name=eureka-server eureka-server-image
로그 파일 확인
docker logs -f eureka-server
네트워크 설정 확인
- h2, config server가 네트워크에 붙어 있는지 확인
docker network inspect msa-version2
7. Gateway Server
bootstrap-docker.yaml
- docker용 버전을 생성이때 yaml에서 active 설정을 없애야 Dockerfile과 충돌이 일어나지 않는다
- uri는 네트워크에 설정된 config의 주소(config의 컨테이너 명)로 바꾼다
- spring.profile.active는 파일 이름에 명시하면 도커에서 알아서 인식을 하기 때문에 이름에 active 명을 적고 dockerfile에서 active 명을 실행하라고 명령한다
server:
port: 8070
spring:
application:
name: gateway-server
profiles:
# config-server 의 config 폴더 아래에 있는 설정파일 참조시
# gateway-server-local.yaml 파일이 아니라
# gateway-server-docker.yaml 파일을 사용하게 됨.
active: docker
cloud:
config:
# config-server 는 docker 컨테이너명으로서
# docker network 를 사용하게 되면, 컨테이너명을 사용해서
# 동일 도커 네트워크에 있는 서버를 참조할 수 있게 됨.
uri: <http://config-server:8080>
# bootstrap.yaml 의 uri 로는 접속이 되지 않음.
#uri: <http://localhost:8080>
loadbalancer:
ribbon:
enabled: false
Dockerfile
FROM openjdk:17-jdk-alpine AS builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +x ./gradlew
RUN dos2unix ./gradlew
RUN ./gradlew bootJar
FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=builder build/libs/*.jar /app/app.jar
EXPOSE 8070
ENTRYPOINT ["java","-Dspring.profiles.active=docker","-jar","app.jar"]
dockerfile로 이미지를 생성한다
docker build -f <Dockerfile 경로> -t <이미지 이름> <빌드 컨텍스트 경로>
docker build -f Dockerfile -t gateway-server-image .
container 생성
docker run --network msa-version2 -d -p 8070:8070 --name=gateway-server gateway-server-image
로그 파일 확인
docker logs -f gateway-server
네트워크 설정 확인
- h2, config server가 네트워크에 붙어 있는지 확인
docker network inspect msa-version2
8. item service Server
bootstrap-docker.yaml
- docker용 버전을 생성이때 yaml에서 active 설정을 없애야 Dockerfile과 충돌이 일어나지 않는다
- uri는 네트워크에 설정된 config의 주소(config의 컨테이너 명)로 바꾼다
- spring.profile.active는 파일 이름에 명시하면 도커에서 알아서 인식을 하기 때문에 이름에 active 명을 적고 dockerfile에서 active 명을 실행하라고 명령한다
server:
port: 0 # 사용 가능한 port 를 random 하게 설정.
spring:
application:
name: item-service
cloud:
config:
uri: <http://config-server:8080>
loadbalancer:
ribbon:
enabled: false
Dockerfile
FROM openjdk:17-jdk-alpine AS builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +x ./gradlew
RUN dos2unix ./gradlew
RUN ./gradlew bootJar
FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=builder build/libs/*.jar /app/app.jar
EXPOSE 8070
ENTRYPOINT ["java","-Dspring.profiles.active=docker","-jar","app.jar"]
dockerfile로 이미지를 생성한다
docker build -f <Dockerfile 경로> -t <이미지 이름> <빌드 컨텍스트 경로>
docker build -f Dockerfile.item -t item-service-image .
container 생성
docker run --network msa-version2 -d -p 0:0 --name=item-service item-service-image
로그 파일 확인
docker logs -f item-service
네트워크 설정 확인
- h2, config server가 네트워크에 붙어 있는지 확인
docker network inspect msa-version2
9. 통신
eureka server 에 config, item이 넣어 졌다면 post man으로 통신을 한다
locahost/8080/v1/item
'BackEnd' 카테고리의 다른 글
도커와 쿠버네티스 -K8S (Deployment) (0) | 2024.11.14 |
---|---|
도커와 쿠버네티스 -K8S (multi container & replicaset) (0) | 2024.11.11 |
도커와 쿠버네티스 - (h2 + config + service server) (0) | 2024.10.20 |
도커와 쿠버네티스 - (h2+service server) (0) | 2024.10.17 |
도커와 쿠버네티스 -Docker 2 (Config Server) (0) | 2024.10.15 |