티스토리 뷰
이제 가장 기본적인 Service중 하나인 Config-Service를 배포하려 합니다.
#사전 준비 & Dockerfile 생성
먼저 해야할 작업으로 Config-Service에서 저희는 인증을 위한 apiEncrytionKey라는 key-store를 제작한적 있는데, 해당 파일을 복사하는 작업을 먼저 진행해야 합니다. 참조할 Key 파일이 없다면, 당연히 시작부터 막히게 됩니다.
Bootstrap.yml 파일을 보시면 다음과 같이 해당 키의 위치가 명시되어 있습니다.
다음과 같이 복사한 JKS파일을 config-service에 붙혀넣기 해줍니다.
다음으로는 Dockerfile 생성을 해줍니다. 확장자에 주의해주세요. Dockerfile은 확장자가 없습니다.
그리고 아래와 같이 작성을 해줍니다.
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY apiEncryptionKey.jks apiEncryptionKey.jks
COPY target/config-service-1.0.jar ConfigServer.jar
ENTRYPOINT ["java","-jar","ConfigServer.jar"]
다음으로는 Jar File의 이름의 길이를 줄이기 위해서
version을 1.0으로 변경해줍니다. Pom.xml에 상단에 groupId 탭 아래에 있습니다.
<groupId>com.example</groupId>
<artifactId>config-service</artifactId>
<version>1.0</version>
<name>config-service</name>
#Jar Compile
가장 먼저 Config-Service 프로젝트로 이동을 해준 뒤
Compile Command를 통해서 JarFile을 생성해줍니다.
mvn clean compile package -DskipTests=true
-DskipTests 옵션은 Compile 시 테스트를 스킵하는 옵션입니다.
#Docker Build
다음으로는 Build를 통해서 Docker File을 Build하려 합니다. 마찬가지로 cmd의 위치가 해당하는 Service와 일치해야 합니다. Build를 통해서 Image를 생성해줍니다. 맨뒤에 . 은 위치를 표시합니다. 무조건 붙혀야해요!!
docker build -t ggpark0315/config-service:1.0 .
그럼 다음과 같이 config-service가 Image 등록되었음을 확인할 수 있습니다.
#Docker Run
그리고 다음과 같은 명령어로 Docker Container를 생성합니다.
docker run -d -p 8888:8888 --network ecommerce-network -e "spring.rabbitmq.host=rabbitmq" -e "spring.profiles.active=default" --name config-service ggpark0315/config-service:1.0
-p 옵션이 핵심인데, 외부에서도 해당 포트에서 접속 할 수 있도록 8888포트를 개방하는 작업정도로 생각해줍니다. 8888포트는 저희가 지정한 Default Port입니다. Application.yml 파일에서 확인 할 수 있어요!
그리고 Configuration Service에서는 직접 RabbitMQ의 Port로 접속하는 부분이 있습니다.
마찬가지로 Application.yml 파일에서 작성되었는데, 현재 RabbitMQ IP는 172.18.0.2 입니다. Application의 참조 아이피를 보면 127.0.0.1 이네요...?
spring:
application:
name: config-server
profiles:
active: native
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
변경이 필요해보입니다. 하지만 바꾸지 않아도 됩니다! 왜냐면 저희가 옵션에서 -e"spring.rabbitmq.host=rabbitmq" 옵션을 통해서 이미 변경된 상태로 실행이 되거든요! 이렇게 하면 Docker에서 어떤 IP를 할당해주든 rabbitmq의 IP를 자동으로 할당해주기에 일일히 확인할 필요도 없습니다!! 필수적인 옵션 중 하나입니다.
그럼 언급한 김에 rabbitmq라는 값은 어디서 가져올까요?
아래의 커맨드를 활용해 RabbitMQ의 주소정보를 불러옵니다.
docker network inspect ecommerce-network
여기서 Name값을 활용해 해당 IP값을 불러왔던 거에요!
근데 여기서 한가지 문제가 발생합니다.
application.yml 과 bootstrap.yml파일을 참조하시면 아시겠지만, 기준자체가 아예 다른 OS라고 봐도 되기 때문에 절대 참조하지 못합니다. 그렇기에 수정이 필요합니다. 먼저 KeyFile은 복사를 통해 Container가 실행된 시점에 있는 폴더에 생성이 됩니다. 그래서 아래와 같이 bootstrap.yml을 수정하면 됩니다.
#bootstrap.yml
encrypt:
key-store:
# location: file:///${user.home}/Desktop/Work/keystore/apiEncryptionKey.jks
location: file:/apiEncryptionKey.jks
password: test1234
alias: apiEncryptionKey
그리고 Application.yml에서 Repo는 Git과 연동을 통해서, Git에서 받아오게하면 어디서든 같은 주소로 접속 할 수 있습니다. 하지만 조금 오래전에 작성했기에 최신화가 필요한데... 이미 Native에 절여져 버려서, 저 자신의 도움을 빌렸습니다.
Git Hub Repository 활용방법
처음으로 아래와 같은 순서로 add와 커밋을 해줍니다.
git add
git commit -m "update"
일단 repo가 연결이 되어있는지 확인하고 Native-Repository에 있는 파일을 모두 복사한 뒤 git-local-repo에 붙혀넣기 해줍니다. 마지막으로 Push를 하게된다면, git hub에 Push가 됩니다.
다만 Native-Repository도 없다면, 제 repository가 Public으로 되어 있을테니 제 Repository의 주소를 활용해도 됩니다
https://github.com/ggpark9703/spring-cloud-config
#application.yml
다음과 같이 주석처리되어있던 git-hub연동 부분을 다시 주석해제한 뒤 연동이 되도록 활성화를 시켜줍니다.
spring:
application:
name: config-server
profiles:
active: native
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
cloud:
config:
server:
native:
search-locations: D:\native-file-repo
git:
uri: https://github.com/ggpark9703/spring-cloud-config.git
# username:
# password:
application.yml과 bootstrap.yml 파일이 변경이 됐으므로 image를 Rebuild 해줘야합니다. 번거롭지만 이렇게 했던 이유는 어디서 문제가 발생하는지 정확히 알기 위해서 입니다.
mvn clean compile package -DskipTests=true
docker build --tag ggpark0315/config-service:1.1
//Container ID 확인
docker ps -a
// 기존 Container 제거
docker rm -f [Container ID]
// 새롭게 Rebuild
docker run -d -p 8888:8888 --network ecommerce-network -e "spring.rabbitmq.host=rabbitmq" -e "spring.profiles.active=default" --name config-service ggpark0315/config-service:1.1
#마치며 ..
이번시간에는 Config-Server를 Container화를 시켜봤습니다.
그 과정에서 발생한 이슈까지 처리해 봤는데, 처음부터 정답이 아닌, 오답으로 진행한 이유는 Docker의 특성을 알아야 될 것 같아서 입니다. Docker는 독립된 Container입니다.
일반적으로 D드라이브나 C드라이브안에 있는 파일을 참조할 수 없고, 자신만의 저장공간이 존재하기 때문에 해당 공간에 위치를 시켜줘야합니다. 그렇기에 저번에 배웠던 git이 유용하게 작용하기 시작합니다. git의 주소는 Cloud와 비슷하기에 제약을 받지 않으니 어디서든 활용이 가능하니까요!
감사합니다.
- Total
- Today
- Yesterday
- MariaDB
- 루틴기록
- Spring + ELK
- 운동일기
- ACTUATOR
- Gateway
- zipkin
- Logstash 활용
- Kafka Connect
- Logstash to ElasticSearch
- github
- MSA
- producer
- springcloud
- JWT
- elasticSearch
- 오늘저녁 삼겹살
- UserService
- 미래의나에게동기부여
- Feign
- config
- 운동
- git
- docker
- consumer
- rabbitmq
- LoadBalancer
- kafka
- prometheus
- 빅-오
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |