개발/Docker

[Docker] Spring 프로젝트를 Docker를 이용해서 배포하기

devhooney 2022. 10. 5. 10:53
728x90

Docker를 이용해서 Spring 프로젝트를 배포해보려 한다.

먼저 AWS 계정이 있어야하고, 인스턴스가 있어야한다.

 

1. ec2를 업데이트하고 프로젝트를 받기 위해 git을 설치 한다.

# ec2 업데이트
sudo yum update -y

# git 설치하기
sudo yum install git

 

2. 자바를 설치한다.

# aws coreetto 다운로드
sudo curl -L https://corretto.aws/downloads/latest/amazon-corretto-11-x64-linux-jdk.rpm -o jdk11.rpm

# jdk11 설치
sudo yum localinstall jdk11.rpm -y

# jdk version 선택
sudo /usr/sbin/alternatives --config java

# java 버전 확인
java --version

# 다운받은 설치키트 제거
rm -rf jdk11.rpm

 

3. 프로젝트 경로 중 build.gradle과 같은 경로에 Dockerfile을 생성해서 아래 코드를 넣어준다.

# Docker를 올릴 때 jdk11 버전을 이용
FROM openjdk:11

EXPOSE ${SPRINGBOOT_PORT}

ADD ./build/libs/*.jar app.jar

# 도커파일이 도커엔진을 통해서 컨테이너로 올라갈 때, 
# 도커 컨테이너의 시스템 진입점이 어디인지를 알려준다.
ENTRYPOINT ["java", "-jar", "-Duser.timezone=Asia/Seoul", "/app.jar"]

 

4. docker_script 폴더를 생성 후 000_SET_ENV 파일을 생성한다.

# 어플리케이션 이름
export APP=ghma

# 스프링부트에서 사용하는 포트
# .yml 의 server.port 정보와 동일
export SPRINGBOOT_PORT=8080

# DB_RUN.sh 에서 사용 되는 DB 기본 정보
# .yml 의 spring.database 정보와 동일
export MARIADB_DATABASE=${APP}_schema
export MARIADB_USER=ghma
export MARIADB_PASSWORD=ghma
export DOCKER_DB_PORT=3306
export MARIADB_ROOT_PASSWORD=1234

# DB_RUN.sh 에서 DB schema 정보 저장 위치
# 컨테이너가 삭제되더라도 데이터를 유지할 수 있는 효과
export LOCAL_DB_PATH=/build/DB/mariadb
#export LOCAL_DB_PATH=/Users/seungchulpark/APP/db/mysql

# APP_RUN.sh 에서 springboot 적용 profile 정의
# 다수개를 사용할 경우 docker, ssh 와 같은 방식으로 사용
SPRING_PROFILES_ACTIVE=docker

# WEB_RUN.sh 에서 외부에서 접근하는 포트를 정의
DOCKER_WEB_PORT=80

########## ########## ##########

# 어플리케이션 이미지 이름
export APP_IMAGE=${APP}_app_image

# 웹서버 이미지 이름
export WEB_IMAGE=${APP}_web_image

# 도커에서 불리는 어플리케이션 이름
DOCKER_APP=${APP}

# 도커에서 불리는 디비 이름
export DOCKER_DB=${APP}_db

# 도커에서 불리는 웹서버 이름
export DOCKER_WEB=${APP}_web

# network between nginx and springboot and db
export APP_NETWORK=${APP}_net

# name of springboot in docker
export DOCKER_WAS=${APP}

 

5. 001_DOCKER_NETWORK.sh

. ./000_SET_ENV


docker network create ${APP_NETWORK}

 

6. 002_DOCKER_NETWORK.sh

. ./000_SET_ENV

docker run -d --name ${DOCKER_DB} \
    --network ${APP_NETWORK} \
    -e MARIADB_DATABASE=${MARIADB_DATABASE} \
    -e MARIADB_USER=${MARIADB_USER} \
    -e MARIADB_PASSWORD=${MARIADB_PASSWORD} \
    -e MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD} \
    -v ${LOCAL_DB_PATH}:/var/lib/mariadb \
    mariadb

echo "===================="
echo "db schema script"
echo "docker exec -it " ${DOCKER_DB} " bash"
echo "grant all privileges on "${MARIADB_DATABASE}.* to" 'ghma'@'%';"
echo "grant all privileges on "${MARIADB_DATABASE}.* to" 'ghma'@'localhost';"
echo "flush privileges;"
echo "===================="

 

7. 003_1_APP_BUILD.sh

. ./000_SET_ENV
cd ..
./gradlew -x test build

 

8. 003_2_APP_BUILD.sh

. ./000_SET_ENV
cd ..
docker build -t ${APP_IMAGE} --build-arg SPRINGBOOT_PORT=${SPRINGBOOT_PORT} .

 

9. 004_1_WEB_CONFIG.sh

. ./000_SET_ENV

echo "nginx 파일 생성"
envsubst < default-template.conf | sed -e 's/§/$/g' > default.conf

 

10. 004_2_WEB_IMAGE.sh

. ./000_SET_ENV

docker build -t ${WEB_IMAGE} .

 

11. 111_START_ALL.sh

./001_DOCKER_NETWORK.sh
./002_DB_RUN.sh
./003_1_APP_BUILD.sh
./003_2_APP_IMAGE.sh
./004_1_WEB_CONFIG.sh
./004_2_WEB_IMAGE.sh

 

12. default.conf 

server {
    listen 80;
    listen [::]:80;

    server_name localhost;

    location / {
         proxy_pass http://ghma_net:8080;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header Host $http_host;
    }
}

 

13. Dockerfile 생성

FROM nginx

ADD ./default.conf /etc/nginx/conf.d/default.conf

 

14. docker-compose.yml

version: '3.7'

services:
  web:
    image: ghma_web_image
    networks:
      - ghma_net
    ports:
      - "80:80"
    links:
      - was:ghma
    restart: always # 종료될 시 재시작
    entrypoint:
      - "nginx"
      - "-g"
      - "daemon off;"
    depends_on: # nginx가 실행 되기전에 was가 컨테이너로 올라와야 함
      - was
  was:
    image: ghma_app_image
    networks:
      - ghma_net
    restart: always # 종료될 시 재시작
    environment:
      - SPRING_PROFILES_ACTIVE=docker # application-docker.yml을 사용하기 위한 프로파일
    links:
      - db:ghma_db
    entrypoint:
      - "java"
      - "-jar"
      - "-Duser.timezone=Asia/Seoul"
      - "/app.jar"
    depends_on:
      - db # was가 실행 되기전에 db가 컨테이너로 올라와야 함
  db:
    image: mariadb
    networks:
      - ghma_net
    restart: always
    environment:
      - MARIADB_DATABASE=ghma_schema
      - MARIADB_USER=ghma
      - MARIADB_PASSWORD=ghma
      - MARIADB_ROOT_PASSWORD=1234
    #volumes:
    #  - /build/DB/mariadb:/var/lib/mariadb
    ports:
      - "3306:3306"

networks:
  ghma_net:

 

- 폴더 안 내용

 

 

15. 도커 설치

sudo yum install docker

 

- docker 실행

sudo systemctl start docker

 

- 실행 확인

systemctl status docker

 

- 권한 추가

sudo chmod 666 /var/run/docker.sock

 

 

16. docker-compose 설치

sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

 

 

17. git clone 후 docker_script 권한 주기

graldw 권한 먼저 주기

sudo chmod 777 gradlew

 

docker_script 경로로 이동 후

sudo chmod 777 *

 

 

18. 이미지 생성

./111_START_ALL.sh

 

19. docker-compose 실행

# docker-compose를 백그라운드에서 동작시키기
docker-compose up --build -d

 

20. 탄력적 IP로 접속하면 접속이 잘 된다.

 

 

 

참고

https://velog.io/@18k7102dy/Docker-Spring-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-Docker%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EB%B0%B0%ED%8F%AC%ED%95%B4%EB%B4%85%EC%8B%9C%EB%8B%A4

 

[Docker] Spring 프로젝트를 Docker를 이용해서 배포해봅시다

docker-compose를 이용해서 배포해보자!

velog.io

 

728x90