글을 시작하며

Docker Container 배포

이번 글에서는 제가 개발하고 있는 Spring MSA Project 구조의 프로젝트를 AWS EC2에 Docker를 활용하여 배포해보는 과정을 담아보려고 합니다. 

Docker EC2에 배포할 서비스는 다음과 같습니다.

  • seminarhub--cloud-config-server
  • seminarhub-cloud-gateway-server
  • seminarhub-cloud-netflix-eureka-server
  • seminarhub-member-api-server
  • seminarhub-seminar-api-server
  • seminarhub-member-seminar-api-server

위의 6가지 서버들은 각각의 Docker 컨테이너로써 작동하게 될 것이며, Docker를 활용하여 작업할때 발생하는 수동적인 부분들과 public Repository를 활용하면서 발생하는 보안적인 측면들을 고려하며 쉘 스크립트를 활용해보았습니다.

Before you begin

시작하기에 앞서서 필요한 서버세팅이 존재합니다.

- Docker가 설치되어 동작하는 호스트서버

Starting

1. Github를 pull 받을 디렉토리에 git init & git remote add origin 명령어로 해당 디렉토리를 연결시킵니다.

git init // github 연결 초기화 세팅
git remote add origin (github https 주소)

저 같은경우 아래 사진과 같이 

Git Remote 저장소 위치 : [ec2-user@seminarhub app/repo/] 로 설정했습니다.

이후에 deploy 쉘 스크립트를 짤떄 해당 dir의 위치를 사용할 것입니다.

현재 그림에서 존재하는 각 yml 파일들은 본인의 프로젝트 세팅에 맞추어서 가져오시면 됩니다.

 

2. 각각 배포할 프로젝트의 DockerFile을 생성합니다.

 

예시. Seminarhub-cloud-config-server의 Dockerfile 입니다. 이외의 다른 모든 서버 또한 아래의 Dockerfile과 유사합니다.

FROM openjdk:17-jdk-slim
COPY /build/libs/*.jar seminarhub-cloud-config-server-0.0.1-SNAPSHOT.jar
COPY /src/main/resources/application.yml /application.yml
ENTRYPOINT ["java", "-jar", "/seminarhub-cloud-config-server-0.0.1-SNAPSHOT.jar", "--spring.config.location=classpath:/application.yml"]

 

위의 코드에서 3번째를 보면, application.yml을 복사해와서 container 안에 복사시키고 있습니다.

application.yml에는 개발자가 숨기고 싶어하는 DB와의 연결정보 등이 있을 수 있으므로 1번 이미지에서처럼 미리 yml을 server에 넣어두었습니다.

이후에 yml 파일은 아래의 배포스크립트를 통해 해당 프로젝트에 복사시킬 것 입니다.

 

3. 서버에 배포할떄 가장 중요한 script 파일입니다. 

Script 파일을 통해 github 프로젝트를 가져오고, 해당 프로젝트를 build 한뒤, 이전에 실행중이던 도커 컨테이너와 컨테이너 이미지를 삭제한뒤 새로 Dockerfile을 build하고 원하는 포트에 맞게 포워딩한뒤 실행시킵니다.

본인의 Home 경로를 알지못한다면 echo $HOME 으로 알 수 있습니다.

REPOSITORY=/home/ec2-user/app/repo
PROJECT_NAME=seminar-hub

cd $REPOSITORY/$PROJECT_NAME/

echo "> Git Pull"

git fetch --all && git reset --hard origin/master && git pull

echo "> Project Build Started"

chmod +x ./gradlew 
chmod 755 $REPOSITORY/$PROJECT_NAME

cd $REPOSITORY/$PROJECT_NAME/
./gradlew seminarhub-cloud-config-server:build
sudo mkdir -p ./seminarhub-cloud-config-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-cloud-config-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-config-server/src/main/resources/application.yml
docker rm -f seminarhub-cloud-config-server
docker rmi seminarhub-cloud-config-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-config-server
docker build -t seminarhub-cloud-config-server .
docker run -d -p 8000:8000 --name seminarhub-cloud-config-server seminarhub-cloud-config-server


cd $REPOSITORY/$PROJECT_NAME
./gradlew seminarhub-cloud-gateway-server:build -x test
sudo mkdir -p ./seminarhub-cloud-gateway-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-cloud-gateway-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-gateway-server/src/main/resources/application.yml
docker rm -f seminarhub-cloud-gateway-server
docker rmi seminarhub-cloud-gateway-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-gateway-server
docker build -t seminarhub-cloud-gateway-server .
docker run -d -p 80:80 --name seminarhub-cloud-gateway-server seminarhub-cloud-gateway-server



cd $REPOSITORY/$PROJECT_NAME
./gradlew seminarhub-cloud-netflix-eureka-server:build -x test
sudo mkdir -p ./seminarhub-cloud-netflix-eureka-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-cloud-netflix-eureka-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-netflix-eureka-server/src/main/resources/application.yml
docker rm -f seminarhub-cloud-netflix-eureka-server
docker rmi seminarhub-cloud-netflix-eureka-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-netflix-eureka-server
docker build -t seminarhub-cloud-netflix-eureka-server .
docker run -d -p 8761:8761 --name seminarhub-cloud-netflix-eureka-server seminarhub-cloud-netflix-eureka-server


cd $REPOSITORY/$PROJECT_NAME
./gradlew seminarhub-member-api-server:build -x test
sudo mkdir -p ./seminarhub-member-api-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-member-api-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-member-api-server/src/main/resources/application.yml
docker rm -f seminarhub-member-api-server
docker rmi seminarhub-member-api-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-member-api-server
docker build -t seminarhub-member-api-server .
docker run -d -p 0:0 --name seminarhub-member-api-server seminarhub-member-api-server

cd $REPOSITORY/$PROJECT_NAME
./gradlew seminarhub-seminar-api-server:build -x test
sudo mkdir -p ./seminarhub-seminar-api-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-seminar-api-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-seminar-api-server/src/main/resources/application.yml
docker rm -f seminarhub-seminar-api-server
docker rmi seminarhub-seminar-api-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-seminar-api-server
docker build -t seminarhub-seminar-api-server .
docker run -d -p 0:0 --name seminarhub-seminar-api-server seminarhub-seminar-api-server

cd $REPOSITORY/$PROJECT_NAME
./gradlew seminarhub-member-seminar-api-server:build -x test
sudo mkdir -p ./seminarhub-member-seminar-api-server/src/main/resources
sudo cp $REPOSITORY/seminarhub-member-seminar-api-server-application.yml $REPOSITORY/$PROJECT_NAME/seminarhub-member-seminar-api-server/src/main/resources/application.yml
docker rm -f seminarhub-member-seminar-api-server
docker rmi seminarhub-member-seminar-api-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-member-seminar-api-server
docker build -t seminarhub-member-seminar-api-server .
docker run -d -p 0:0 --name seminarhub-member-seminar-api-server seminarhub-member-seminar-api-server

 

 

 

4. 이렇게 실행할경우 아래와 같이 

$ docker ps 로 현재 실행중인 도커 컨테이너들을 확인할 수 있습니다.

 

 

 

글을 끝마추며

Docker 명령어를 활용하여 각 프로젝트를 build하는 과정을 정리해보았습니다.

+ Recent posts