Docker를 통해서 프로젝트 배포하기
도커를 이용하여 프로젝트 배포
아키텍쳐 구성
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
- Resume 서비스와 마찬가지로 kafka ip 가 하드코딩이 되어있기 때문에
- kafka 는 ip 를 고정하여 배포하고 저 부분을 변경을 해줘야 한다.