프로젝트 배포 전 테스트

남예준·2025년 10월 13일

AWS EC2 인스턴스 만들기.

리전은 서울.

우분투 24.0.2였나

storage 30G

등등

탄력적 IP 주소 할당

Swap memory 생성

cd /
# swap file을 생성해준다. 메모리 확인 시 swap이 있었지만 디렉토리 파일은 만들어야 한다고 함
sudo mkdir /var/spool/swap
sudo touch /var/spool/swap/swapfile

# dd 명령어는 디스크나 파티션의 복사, 이미지 파일 생성, 디스크 작업을 수행하게 함
# https://www.itmaya.co.kr/wboard/view.php?wb=tech&idx=58
# /dev/zero 파일을 입력 대상으로하고 swapfile을 출력 대상으로 한다.
# dd 명령어를 통해 원하는 블록의 크기만큼 새로운 파티션의 0x00을 채워넣기 위해 /dev/zero를 쓴다.
# 2048000만큼 블록 수를 복사하고 한 번에 1KB를 읽고 쓰게 한다. -> 2G 바이트인가 파일을 만든 거
sudo dd if=/dev/zero of=/var/spool/swap/swapfile count=2048000 bs=1024

# swapfile을 설정한다.
sudo chmod 600 /var/spool/swap/swapfile
sudo mkswap /var/spool/swap/swapfile
sudo swapon /var/spool/swap/swapfile

# swapfile을 등록한다.
sudo vim /etc/fstab
# 파일이 열리면 해당 파일 아래쪽에 하단 내용 입력 후 저장
/var/spool/swap/swapfile    none    swap    defaults    0 0

# free로 확인
free -h

TimeZone 변경

timedatectl # 현재 확인
timedatectl list-timezones | grep Seoul # 있는지 확인
sudo timedatectl set-timezone Asia/Seoul
timedatectl

Docker 설치

  1. 우분투 시스템 패키지 업데이트
sudo apt-get update
  1. 필요한 패키지 설치
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  1. Docker의 공식 GPG키를 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. Docker의 공식 apt 저장소를 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  1. 시스템 패키지 업데이트
sudo apt-get update
  1. Docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io
  1. 도커 실행상태 확인
sudo systemctl status docker
  1. 도커 실행
sudo docker run hello-world

ubuntu 유저 도커 그룹에 추가

도커 소켓에 접근 권한이 없어서 로그인이고 리포지토리 보는 거고 다 안됨

sudo usermod -aG docker ubuntu

newgrp docker

Github Action

deploy.yml을 .github/workflow/ 위치에 작성해준다.

name: Java CI with Gradle

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
    - uses: actions/checkout@v4 ## 코드 가져오기
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'

    - name: Make Gradle Wrapper Executable
      run: chmod +x ./gradlew

    - name: Build with Gradle Wrapper
      run: ./gradlew build -x test

    - name: Set up Docker Buildx # Docker Buildx를 설정 -> 도커 이미지를 빌드하기 위한 빌더로, 여러 플랫폼에서 빌드를 수행한다.
      uses: docker/setup-buildx-action@v3

    - name: Login to Docker Hub # 도커허브에 로그인한다.
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKERHUB_ID }}
        password: ${{ secrets.DOCKERHUB_PW }}
        
    - name: Build and Push Docker Image # 도커 이미지 빌드 및 허브에 이미지 Push
      uses: docker/build-push-action@v5
      with:
        context: . # 현재 디렉토리
        file: ./Dockerfile # 사용할 도커파일 위치
        push: true
        tags: ${{ secrets.DOCKERHUB_ID }}/just_one_bite:latest

    - name: Deploy to Server # appleboy/ssh-action@master 를 통해 서버에 SSH 접속을 수행하고 deploy.sh 스크립트를 실행해 배포를 진행
      uses: appleboy/ssh-action@v0.1.10
      env:
        DOCKERHUB_ID: ${{ secrets.DOCKERHUB_ID }}
        DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
      with:
        host: ${{ secrets.SERVER_HOST }}
        username: ${{ secrets.SERVER_USER }}
        key: ${{ secrets.SERVER_SSH_KEY }}
        envs: DOCKERHUB_ID, DOCKERHUB_PW
        script: |
          cd /home/ubuntu/deploy
          ./deploy.sh

gradlew 권한 변경

저기 actions의 환경 내에서 변환해줘야 한다. 안그러면 permission denied 뜬다.

Docker Hub

docker 허브를 gmail로 로그인하니까 cli로 로그인이 안된다.

그냥 아이디를 새로 하나 팠다

그리고 repository를 하나 만들어준다.

아이디/repo명:태그 이 이름으로 이미지가 올라가게 해놨다.

