본문 바로가기

👩‍💻 BackEnd/🚛 도커 [Docker]

[Docker] 10/19 - 서비스 위치 확인 : 서비스 디스커버리

- 클라우드 기반 애플리케이션 서비스 디스커버리가 중요한 이유 

- 서비스 디스커버리와 로드밸런서의 장단점 

- 스프링 넷플릭스 유레카 서버 설정 

- 유레카에 스프링 부트 마이크로 서비스 등록 

- 클라이언트 측 로드 밸런싱을 위한 스프링 클라우드 로드 밸런서 라이브러리 사용 


$ docker ps  // 현재 실행 중인 컨테이너 확인 

$ cd chapter6 // chapter6 들어가기

minhee@DESKTOP-68EJ19D:~/chapter6$ ll
total 28
drwxr-xr-x  4 minhee minhee 4096 Oct 19 10:34 ./
drwxr-x--- 24 minhee minhee 4096 Oct 19 10:34 ../
drwxr-xr-x  7 minhee minhee 4096 Oct 19 10:34 Final/   // 여기에 들어가야 함. 
drwxr-xr-x  6 minhee minhee 4096 Oct 19 10:34 Initial/
-rw-r--r--  1 minhee minhee 3763 Dec  6  2022 README.md
-rw-r--r--  1 minhee minhee 6474 Dec  6  2022 chapter6.postman_collection.json

minhee@DESKTOP-68EJ19D:~/chapter6$ cd Final/
minhee@DESKTOP-68EJ19D:~/chapter6/Final$ ll
total 36
// 각각 서버로 올릴 프로젝트 파일들이 있음. 
drwxr-xr-x 7 minhee minhee 4096 Oct 19 10:34 ./
drwxr-xr-x 4 minhee minhee 4096 Oct 19 10:34 ../
-rw-r--r-- 1 minhee minhee  573 Dec  6  2022 build-for-m1.sh
drwxr-xr-x 5 minhee minhee 4096 Oct 19 10:41 configserver/
drwxr-xr-x 2 minhee minhee 4096 Oct 19 10:34 docker/
drwxr-xr-x 5 minhee minhee 4096 Oct 19 10:43 eurekaserver/
drwxr-xr-x 5 minhee minhee 4096 Oct 19 10:48 licensing-service/
drwxr-xr-x 5 minhee minhee 4096 Oct 19 10:50 organization-service/
-rw-r--r-- 1 minhee minhee 1345 Dec  6  2022 pom.xml
// 정의된 모든 서비스 또는 프로젝트를 한 번에 컨테이너로 올리는 명령
$ docker-compose up


## docker-compose.yml 내용 ## 
version: '2.1'
services:
  database:
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
      POSTGRES_DB:       "public"
    volumes:
        - ./init.sql:/docker-entrypoint-initdb.d/1-init.sql
        - ./data.sql:/docker-entrypoint-initdb.d/2-data.sql
    networks:
      backend:
        aliases:
          - "database"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
  configserver:
    image: ostock/configserver:0.0.1-SNAPSHOT
    ports:
       - "8071:8071"
    environment:
      ENCRYPT_KEY: "fje83Ki8403Iod87dne7Yjsl3THueh48jfuO9j4U2hf64Lo"
    networks:
      backend:
        aliases:
          - "configserver"
  eurekaserver:
    image: ostock/eurekaserver:0.0.1-SNAPSHOT
    ports:
      - "8070:8070"
    depends_on:
      database:
        condition: service_healthy
      configserver:
        condition: service_started  
    networks:
      backend:
        aliases:
          - "eurekaserver"
  licensingservice:
    image: ostock/licensing-service:0.0.3-SNAPSHOT
    environment:
      PROFILE: "dev"
      CONFIGSERVER_URI: "http://configserver:8071"
      CONFIGSERVER_PORT:   "8071"
      DATABASESERVER_PORT: "5432"
      ENCRYPT_KEY:       "IMSYMMETRIC"
    depends_on:
      database:
        condition: service_healthy
      configserver:
        condition: service_started
    ports:
      - "8080:8080"
    networks:
      - backend
  organizationservice:
    image: ostock/organization-service:0.0.1-SNAPSHOT
    environment:
      PROFILE: "dev"
      CONFIGSERVER_URI: "http://configserver:8071"
      CONFIGSERVER_PORT:   "8071"
      DATABASESERVER_PORT: "5432"
      ENCRYPT_KEY:       "IMSYMMETRIC"
    depends_on:
      database:
        condition: service_healthy
      configserver:
        condition: service_started
    ports:
      - "8081:8081"
    networks:
      - backend

networks:
  backend:
    driver: bridge

위의 코드에서 볼 수 있듯이 docker-compose.yml에는 각각 서비스 및 설정 정보들이 포함되어있다. 

따라서 compose up 할때는 docker-compose.yml 파일이 있는 

 

\\wsl.localhost\Ubuntu-22.04\home\minhee\chapter6\Final\docker 

이 경로에서 docker-compose up 을 해야한다. 

 


첫번째 오류 

 

두번째 오류 

데이터베이스 설정 정보를 잘못 적어서 발생한 오류 이를 public 으로 수정하자 오류 해결 

설정의 경우에는 configserver 파일 -> config파일 내부에 organization-service-dev.properties 파일 수정 

 

 

 

docker-compose up 이 잘 안될 때 
minhee@DESKTOP-68EJ19D:~/chap05/docker$ docker-compose down
minhee@DESKTOP-68EJ19D:~/chap05/docker$ docker-compose up

 

 

 

configserver 컨테이너 생성 

minhee@DESKTOP-68EJ19D:~/chapter6/Final/configserver$ ./mvnw package dockerfile:build

