수동 Docker 배포
gradle 빌드 명령어 → jar 파일 생성
# 해당 폴더로 이동
cd {gradlew가 있는 폴더}
# gradlew 실행
./gradlew clean build
# test 건너뛰고 빌드
./gradlew clean build -x test
build.gradle 추가 (
jar {
enabled = false
}
build를 해줘야하기 때문에 수동, 자동 둘다 Dockerfile이 존재해야한다.
# 최신 17-jdk 이미지로 부터 시작
FROM openjdk:17-jdk
# 인자 정리
ARG JAR_FILE=build/libs/*.jar
# 앞에는 HOST OS의 현재 폴더를 의미
# 뒤에는 컨테이너의 현재 폴더(WORKDIR)를 의미
COPY ${JAR_FILE} app.jar
# docker container에서 실행되는 명령어
ENTRYPOINT ["java","-jar","/app.jar"]
Docker hub Repository 생성
이미지 생성
docker build --platform linux/amd64 -t chan1117/book-tory .
Docker push
docker push chan1117/book-tory
EC2 접속
Docker pull
docker pull chan1117/book-tory
Docker hub에 올린 image를 받아오는 작업이다.
Docker run 방식 ( 원하는 방식대로 진행해주면 된다.)
# docker run
docker run -p 8082:8080 chan1117/book-tory
# docker run -d
docker run -d -p 8082:8080 chan1117/book-tory
# nohup
nohup docker run -p 8082:8080 chan1117/book-tory > output.log 2>&1 &
# 실행되는 docker container 확인
docker ps
# docker exited된 containser까지 확인
docker ps -a
- 포그라운드 실행 (docker run -p 8080:8080 chan1117/book-tory):
- 터미널을 점유하며 실행됩니다.
- 컨테이너의 로그가 실시간으로 터미널에 출력됩니다.
- 터미널을 닫으면 컨테이너도 종료됩니다.
- 데몬 모드 실행 (docker run -d -p 8080:8080 chan1117/book-tory):
- 백그라운드에서 실행됩니다.
- 터미널이 즉시 반환되어 다른 작업을 할 수 있습니다.
- 로그는 docker logs 명령어로 확인할 수 있습니다.
- nohup과 & 사용 (nohup docker run -p 8080:8080 chan1117/book-tory > output.log 2>&1 &):
- 터미널을 닫아도 명령어가 계속 실행됩니다.
- 백그라운드에서 실행되며 터미널이 즉시 반환됩니다.
- 로그는 지정한 파일(output.log)에 기록됩니다.
- nohup은 터미널을 닫아도 프로세스가 계속 실행되도록 보장합니다.
git action Docker CI/CD 배포
파일 구조
Docker iamge
전체 코드
name: CI/CD Docker
# 트리거를 수행할 브랜치를 지정합니다.
on:
push:
branches: [ main ]
jobs:
# Spring Boot 애플리케이션을 빌드하여 Docker Hub에 푸시하는 과정
build:
# 최신 Ubuntu 환경에서 실행합니다.
runs-on: ubuntu-latest
steps:
# 소스 코드를 체크아웃합니다.
- uses: actions/checkout@v3
# 1. Java 17 세팅
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# Gradle 테스트를 실행합니다.
- name: Test with Gradle
run: ./gradlew --info test
# 2. Spring Boot 애플리케이션 빌드
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: clean bootJar
# 3. Docker 이미지 빌드
- name: docker image build
run: docker build -t ${{ secrets.DOCKER_USERNAME }}/devops_step1 .
# 4. DockerHub 로그인
- name: docker login
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 5. Docker Hub 이미지 푸시
- name: docker Hub push
run: docker push ${{ secrets.DOCKER_USERNAME }}/devops_step1
deploy:
# build job이 완료된 후에 실행되도록 정의합니다.
needs: build
name: Deploy
# AWS에서 사용할 self-hosted runner와 라벨을 지정합니다.
runs-on: [ self-hosted, label-go ]
steps:
# DockerHub에 로그인합니다.
- name: docker login
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 8080 포트를 80 포트로 매핑하여 Docker 컨테이너를 실행합니다.
- name: Docker run
run: |
sudo docker stop devops_step1 && sudo docker rm devops_step1 && sudo docker rmi ${{ secrets.DOCKER_USERNAME }}/devops_step1:latest
sudo docker run -d -p 8082:8080 --name devops_step1 --restart always ${{ secrets.DOCKER_USERNAME }}/devops_step1:latest
처음 하시는 분들위해 알려드리면 devops_step1 -> < 본인 Docker hub Repository> 로 바꿔주면 된다.
GitHub Actions 워크플로우에서 on: push 설정을 통해 특정 브랜치(main 브랜치)에 push 이벤트가 발생할 때마다 해당 워크플로우가 트리거되도록 설정한 것입니다.
Docker ID & PW Setting
개인적으로 제일 중요!!
runs-on: [ self-hosted, label-go ] 지시어는 GitHub Actions 워크플로우가 실행될 런너를 지정합니다. 여기서 self-hosted와 label-go는 특정한 조건을 만족하는 런너에서만 워크플로우가 실행되도록 설정합니다. AWS에서 셀프 호스팅된 런너를 사용할 때, 특정 레이블을 사용하여 매칭해야 합니다.
셀프 호스팅된 런너와 레이블 사용 목적
- 특정 환경에서의 실행 보장:
- GitHub Actions는 기본적으로 GitHub이 제공하는 호스팅된 런너에서 실행됩니다. 그러나 실제 서버에서 워크플로우를 실행하고 싶은 경우, 셀프 호스팅된 런너를 사용합니다.
- self-hosted 레이블을 사용하여 해당 런너가 GitHub에서 제공하는 것이 아닌, 직접 호스팅한 런너임을 명시합니다.
- 특정 서버에 대한 명시적 지정:
- 여러 셀프 호스팅된 런너가 있는 경우, 특정 작업을 특정 서버에서 실행하고 싶을 때 레이블을 사용합니다.
- label-go와 같은 레이블을 지정하여, 해당 레이블을 가진 런너에서만 작업이 실행되도록 합니다.
Runners Setting
가상 서버 접속 (EC2) - Docker 설치
# sudo -s
sudo -s
# docker 설치
apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
gnupg2 \
jq \
software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce
# 설치 완료 확인, 버전 확인
docker --version
# 1) user 그룹 추가
# ec2 인스턴스 재시작 이후에도 docker 연결이 될 수 있음!
sudo usermod -aG docker ${USER}
# 그룹에 대한 변경 사항을 활성화
newgrp docker
# docker 재시작 -> 안해도 됨!
# sudo systemctl restart docker
or
# 2) /var/run/docker.sock 접근 권한 허용
sudo chmod 666 /var/run/docker.sock (비추)
EC2 - Runners Setting
Download
# Create a folder
$ mkdir actions-runner && cd actions-runnerCopied!# Download the latest runner package
$ curl -o actions-runner-linux-x64-2.317.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.317.0/actions-runner-linux-x64-2.317.0.tar.gzCopied!# Optional: Validate the hash
$ echo "9e883d210df8c6028aff475475a457d380353f9d01877d51cc01a17b2a91161d actions-runner-linux-x64-2.317.0.tar.gz" | shasum -a 256 -c# Extract the installer
$ tar xzf ./actions-runner-linux-x64-2.317.0.tar.gz
- 폴더 생성 및 이동: actions-runner 폴더를 만들고 이동.
- 패키지 다운로드: GitHub에서 최신 러너 패키지를 다운로드.
- 해시 값 검증 (선택 사항): 다운로드한 파일의 무결성을 확인.
- 압축 해제: 러너 패키지의 압축을 해제.
Configure
# Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/BaekSeungChan/devops_file --token AZQDYEL4WPKIU76XR2OTUYTGM2W5E# Last step, run it!
$ ./run.sh ( 중요 )
./run.sh 스크립트를 실행하면 셀프 호스팅된 러너가 시작되지만, 터미널 세션이 종료되면 러너도 종료됩니다. 이를 방지하기 위해 백그라운드에서 실행하거나 시스템 데몬으로 설정할 수 있습니다.
nohup ./run.sh &> nohup.out &
- nohup: 터미널 세션이 종료되어도 명령어가 계속 실행되도록 합니다.
- ./run.sh: 실행할 스크립트입니다. 여기서는 GitHub Actions 러너를 시작하는 스크립트입니다.
- &>: 표준 출력(stdout)과 표준 오류(stderr)를 리디렉션합니다.
- nohup.out: 출력과 오류 로그를 기록할 파일입니다.
- &: 명령어를 백그라운드에서 실행합니다.
tail -f nohup.out
tail -f nohup.out 명령어는 nohup.out 파일의 끝부분을 실시간으로 모니터링하는 데 사용됩니다.
push를 할 때마다 자동으로 배포가 된다.
'AWS' 카테고리의 다른 글
[AWS] IAM 정책 (0) | 2024.06.28 |
---|---|
[AWS] IAM - ID 및 액세스 관리 (0) | 2024.06.28 |
[Cloud] 클라우드 컴퓨팅이란? (1) | 2024.06.28 |
[Cloud] Vue.js & Nginx & Dockerfile ( + Cors 해결 ) - 1탄 (1) | 2024.06.15 |