docker - spring boot

아침7시개발·2022년 9월 28일
0

docker

목록 보기
1/2

Docker에 spring boot 배포

aws로 test를 해보겠다.
aws 가입과 console 설정은 생략한다.

aws-linux2에서 git, jdk, docker install를 한다.

# ec2 업데이트
sudo yum update -y
# git 설치하기
sudo yum install git
# 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

설치 후 확인

java --version

spring boot application에 Dockerfile을 만든다.

project의 가장 상위에 만든다.

FROM nginx
# nginx에서 8080 port를 80 port에 포워딩하기 위한 설정
ADD ./default.conf /etc/nginx/conf.d/default.conf

application-docker.yml

spring:
  datasource:
    url: jdbc:mariadb://hyeogju_db/hyeogju_schema?serverTimezone=Asia/Seoul&useSSL=false&characterEncoding=utf8

env 파일 추가

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

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

# DB_RUN.sh 에서 사용 되는 DB 기본 정보
# .yml 의 spring.database 정보와 동일
export MARIADB_DATABASE=${APP}_schema
export MARIADB_USER=아이디
export MARIADB_PASSWORD=비밀번호
export DOCKER_DB_PORT=3306
export MARIADB_ROOT_PASSWORD=비밀번호

# 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}

docker_wetwork.sh

. ./000_SET_ENV


docker network create ${APP_NETWORK}

db_run.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" '아이디'@'%';"
echo "grant all privileges on "${MARIADB_DATABASE}.* to" '아이디'@'localhost';"
echo "flush privileges;"
echo "===================="

app_build.sh

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

app_image.sh

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

web_config.sh

. ./000_SET_ENV

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

web_image.sh

. ./000_SET_ENV

docker build -t ${WEB_IMAGE} .

default.cont

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

    server_name localhost;

    location / {
         proxy_pass http://hyeogju_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;
    }
}

docker 설치

sudo yum install docker

# 잘 설치가 되었는지 확인
sudo docker --version

docker-compose 설치

sudo curl -L "https://github.com/docker/compose/releases/download/2.24.5/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

한번에 docker, docker-compose 설치

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

docker-compose.yml

version: '3.7'

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

networks:
  hyeogju_net:

start.sh

./docker_wetwork.sh
./db_run.sh
./app_build.sh
./web_image.sh
./web_config.sh
./web_image.sh

프로젝트 설정

# gradlew의 권한 변경
sudo chmod + ./gradlew

# 빌드
./gradlew build

docker 실행

sudo systemctl start docker

docker 동작 확인

systemctl status docker

docker application 실행

./start.sh
docker-compose up --build -d

docker log 확인

docker logs -f

git hub

깃 주소

profile
쉬엄쉬엄하는 개발자

0개의 댓글