MSA Docker 관리하기
🔨Network 생성하기
네트워크를 통해 컨테이너를 묶어주면 ip로 따로 통신하지 않고 컨테이너의 이름으로 서로 통신이 가능하게 만들어준다.
docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16 msa-network
위 명령어로 네트워크를 생성할 수 있다.
따로 설정하지 않고 컨테이너를 그냥 실행하면 자동으로 default network가 사용되긴 하지만 서로 묵어두면 더 편리하게 사용가능하다.
네트워크의 상세 정보를 확인하고 싶다면
docker network inspect <컨테이너명>
으로 상세 내용 확인이 가능하다.
[
{
"Name": "jayeon_api_default",
"Id": "31b8fa21e9e30041556ce70784705f034b005960c86569191e5c0b417863a306",
"Created": "2022-02-16T13:51:39.543346708+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"40149ac799316f959be637190592439f3c748092474a09a55250b282238695fc": {
"Name": "jayeon-api",
"EndpointID": "886a8fac5c6b341f1496100ad6d116e1a8f13b6aeb3c63651d36e45415b88bd0",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "jayeon_api",
"com.docker.compose.version": "1.25.0"
}
}
]
상세 내용은 다음과 같이 나오며 Containers 내부에 들어있는 컨테이너끼리 통신이 가능한것이다.
🔨RabbitMQ 컨테이너
docker run -d --name rabbitmq --network msa-network -p 15672:15672 -p 5672:5672 -p 15671:15671 -p 5671:5671 -p 4369:4369 -e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=guest rabbitmq:management
docker run -d --name rabbitmq --network msa-network -p 15672:15672 -p 5672:5672 -p 15671:15671 -p 5671:5671 -p 4369:4369 -e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=guest rabbitmq:management
명령어로 network 부분만 설정을 변경해서 설정해주자.
정상 실행된것을 확인할 수 있다.
[
{
"Name": "msa-network",
"Id": "9e2e44397f95b91be45af42746cfb76713f255e37ec5f50ce44d2c8eabc54d13",
"Created": "2022-03-23T10:52:14.827176592+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"36c678649867f6ef080217c2411f55c818e854dae521a23c2d20b6bc3e06333f": {
"Name": "rabbitmq",
"EndpointID": "414b8ebd065e7ce534c4f5fa85bcf3bf04fa4e363430e0162ae63d69d3cf8044",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
네트워크를 확인하면 컨테이너에 rabbitmq라는 이름의 컨테이너가 추가된것을 확인할 수 있다.
http://ip:15672 로 접근해서
화면이 뜬다면 정상 실행되고 있는 것이다.
🔨Config Server 컨테이너 생성
👉Config 설정 변경 및 Dockerfile 추가
FROM openjdk:11-ea-27-jdk-slim
VOLUME /tmp
# 암호화 키 전달
COPY secretkey.jks secretkey.jks
# jar파일 복사
COPY target/config-service-1.0.jar ConfigServer.jar
ENTRYPOINT ["java","-jar","ConfigServer.jar"]
FROM openjdk:11-ea-27-jdk-slim
VOLUME /tmp
# 암호화 키 전달
COPY secretkey.jks secretkey.jks
# jar파일 복사
COPY target/config-service-1.0.jar ConfigServer.jar
ENTRYPOINT ["java","-jar","ConfigServer.jar"]
다음과 같은 Dockerfile을
config-service 내부에 넣어주고 암호화 키값도 넣어준다.
pom.xml에 version 명시도 변경해준다. 그대로 사용하면 Dockerfile에서 jar 파일 이름을 그대로 변경해서 사용하면 된다.
mvn clean compile package -DskipTests=true
명령어로 package를 해준다. -DskipTests=true
는 테스트 코드 실행을 안하겠다는 건데 꼭 안해도 된다.
그럼 정상적으로 jar 파일이 생성되었다.
👉Dockerfile build하기
docker build -t ililil9482/config-service:1.0 .
명령어를 실행하면 다음과 같이 정상적으로 build되어지고 tag까지 달린것을 확인할 수 있다.
docker push <이미지명>:<태그>
명령어로 docker hub에 올려주고
정상적으로 hub에 올라갔다.
docker run -d -p 8888:8888 --network ecommerce-network -e "spring.rabbitmq.host=rabbitmq" -e "spring.profiles.active=default" --name config-service 아이디/config-service:1.0
그 후에 위 명령어로 container를 실행해도 되지만 너무 명령어가 복잡해서
version: '3.7'
services:
config:
image: "ililil9482/config-service:1.0"
container_name: config
ports:
- 8888:8888
environment:
- spring.rabbitmq.host=rabbitmq
- spring.profile.active=default
- spring.cloud.config.server.git.uri=$git uri$
- spring.cloud.config.server.git.username=$git username$
- spring.cloud.config.server.git.password=$git password$
networks:
default:
external:
name: msa-network
docker-compose로 작성해봤다.
정상적으로 실행되고
network에도 추가된것을 확인할 수 있다.
네트워크를 통해 container명으로 연결이 됨은 추후에 ip번호가 변경된다 할지라도 network 설정만 동일하게 되어 있다면 자동으로 연결될 수 있음을 뜻한다.
실제로 접근해봐도 잘 나온다.
👉key 위치 변경
encrypt:
# key: junoprojectsecretkey123 #대칭키에 사용되는 key 값
key-store:
# location: file:///C:\2022\keystore\secretkey.jks
location: file:/secretkey.jks
password: test1234
alias: secretkey
config-service
의 bootstrap.yml 파일을 확인하면 위치가 window 기준인데 docker container 기준으로 변경해주어야 한다.
🔨Discovery 컨테이너 생성
jar파일의 버전을 변경해주고
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY target/ecommerce-1.0.jar EcommerceServer.jar
ENTRYPOINT ["java","-jar","EcommerceServer.jar"]
/에 Dockerfile
을 생성해준다.
mvn clean compile package
명령어로 jar 파일을 만들고
docker build -t ililil9482/ecommerce-server:1.0 .
명령어로 태그를 달아서 이미지를 생성한다.
잘 생성되었다.
docker push ililil9482/ecommerce-server:1.0
docker login 명령어로 로그인 후 push로 올려보자
version: '3.7'
services:
discovery:
image: "ililil9482/ecommerce-server:1.0"
container_name: discovery
ports:
- 8761:8761
networks:
default:
external:
name: msa-network
그리고 docker-compose.yml을 작성하여 실행해 보자.
docker run -d -p 8761:8761 --network msa-network -e "spring.cloud.config.uri=http://config-service:8888" --name discovery <아이디>/ecommerce-server:1.0
혹은 docker 명령어로 실행시켜도 된다.
그후에 http://${ip}:8761로 접근하면 Eureka서버가 항상 떠있는 것을 확인할 수 있다.
Gateway Server 컨테이너 생성
pom을 수정해주고
mvn clean compile package
명령어로 jar 파일을 만들고
docker build -t ililil9482/gateway:1.0 .
명령어로 태그를 달아서 이미지를 생성한다.
docker push ililil9482/gateway:1.0
hub에 올리고
docker run -d -p 8000:8000 --network ecommerce-network -e "spring.cloud.config.uri=http://config:8888" -e "spring.rabbitmq.host=rabbitmq" -e "eureka.client.serviceUrl.defaultZone=http://discovery:8761/eureka/" --name gateway <아이디>/apigateway-service:1.0
명령어 혹은
version: '3.7'
services:
gateway:
image: "ililil9482/gateway:1.0"
container_name: gateway
ports:
- 8000:8000
environment:
- spring.rabbitmq.host=rabbitmq
- spring.cloud.config.uri=http://config:8888
- eureka.client.serviceUrl.defaultZone=http://discovery:8761/eureka/
networks:
default:
external:
name: msa-network
docker-compose.yml로 실행하자.
aws 무료 인스턴스로 진행할 경우 여기까지만 진행해도 인스턴스가 터질수도 있다... 참고로 내꺼가 터짐 ㅎㅎ
Author And Source
이 문제에 관하여(MSA Docker 관리하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ililil9482/MSA-Docker-관리하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)