본 플젝은 스프링부트를 사용했으며 깃헙 액션을 통해 도커허브에 이미지를 푸시하고 ec2에서 이미지를 실행시키는 방식이다.
1. 도커 파일 생성
스프링 프로젝트가 빌드된 jar 파일을 도커 이미지로 생성한 후 이를 이용하기 위한 도커 파일
FROM openjdk:11 # jdk 11 version use
EXPOSE 8080 #port: 8080
ARG JAR_FILE=build/libs/*.jar # 빌드 결과물을 JAR_FILE에 저장
COPY ${JAR_FILE} app.jar # 빌드된 파일을 app.jar에 카피
ENTRYPOINT ["java","-jar","-Duser.timezone=Asia/Seoul","-Dspring.profiles.active=dev","/app.jar"]
# 생성된 이미지를 컨테이너로 실행하는 시점에 app.jar 실행
# Duser.timezone : 타임 존 지정
# Dspring.profiles.active=dev : 환경정보를 가져 올 때 ~.dev.~파일에서 가져온다.
2. nginx 설정
-1) default.conf
server {
# http port 번호
listen 80;
server_name teampple.site;
# /api 로 시작되는 location -> 하단 설정값 사용
# 프로젝트에 baseurl 명시 필요
location /api {
# http://{도커_호스트네임}:{port} 으로 패싱
proxy_pass http://backend-dev:8080;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_redirect off;
}
}
-2) 도커 파일
FROM nginx:1.21.4 # Nginx version
COPY ./default.conf /etc/nginx/conf.d/default.conf
3. 도커 컴포즈 파일 생성
하나의 서비스에는 다양한 컨테이너가 실행되어야 한다. 예를 들어 was, 데이터베이스 등등
여러 컨테이너들을 하나로 묶어 서비스를 실행하기 위해서 도커 컴포즈 파일을 생성한다.
서비스는 해당 프로젝트의 도커 이미지인 backend-dev와 nginx를 올려준다.
version: "3"
services:
# container_name
backend-dev:
# dockerhub image 주소
image: squirmm/teampple-server-dev:dev
container_name: backend-dev
hostname: backend-dev
expose:
- "8080"
nginx:
# 서비스 종속관계 명시
# 다른 컨테이너들도 포함 가능
depends_on:
- backend-dev
restart: always
# 빌드 조건 명시
build:
dockerfile: Dockerfile
context: ./config/nginx
ports:
- "80:80"
※ ports, expose 차이
ports는 외부 컨테이너에서 80 포트로 진입 시 80 포트로 넘겨준다는 뜻이며,
expose는 같은 호스트 안에 있는 내부 컨테이너에서만 8080 포트로 진입할 수 있다는 뜻이다.
웹서버인 Nginx는 문지기와 같은 역할을 한다.
다시말해, 모든 외부 컨테이너의 접근은 Nginx에서 받아 준 후 location 설정 값에 맞춰 패싱이 된다.
4. deploy.sh 파일 생성
#!/bin/bash
# Installing docker engine if not exists
if ! type docker > /dev/null
then
echo "docker does not exist"
echo "Start installing docker"
sudo apt-get update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
apt-cache policy docker-ce
sudo apt install -y docker-ce
fi
# Installing docker-compose if not exists
if ! type docker-compose > /dev/null
then
echo "docker-compose does not exist"
echo "Start installing docker-compose"
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
fi
5. 깃헙 액션 생성
-0) 설정
name: Deploy to Dev
# 액션 조건
on:
# 푸시 했을 때
push:
# branch : dev
branches: [ "dev" ]
# only readable
permissions:
contents: read
-1) 도커 허브에 올리기
jobs:
build:
# ec2 intance Image
runs-on: ubuntu-latest
steps:
# java 버전 설정
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
# gradle 세팅
- name: Cache Gradle packages
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
restore-keys: ${{ runner.os }}-gradle-
# 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Copy properties files
- name: Make application-dev.yml
run: |
touch ./src/main/resources/application-dev.yml
echo "$PROPERTIES_DEV" > ./src/main/resources/application-dev.yml
# Make env file
env:
PROPERTIES_DEV: ${{ secrets.PROPERTIES_DEV }}
# jar 파일 생성
- name: Build with Gradle
run: ./gradlew build -x test
- name: Docker meta
id: docker_meta
uses: crazy-max/ghaction-docker-meta@v1
with:
images: squirmm/teampple-server-dev
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
# 도커 허브 로그인
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 도커 허브 푸시
- name: Docker build & push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
push: true
tags: ${{ steps.docker_meta.outputs.tags }}
-2) 서버에서 이미지를 풀 받아서 사용하기
# ec2 서버 접속 및 dir 생성
- name: create remote directory
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST_DEV }}
username: ubuntu
key: ${{ secrets.KEY_DEV }}
script: mkdir -p ~/srv/ubuntu
- name: copy source via ssh key
uses: burnett01/rsync-deployments@4.1
with:
switches: -avzr --delete
remote_path: ~/srv/ubuntu
remote_host: ${{ secrets.HOST_DEV }}
remote_user: ubuntu
remote_key: ${{ secrets.KEY_DEV }}
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST_DEV }}
username: ubuntu
key: ${{ secrets.KEY_DEV }}
script: |
sh ~/srv/ubuntu/config/scripts/deploy.sh
sudo docker stop $(sudo docker ps -a -q)
sudo docker rm $(sudo docker ps -a -q)
sudo docker rmi $(sudo docker images -q)
sudo docker-compose -f ~/srv/ubuntu/docker-compose.yml pull
sudo docker-compose -f ~/srv/ubuntu/docker-compose.yml up --build -d
0,1,2를 모두 합쳐 하나의 파일로 만들면 된다.
'👩💻 개발 > 📡 DEVOPS' 카테고리의 다른 글
[DevOps] SpringBoot + GitHub action + Nginx + AWS 배포 - 3 (0) | 2023.02.24 |
---|---|
[DevOps] SpringBoot + GitHub action + Nginx + AWS 배포 - 2 (0) | 2023.02.22 |
[DevOps] Github Actions란? (0) | 2023.02.20 |
[Nginx] Nginx란? (0) | 2022.12.26 |
[Docker] 도커 컴포즈란? (1) | 2022.12.23 |