3 분 소요

도커를 이용하여 프로젝트 배포

아키텍쳐 구성

Unknown

1. docker network 생성

  • 도커를 통해서 컨테이너가 실행이 된다며 각각의 ip 주소를 할당 받는다.
  • 마이크로 서비스는 서로 통신을 해야하므로 ip 주소를 알아야 한다.
  • 이 때 네트워크를 사용한다면 ip 주소가 아닌 이름으로 통신이 가능하다.
docker network create --gateway 172.18.0.1 --subnet 172.18.0.0/16 resume-network
  • 네트워크를 생성 시에 gateway 와 subnet 을 지정을 해준다.

2. Redis

docker run -d --name redis --network resume-network -p 6379:6379 redis
  • 이름을 redis 라고 지정을 한다. –> 컨테이너 이름 뿐만아니라 네트워크안에서도 이름이 부여가 된다.
  • 이전에 만든 네트워크에 포함을 한다.
  • 포트 포워딩을 한다.
  • 마지막에는 사용하고 싶은 이미지를 기재한다. tag 명시가 없다면 최신 버전을 받아온다.

3. rabbitmq

  • spring cloud bus 를 통한 설정 최신화 작업을 할 때 rabbitmq 서비스를 사용한다.
docker run -d --name rabbitmq --network resume-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
  • rabbitmq 는 5개의 포트 포워딩이 필요하다.
  • 또한 비밀번호와 아이디를 디폴트 값인 guest 로 지정한다.

4. config-service

[도커 파일 만들기]

  • 일단 config-service 를 이미지 화 해야 한다.
  • 프로젝트에 target 과 같은 위치에 Dockerfile 을 생성한다.
  • 빌드를 지정한 이름으로 빌드한다.
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY /target/config-service-1.0.jar ConfigServer.jar
ENTRYPOINT ["java", "-jar", "ConfigServer.jar"]
  • FROM openjdk:17-ea-11-jdk-slim : 자바 17버전을 슬림 버전으로 가져온다.
  • VOLUME /tmp : 도커는 volume 옵션이 없다면 컨테이너 내부에 데이터를 저장한다. 볼륨 옵션을 사용하여서 컨테이너 외부의 디렉토리에 저장을 하게 한다.
  • COPY /target/config-service-1.0.jar ConfigServer.jar : target 폴더에 프로젝트가 빌드가 되어있다. 이 jar 파일을 복사하여서 오른쪽에 지정한 이름으로 이미지를 만든다.
  • ENTRYPOINT [“java”, “-jar”, “ConfigServer.jar”] : run 할 시에 실행될 명령어 이다.

[이미지 생성하기]

docker build -t kms199711/config-service:1.0 .
  • 빌드를 하여 이미지를 생성한다.
  • -t : 이름을 부여한다. 개인 저장소에 push 를 하고 싶다면 아이디를 명시해야한다.
  • . : 현재 디렉토리의 dockerfile 찾아서 빌드한다.
  • 빌드를 한 후에 push 를 한다.

[이미지 실행하기]

docker run -d -p 8888:8888 --network resume-network \
 -e "spring.rabbitmq.host=rabbitmq" \
  --name config-service kms199711/config-service:1.0
  • config-service 의 yml 파일에는 rabbitmq 의 호스트 정보가 필요하다.
  • 따라서 환경변수를 추가하여서 호스트 정보를 알려준다.

$$ 5. Service Discovery

docker run -d -p 8761:8761 --network resume-network \
 --name discovery-service kms199711/discovery-service:1.0

6. Apigateway

  • 마찬가지로 이미지를 생성을 한다.
  • 실행 하기
docker run -d -p 8000:8000 --network resume-network \
 -e "spring.cloud.config.uri=http://config-service:8888" \
 -e "spring.rabbitmq.host=rabbitmq" \
 -e  spring.redis.host=redis \
 -e  spring.redis.port=6379 \
 -e "eureka.client.serviceUrl.defaultZone=http://discovery-service:8761/eureka/" \
 --name apigateway-service \
 kms199711/apigateway-service:1.0

7. Mariadb

FROM mariadb
ENV MYSQL_DATABASE mydb
ENV MYSQL_ROOT_PASSWORD test1357
EXPOSE 3306

[도커 파일 생성]

  • 도커에서 mariadb 를 생성한다면 mariadb 만 실행이 되는 개념이 아니라
  • 하나의 가상 os 안에 maridb 가 실행이 되는 것이다.
  • ENV MYSQL_DATABASE mydb : 이러면 mydb 를 생성을 해준다.
  • 여기서는 ENTRYPOINT 를 사용하면 에러가 나는 경우도 있다.

[확인]

  • docker exec -it mariadb bash 로 들어가서
  • mysql -u root -p 로 접속한다.

[추가 설정]

  • grant all privileges on . ‘root’@’%’ identified by ‘test1357’;
  • localhost 에서만 접속이 가능하게 하는 것이 아니라 비밀번호마 맞다면 다 접속하도록 한다.

kafka

version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
    restart: unless-stopped

  kafka:
    build: .
    ports:
      - "9092"
    environment:
      DOCKER_API_VERSION: 1.22
      KAFKA_ADVERTISED_HOST_NAME: 192.168.99.100
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped

zipkin

docker run -d -p 9411:9411 \
 --network resume-network \
 --name zipkin \
 openzipkin/zipkin 

8. Prometheus

docker run -d -p 9090:9090 \
 --network resume-network \
 --name prometheus \
 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
 prom/prometheus 
  • 프로메테우스를 이용할 시에 어디서 정보를 가져올 지 정해야 했다.
  • 그 때 볼륨 옵션을 통해서 사용한다.
  • 볼륨 옵션을 통해서 컨테이너의 /etc/prometheus/prometheus.yml 파일을 대신해서 로컬에 /path/to/prometheus.yml 를 사용한다.

grafana

docker run -d -p 3000:3000 \
 --network resume-network \
 --name grafana \
 grafana/grafana 

9. UserService

docker run -d --network resume-network \
  --name user-service \
 -e "spring.cloud.config.uri=http://config-service:8888" \
 -e "spring.rabbitmq.host=rabbitmq" \
 -e "spring.zipkin.base-url=http://zipkin:9411" \
 -e "eureka.client.serviceUrl.defaultZone=http://discovery-service:8761/eureka/" \
 -e  spring.redis.host=redis \
 -e  spring.redis.port=6379 \
 -e "logging.file=/api-logs/users-ws.log" \
 kms199711/user-service:1.0

10. ResumeService

docker run -d --network resume-network \
  --name resume-service \
 -e "spring.zipkin.base-url=http://zipkin:9411" \
 -e "eureka.client.serviceUrl.defaultZone=http://discovery-service:8761/eureka/" \
 -e "spring.datasource.url=jdbc:mariadb://mariadb:3306/mydb" \
 -e "logging.file=/api-logs/orders-ws.log" \
 kms199711/resume-service

11. CategoryService

image

  • Resume 서비스와 마찬가지로 kafka ip 가 하드코딩이 되어있기 때문에
  • kafka 는 ip 를 고정하여 배포하고 저 부분을 변경을 해줘야 한다.

태그: ,

카테고리:

업데이트: