글을 시작하며

[Spring Boot][Seminar-hub][Docker] Dockerfile 활용하여 Spring Boot Project를 Server에 배포해보기 with ShellScript 

 

이번 글은 위의 이전에 Dockerfile을 활용하여 배포해본 기능 추가적인 내용입니다. Docker를 처음 사용한다면, 앞의 내용도 함께 보시는것을 추천합니다.

Docker-Compose 컨테이너 관리툴을 활용하여 컨테이너를 실행시키는 방법에 대하여 담아보도록 하겠습니다. 

 

DockerCompose를 활용하여 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

Before you begin

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

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

- Github Remote 연결되어있는 Directory

Starting

1. Docker-Compose를 설치합니다.

- curl 명령어로 Docker Compose의 최신 버전을 다운로드합니다

- 다운로드한 Docker Compose binary file에 실행 권한을 부여합니다:

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose  //다운로드한 Docker Compose 바이너리에 실행 권한을 부여합니다:
docker-compose --version //Docker Compose 설치를 확인

 

2. dc.sh 배포 스크립트를 생성합니다.

처음에 docker-compose down 으로 이전에 실행중이던 docker-compose를 모두 종료시킵니다.

#!/bin/bash

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

docker-compose down

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 rmi seminarhub-cloud-config-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-config-server
docker build -t 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 rmi seminarhub-cloud-gateway-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-gateway-server
docker build -t 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 rmi seminarhub-cloud-netflix-eureka-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-cloud-netflix-eureka-server
docker build -t 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 rmi seminarhub-member-api-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-member-api-server
docker build -t 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 rmi seminarhub-seminar-api-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-seminar-api-server
docker build -t 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 rmi seminarhub-member-seminar-api-server
cd $REPOSITORY/$PROJECT_NAME/seminarhub-member-seminar-api-server
docker build -t seminarhub-member-seminar-api-server .


docker-compose up -d

 

3. docker-compose.yml 파일을 생성합니다.

- 각 container name을 services 다음 계층에 선언

- 해당 container의

      -image : 사용할 이미지

      -ports : <host port> : <container port> 

      -depends_on : 설정한 컨테이너가 모두 실행된 이후에 시작하도록 합니다.

      -container_name : 컨테이너 이름을 고정시킵니다. 고정시키지 않을경우 -1, -2, -3... 이렇게 늘어납니다.

version: '1'
services:
  seminarhub-cloud-config-server:
    image: seminarhub-cloud-config-server
    ports:
      - "8000:8000"
    restart: always
    container_name: seminarhub-cloud-config-server 

  seminarhub-cloud-netflix-eureka-server:
    image: seminarhub-cloud-netflix-eureka-server
    ports:
      - "8761:8761"
    depends_on:
      - seminarhub-cloud-config-server
    restart: always
    container_name: seminarhub-cloud-netflix-eureka-server 

  seminarhub-cloud-gateway-server:
    image: seminarhub-cloud-gateway-server
    ports:
      - "80:80"
    depends_on:
      - seminarhub-cloud-config-server
    restart: always
    container_name: seminarhub-cloud-gateway-server

  seminarhub-member-api-server:
    image: seminarhub-member-api-server
    ports:
      - "0:0"
    depends_on:
      - seminarhub-cloud-gateway-server
      - seminarhub-cloud-config-server
    restart: always
    container_name: seminarhub-member-api-server 

  seminarhub-seminar-api-server:
    image: seminarhub-seminar-api-server
    ports:
      - "0:0"
    depends_on:
      - seminarhub-cloud-gateway-server
      - seminarhub-cloud-config-server
    restart: always
    container_name: seminarhub-seminar-api-server  

  seminarhub-member-seminar-api-server:
    image: seminarhub-member-seminar-api-server
    ports:
      - "0:0"
    depends_on:
      - seminarhub-cloud-gateway-server
      - seminarhub-cloud-config-server
    restart: always
    container_name: seminarhub-member-seminar-api-server

 

이떄 추가로, AWS 에서 보안그룹의 In-Bound 설정 또한 추가해주어야합니다.

 

글을 끝마추며

Docker-Compose를 활용하여 각 도커 컨테이너 이미지를 실행시키는 과정을 정리해보았습니다.

 

+ Recent posts