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로 접속하면 접속이 잘 된다.
참고
728x90
'개발 > Docker' 카테고리의 다른 글
[Docker] 도커 컴포즈(Docker-compose) 작성하기 (0) | 2022.12.31 |
---|---|
[Docker] 도커파일(Dockerfile) 작성하기 (0) | 2022.12.30 |
[Docker] 컨테이너 통신하기 (0) | 2022.12.29 |
[Docker] 컨테이너 구조 및 커맨드 사용법 (0) | 2022.12.21 |
[Docker] React 프로젝트를 Docker를 이용해서 배포하기 (1) | 2022.10.06 |