[E-commerce App] Docker Container를 이용한 애플리케이션 배포 - 6. User Microservice
이전 글에 이어서 진행해보자.
우선, 지금까지 도커 컨테이너를 이용해 배포한 서비스들은 아래와 같다.
Docker Container
10. user-service
1) 구성 정보 파일(.yml
) 변경
review
이전에config-service
를 도커 컨테이너로 실행할 때 커맨드는 아래와 같았다.$ docker run -d -p 8888:8888 --network ecommerce-network \ -e "spring.rabbitmq.host=rabbitmq" \ -e "spring.profiles.active=default" \ --name config-service ln8847/config-service:1.0
이 때,
-e
옵션을 이용해spring.profiles.active
를native
가 아닌default
로 설정했기 때문에
현재 구성 정보는 remote repository(깃허브)에서 읽어오고 있다.
그럼 이제 user-service
를 인텔리제이로 열어 application.yml
과 bootstrap.yml
파일을 확인해보자.
따라서 현재 구성 정보는 remote repository(깃허브)에 있는 user-service.yml
파일에서 읽어오고 있다.
이를 웹 브라우저에서 확인해보면,
위 사진처럼 해당 깃 레포지토리에 있는 user-service.yml
에서 읽어오고 있음을 알 수 있다.
그런데, 위 사진에서 보면 gateway.ip
가 127.0.0.1
이다.
🌟 이를 gateway-service
컨테이너가 사용하고 있는 IP Address로 바꿔야 한다!
gateway-service
컨테이너가 사용 중인 IP Address는 아래 커맨드로 확인할 수 있다.
$ docker network inspect ecommerce-network
이제 user-service.yml
파일의 gateway.ip
를 아래처럼 172.18.05
로 변경한 뒤에 깃 레포지토리에 push 하자.
user-service.yml
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb
username: sa
password: '{cipher}AQCgo+KT8kG9ISz3Rr0FEG2uoOR9jJXhjMzbTWgcDQtTh4rShUrj3KtiOfFaN8Gk/MoJeyszPKouvCrQihy1SyVjNiZuGaIXkk2bf4HTMayE4IP1xvLF7nOEHbvxuZR6dv2UUVK2eJcQ+bskIk9+fBjVL9C4t1Gw/VDA9rMVzu55VYcsdsRSEnIfSCUlOzaWaH0XsuiDbZ5UI1LxqEB3hXLkazCWkahj2jFoKElzZ1kZ/QRnOFQTtXrv3jtf0P0ytwTVBqEa5Gjz4JJLr3tybc7i0avs+tqXjWKj35C/3Aq+sDH1L3sl+JNns4QiDclTpHTt+wDg/pqlg2MhZ0HAOIJNBtuP5P/qk6Pwk0fCUyWhuifmOMo9OuBBZowXsMk0Hqg='
token:
expiration_time: 864000000
secret: '{cipher}AQA4EotojUaSDNpQ5raB7YyPaZ+kOFdojsDz4UCo/cjHnAjQgZDrZFFvJxFPvYgNAUzQb2RJENdTsMai3WOhWxSJPWaWG/0l4qD3El0/eslslIfuvGMyrwTBaE97M05q/wRmjfBL/uW0pKmjAzNXX3NkGlVezq5HoNr+k9f4FEhz6CEdSnRsOndLkMr9AwOZFFzp1E/jCHdrQ80AZKdMPpCZLR8sSU/NZa28jL9odkKKGggJ6IFKTEBAIRbUwuHZX1jS+j9ugv+U6sD+QtzGEiNl0yoqoAeC52kfLJRsWS9JpA1HEJ0m+J2Bk4v7M37TtOXtPXJmsqEPuBNhLLuK48zN1nz9HKIqlMCc6J6Lr4v479l9c/73dtXNZNCgV609uzwWqTqa6/p1TiuH4NJszJyp'
gateway:
ip: 172.18.0.5 # 🌟 127.0.0.1 -> 172.18.0.5 변경
order-service:
url: http://ORDER-SERVICE/order-service/%s/orders
exception:
order-is-empty: User's order is empty.
변경 후 add - commit - push 까지 마쳤다.
다시 웹 브라우저에서 확인해보면, 아래와 같이 변경되어 있을 것이다.
2) Dockerfile을 통해 이미지 만들기
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY target/user-service-0.0.1-SNAPSHOT.jar UserService.jar
ENTRYPOINT ["java","-jar","UserService.jar"]
3) 이미지 빌드 및 도커 허브에 업로드
# 최신 버전으로 컴파일
$ mvn clean compile package -DskipTests=true
# clean은 기존 파일을 지운다.
# package 옵션으로 jar 파일까지 생성할 수 있다.
# 테스트 코드는 skip
# 이미지 파일 빌드
$ docker build -t ln8847/user-service:1.0 .
# 생성된 이미지 확인
$ docker images | grep user-service
# 도커 허브에 업로드
$ docker push ln8847/user-service:1.0
4) 도커 컨테이너 실행
기존의 application.yml
에서 127.0.0.1
혹은 localhost
를 사용하고 있는 부분을 -e
옵션을 통해 도커 컨테이너의 이름으로 바꿔서 실행하자.
$ docker run -d --network ecommerce-network \
-e "spring.cloud.config.uri=http://config-service:8888" \
-e "spring.rabbitmq.host=rabbitmq" \
-e "spring.zipkin.base-url=http://zipkin:9411" \
-e "eureka.client.serviceUrl.defaultZone=http://service-discovery:8761/eureka/" \
-e "logging.file=/api-logs/users-ws.log" \
--name user-service \
ln8847/user-service:1.0
logging.file
을 지정함으로써, user-service
도커 컨테이너 내부에 /api-logs/users-ws.log
위치에 로그를 저장할 수 있다.
네트워크를 확인해보자.
$ docker network inspect ecommerce-network
로그를 확인해보자.
$ docker logs user-service
bootstrap
정보도 잘 가지고 오고 별다른 에러도 발생하지 않는다.
참고
로그를 확인할 때-f
옵션을 붙이게 되면, 로그가 실시간으로 콘솔에 찍힌다.
(종료할 때에는ctrl
+c
)$ docker logs -f user-service
http://127.0.0.1:8761
에 접속해 user-service
가 잘 기동되었는지 확인해보자.
🌟 참고
만약, 도커 컨테이너를 이용해user-service
기동한 후에 구성 정보(user-service.yml
)를 변경했다면,
Spring Cloud Bus를 이용해 변경 사항을 일괄 적용할 수 있다.
💛 개인 공부 기록용 블로그입니다. 👻