Msa예제중 프로젝트 하나를 도커 이미지로 생성 후 컨테이너를 실행하는 예제이다.
먼저 프로젝트의 POM.XML에서 jar로 떨어질 버전과 이름을 변경하도록 한다.
<version>1.0</version>
<name>apigateway-service</name>
그후 target과 같은 경로에 Dockerfile을 생성한다.
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY target/apigateway-service-1.0.jar ApiGateway.jar
ENTRYPOINT ["java","-jar","ApiGateway.jar"]
여기서 도커파일이란?
Dockerfile은 DockerImage를 생성하기 위한 스크립트(설정파일)이다.
여러가지 명령어를 토대로 Dockerfile을 작성한 후 빌드하면
Docker는 Dockerfile에 나열된 명령문을 차례대로 수행하며 DockerImage를 생성해준다.
Dockerfile을 읽을 줄 안다는 것은 해당 이미지가 어떻게 구성되어 있는지 알 수 있다는 의미이다.
jar를 로컬에 떨구기 위해 컴파일 하도록 한다.
mvn clean compile package -DskipTests=true
그후 target에 떨어진 jar를 기반으로 도커이미지를 빌드한다.
build --tag leehyunwook/apigateway-service:1.0 .
만들어진 이미지를 도커허브에 푸시한다.
docker push leehyunwook/apigateway-service:1.0
도커 이미지 목록에 추가되었다.
이미지를 바탕으로 컨테이너를 실행시킨다.
docker run -d -p 8000:8000 --network ecommerce-network -e "spring.cloud.config.uri=http://config-service:8888" -e "spring.rabbitmq.host=rabbitmq" \
-e "eureka.client.serviceUrl.defaultZone=http://discovery-service:8761/eureka/" --name apigateway-service leehyunwook/apigateway-service:1.0
해당 프로젝트의 환경변수 경로가 localhost로 되어있는 부분을 컨테이너이름으로 변경하도록 설정한다.
내가 컨테이너를 실행시키기 편하도록 각각 예제프로젝트 환경변수 설정 컨테이너실행만 다 적어두도록 하겠다.
rabbitmq
docker run -d --name rabbitmq --network ecommerce-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
config-service
docker run -d -p 8888:8888 --network ecommerce-network \
-e "spring.rabbitmq.host=rabbitmq" \
-e "spring.profiles.active=default" \
--name config-service leehyunwook/config-service:1.0
discovery-service
docker run -d -p 8761:8761 --network ecommerce-network \
-e "spring.cloud.config.uri=http://config-service:8888" \
--name discovery-service leehyunwook/discovery-service:1.0
apigateway-service
docker run -d -p 8000:8000 --network ecommerce-network -e "spring.cloud.config.uri=http://config-service:8888" -e "spring.rabbitmq.host=rabbitmq" \
-e "eureka.client.serviceUrl.defaultZone=http://discovery-service:8761/eureka/" --name apigateway-service leehyunwook/apigateway-service:1.0
mariadb
FROM mariadb:11.1.2
ENV MYSQL_ROOT_PASSWORD 'password'
ENV MYSQL_DATABASE mydb
COPY ./mysql_data/mysql /var/lib/mysql
EXPOSE 3306
CMD ["--user=root"]
docker run -d -p 3306:3306 --network ecommerce-network --name mariadb leehyunwook/my-mariadb:1.0
USER-SERVICE
docker run -d --network ecommerce-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 "logging.file=/api-logs/users-ws.log" \
edowon0623/user-service
ORDER-SERVIDE
docker run -d --network ecommerce-network \
--name order-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" \
edowon0623/order-service
여기서 로컬 마리아 디비 파일과 도커의 마리아디비 파일을 복사하는데 버전이 다르면 에러가 발생하게된다 그래서 도커파일에 로컬 디비 버전과 똑같이 명시해주도록하고 접속했을경우도 mariadb 명령어를 쓰도록한다. 그리고 3306 포트 강의들으면서 brew services start mariadb를 해놔서 꼭 stop명령어로 꺼줘야 포트충돌이 일어나지 않는다 안꺼주면 명령어로 킬해봤자 무한 재기동되더라...
'Docker' 카테고리의 다른 글
Docker 기본명령어 (1) | 2023.09.19 |
---|---|
Docker의 정의 (0) | 2023.09.19 |