유레카 서버에서도 컨테이너 생성 ./mvnw package dockerfile:build 

chmod 700 mvnw

minhee@DESKTOP-68EJ19D:~/chapter6/Final/eurekaserver$ ./mvnw package dockerfile:build 

 

dockercompose up

 

 

 

 

다른 터미널 창 에서 docker ps 로 실행중인 컨테이너 확인 
minhee@DESKTOP-68EJ19D:/mnt/c/WINDOWS/system32$ docker ps
CONTAINER ID   IMAGE                                        COMMAND                  CREATED         STATUS                   PORTS                                       NAMES
7c88adf6d27c   ostock/licensing-service:0.0.3-SNAPSHOT      "java -cp app:app/li…"   2 minutes ago   Up 2 minutes             0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   docker_licensingservice_1
90f8d3474bb6   ostock/eurekaserver:0.0.1-SNAPSHOT           "java -cp app:app/li…"   2 minutes ago   Up 2 minutes             0.0.0.0:8070->8070/tcp, :::8070->8070/tcp   docker_eurekaserver_1
ee7da99cfdc4   ostock/organization-service:0.0.1-SNAPSHOT   "java -cp app:app/li…"   2 minutes ago   Up 2 minutes             0.0.0.0:8081->8081/tcp, :::8081->8081/tcp   docker_organizationservice_1
2e06b610ae7a   ostock/configserver:0.0.1-SNAPSHOT           "java -cp app:app/li…"   2 minutes ago   Up 2 minutes             0.0.0.0:8071->8071/tcp, :::8071->8071/tcp   docker_configserver_1
663c746cc6d8   postgres:latest                              "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes (healthy)   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp   docker_database_1

 

 

.mvn/과 mvnw는 Maven 프로젝트의 빌드와 관리를 돕는 두 가지 다른 요소입니다.

  1. .mvn/:
    • 이것은 .mvn 디렉토리입니다. 보통 Maven 프로젝트의 루트 디렉토리에 위치합니다.
    • 이 디렉토리는 Maven Wrapper 스크립트와 프로젝트 특정 설정을 포함합니다.
    • .mvn/wrapper/ 디렉토리에는 Maven Wrapper라는 도구가 포함되어 있으며, 이를 사용하면 Maven을 프로젝트에 설치하지 않고도 프로젝트를 빌드할 수 있습니다. Maven Wrapper는 프로젝트에 대한 Maven 버전을 관리하고 프로젝트에 해당 버전을 사용하도록 보장합니다.
  2. mvnw:
    • mvnw 파일은 Maven Wrapper 스크립트를 나타냅니다. 이 스크립트는 Maven을 로컬 시스템에 설치하지 않고도 프로젝트를 빌드하고 Maven 명령을 실행할 수 있게 해줍니다.
    • mvnw 스크립트는 .mvn/wrapper/ 디렉토리에서 가져온 Maven Wrapper와 함께 사용됩니다. 이 스크립트를 실행하면 Maven Wrapper를 사용하여 프로젝트를 빌드하고 Maven 명령을 수행할 수 있습니다.

요약하면, .mvn/ 디렉토리는 Maven 프로젝트의 설정과 Maven Wrapper 스크립트를 포함하며, mvnw는 이러한 Maven Wrapper 스크립트를 실행하는 데 사용됩니다. Maven Wrapper는 프로젝트에 Maven을 설치할 필요 없이 일관된 환경에서 프로젝트를 빌드하도록 도와줍니다.

 

도커 내부의 IP

유레카 -> 서비스에 대한 정보 

컨피스서버 -> 초기 세팅 값 받아옴

서비스들이 살아있다고 등록하기 위해 유레카에 등록 

어느 서버에 있는지 IP가 나옴. 

 

 

 

 

spring:
  application:
    name: eureka-server
  boot:
    admin:
      context-path: /admin
server:
  port: 8070
eureka:
  instance:
    hostname: eurekaserver
  client:
    registerWithEureka: false   // endUser에게 공개하지 않겠다는 의미 configserver는 유레카에 등록 안하겠다는 의미 
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    waitTimeInMsWhenSyncEmpty: 5
      
      
management:
  endpoints:
    web:
      exposure:
        include: "*"
package com.optimagrowth.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer  // 이걸 써 줘야 함. 
public class EurekaServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication.class, args);
	}

}

클라이언트

다운로드 받는 것 

서버

리본은 제외 

 

spring:
    application:
     name: organization-service 
    profiles:
      active: dev  // organization-service 로 부터 개발 환경을 받아올 것 
    cloud:
        config: 
            uri: http://configserver:8071

service : 운영환경

dev : 개발환경 

http://localhost:8080/v1/organization/e839ee96-28de-4f67-bb79-870ca89743a0/license/279709ff-e6d5-4a54-8b55-a5c37542025b/feign

 

\\wsl.localhost\Ubuntu-22.04\home\minhee\chapter6\Final\licensing-service\src\main\java\com\optimagrowth\license

 

 

-- 

서버리스 : 클라우드에서 미리 환경을 만들어놓고 코드만 입력하면 REST API 서비스를 바로 돌려줌.  

JAR파일

가상 머신 자원의 할당을 관리해 미리 설정된 서버리스 코드를 실행시키는 기술을 의미 

 

ssh > auth > 1번째 꺼 클릭 > key 파일 선택 

 

 

 

ec2-user

 

public ip로 접속 

계정 ec2-user

인스턴스 중지로 멈춰야 함. 

종료는 안됨. 

 

중지 누르면 

탄력적 IP 데이터베이스는 주소를 고정시키는 것이 좋음

접속할때마다 바뀌면 접속이 안되니까