Secrets 등록

Settings > Secrets and variables > actions > new repository secret

Docker file 작성

git action 에서 CI를 해서 build test를 해봤다. 고로 그냥 CD의 과정만 진행했다.

jar 파일만 가지고 이미지를 만들기로 한 것이다!

# 1. JDK 이미지 기반
FROM eclipse-temurin:17-jdk-jammy

# 2. 작업 디렉토리 설정
WORKDIR /app

# 3. 로컬에서 빌드한 jar 파일을 컨테이너에 복사
COPY build/libs/*.jar ~.jar

# 4. 포트 설정 (Spring Boot 기본 8080)
EXPOSE 8080

# 5. 컨테이너 시작 시 실행할 명령
ENTRYPOINT ["java", "-jar", "~.jar"]

Ubuntu 내에 환경 설정

이게 우분투 내에서 환경설정을 해놓음.

환경변수로 $DOCKERHUB_ID 등을 만들어놨는데 git action에서 읽지를 못하는 상황을 발견

    - name: Deploy to Server # appleboy/ssh-action@master 를 통해 서버에 SSH 접속을 수행하고 deploy.sh 스크립트를 실행해 배포를 진행
      uses: appleboy/ssh-action@v0.1.10
      env:
        DOCKERHUB_ID: ${{ secrets.DOCKERHUB_ID }}
        DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
      with:
        host: ${{ secrets.SERVER_HOST }}
        username: ${{ secrets.SERVER_USER }}
        key: ${{ secrets.SERVER_SSH_KEY }}
        envs: DOCKERHUB_ID, DOCKERHUB_PW
        script: |
          cd /home/ubuntu/deploy
          ./deploy.sh
          docker info | grep Username

env를 등록하려면 이렇게 해야 동작하더라는…

deploy.sh 작성

#!/bin/bash

echo $DOCKERHUB_PW | docker login --username $DOCKERHUB_ID --password-stdin

docker pull username/reponame:tag

if [ $(docker ps -aq -f name=spring-app) ]; then
        docker stop spring-app
        docker rm spring-app
fi

docker run -d \
        --name spring-app \
        -p 8080:8080 \
        username/reponame:tag

얼추 컨테이너가 실행되는 것은 볼 수 있다.

그런데 application.yml에 설정과 안맞아서 에러나고 바로 꺼지는 걸 볼 수 있다.

PostgreSQL Docker로 띄우기

docker pull postgres:15.1

docker run -p 5432:5432 --name postgres \
-e POSTGRES_PASSWORD=~ \
-e TZ=Asia/Seoul \
-v /home/ubuntu/pgdata:/var/lib/postgresql/data \
-d postgres:15.1

이제 우리 프로젝트를 가지고 와서 띄워보자

자바 설치

sudo apt install openjdk-21-jdk-headless

프로젝트 가져오기

파일질라로 갖고와서 application.properties 작성 후 빌드 수행

chmod 754 ./gradlew
./gradlew clean build

jar 파일로 도커 이미지 생성 및 컨테이너 실행

# 1. JDK 이미지 기반
FROM openjdk:21-jdk

# 2. 작업 디렉토리 설정
WORKDIR /app

# 3. 로컬에서 빌드한 jar 파일을 컨테이너에 복사
COPY build/libs/*SNAPSHOT.jar app.jar

# 4. 포트 설정 (Spring Boot 기본 8080)
EXPOSE 8080

# 5. 컨테이너 시작 시 실행할 명령
ENTRYPOINT ["java", "-jar", "app.jar"]

docker build -t test-app .

docker run -d --name test-app -p 8080:8080 test-app

도커 네트워크 연결 안됨 문제

도커 네트워크를 커스텀으로 안만들고 bridge로 사용하면 컨테이너 이름으로 컨테이너를 참조하는 게 불가능했다.

그래서

docker network create custom-net
docker network connect custom-net postgres
docker run -d --name test-app -p 8080:8080 --network custom-net test-app

이제 DB 연결까지 된 것을 볼 수 있다.

  • 문제 원인 ✅
    • Spring Boot 컨테이너가 postgres라는 호스트명을 못 찾음 → UnknownHostException
    • 기본 bridge 네트워크에서는 컨테이너 이름이 DNS처럼 동작하지 않음
  • 해결 방법 ✅
    • 사용자 정의 브리지 네트워크를 만들어서 Spring Boot와 Postgres를 같은 네트워크에 넣음
    • 그 결과 지금처럼 postgres라는 이름으로 접근 가능
  • 로그 확인 ✅
    • HikariCP 시작 완료
    • EntityManagerFactory 초기화 완료
    • Tomcat 정상 기동 → DB 연결 성공

0개의 댓글