MSA Docker 관리하기

14335 단어 msamsa

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

좋은 웹페이지 즐겨찾기