MSA Docker 관리하기

최준호·2022년 3월 24일
0

Microservice Architecture

목록 보기
31/32
post-thumbnail

🔨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

명령어로 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"]

다음과 같은 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 무료 인스턴스로 진행할 경우 여기까지만 진행해도 인스턴스가 터질수도 있다... 참고로 내꺼가 터짐 ㅎㅎ

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글