pkch
아래는 제공된 자바 애플리케이션 배포 방식에 대한 상세 설명과 그 원리를 정리한 내용입니다.
- 전체 배포 프로세스 개요
이 스크립트는 로컬에서 애플리케이션을 빌드하고, Docker 이미지를 생성한 후, 해당 이미지를 tar 파일로 저장하여 원격(EC2) 서버로 전송한 뒤, 원격 서버에서 Docker Compose를 이용해 컨테이너를 재시작하는 방식으로 배포를 진행합니다.
즉, 빌드 → 테스트 → Docker 이미지 생성 → 이미지 tar 파일 생성 → 파일 전송 → 원격 서버에서 이미지 로드 및 컨테이너 재시작의 순서로 진행됩니다.
- 세부 구성 요소 및 동작 원리
2.1 Dockerfile (Java 애플리케이션)
FROM amazoncorretto:17.0.7-alpine COPY ./build/libs/homepage-application-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app.jar"]
• 베이스 이미지: Amazon Corretto 17 (Java 17 기반, Alpine 버전)
• 애플리케이션 복사: 빌드된 JAR 파일을 app.jar로 컨테이너 내부에 복사
• 포트 노출: 8080 포트를 외부에 노출
• 실행 커맨드: JAVA_OPTS 환경 변수에 설정된 옵션을 사용해 java -jar /app.jar 명령을 실행
2.2 docker-compose.yml (서비스 정의)
services: mysql: container_name: pyungkang-mysql image: mysql:8.0.27 platform: linux/amd64 command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_bin restart: always ports:
- 13306:3306
environment:
MYSQL_ROOT_PASSWORD:
MYSQL_USER: pyungkang MYSQL_PASSWORD: MYSQL_DATABASE: pyungkang TZ: Asia/Seoul volumes: - ./mysql/volumes/var/lib/mysql:/var/lib/mysql
- ./mysql/volumes/etc/mysql/conf.d:/etc/mysql/conf.d
pyungkang: container_name: pyungkang-api image: pyungkang-church:1.0.2 build: context: . expose:
8080 ports:
80:8080 environment:
TZ=Asia/Seoul
JAVA_OPTS= -Dspring.profiles.active=prod -Xmx256m -Xms256m -verbose:gc -XX:+PrintGCDetails --add-opens=java.base/java.lang=ALL-UNNAMED -Djdk.attach.allowAttachSelf=true volumes:
/etc/localtime:/etc/localtime
./logs/pyungkang:/var/log
• mysql 서비스: MySQL 데이터베이스를 실행하며, 문자셋과 콜레이션 설정, 포트 매핑, 볼륨 마운트를 통해 데이터와 설정을 유지 • pyungkang 서비스: 위에서 생성된 Java 애플리케이션 이미지를 사용 • 빌드 옵션: 로컬 빌드도 가능하지만, 주로 이미지를 만들어서 사용 • 포트 매핑: 컨테이너 내부의 8080 포트를 외부의 80 포트로 노출 • 환경 변수: Java 옵션 및 타임존 등 필요한 설정을 주입
2.3 배포 스크립트 흐름
버전 정보 확인 및 변수 설정 • version 파일에서 버전 정보를 읽어 Docker 이미지 태그 및 파일명 등에 사용
로컬 빌드 및 테스트 • npm 빌드: 프론트엔드 또는 기타 npm 기반 빌드 작업 실행 • Gradle 빌드: 백엔드(Java) 애플리케이션을 빌드 (JAR 파일 생성) • Postman 테스트: postmantest.sh 스크립트를 통해 API 등의 테스트 실행 • 빌드 및 테스트 실패 시 스크립트 종료
Docker 이미지 생성 및 저장 • docker build 명령어로 로컬에서 Docker 이미지를 생성 • docker save 명령어를 사용해 해당 이미지를 tar 파일로 저장
원격(EC2) 서버로 파일 전송 • scp 명령어를 사용해 tar 파일과 docker-compose 파일을 EC2 서버로 전송 • SSH 키(PEM 파일)를 사용하여 보안 연결
원격 서버에서 배포 • SSH로 접속한 후, 다음 순서로 진행: • 기존 컨테이너 종료 (docker-compose down) • 기존 Docker 이미지 삭제 (태그 기준 삭제) • 새 Docker 이미지 tar 파일을 로드 (docker load) • Docker Compose를 이용해 컨테이너를 재시작 (docker-compose up -d) • 불필요한 Docker 리소스 정리 (docker system prune)
프로파일 선택 • develop 또는 prod 프로파일에 따라 서로 다른 EC2 호스트 및 docker-compose 파일 사용
로컬 빌드 후 원격 배포 방식에 대한 설명 • 로컬 빌드: 애플리케이션 소스 코드를 로컬에서 빌드하여, 필요한 모든 산출물(JAR, 정적 파일 등)을 생성합니다. 그 후, Docker 이미지를 생성하는데 이 Docker 이미지는 애플리케이션 실행에 필요한 모든 내용을 포함합니다. • 이미지 저장 및 전송: 로컬에서 생성된 Docker 이미지를 tar 파일로 저장한 후, SCP를 통해 원격 EC2 서버로 전송합니다. • 원격 배포: EC2 서버에서는 전송된 tar 파일을 사용해 Docker 이미지를 로드하고, docker-compose를 통해 컨테이너를 실행합니다. 이 과정에서 기존 컨테이너와 이미지는 제거되고 새 버전의 이미지로 교체됩니다.
즉, 전체 배포 과정은 로컬에서 빌드하고, 생성된 Docker 이미지를 원격 서버에 전송하여 배포하는 방식입니다.
- Next.js 프로젝트도 동일한 방식으로 배포할 수 있는가?
네, Next.js 프로젝트도 동일한 컨셉으로 배포할 수 있습니다. 일반적인 방법은 다음과 같습니다:
- 로컬 빌드: • Next.js의 경우, next build를 통해 프로덕션 빌드를 생성합니다. • 멀티 스테이지 Dockerfile을 사용해 빌드 산출물(예: .next 폴더, public 등)을 포함하는 이미지를 생성합니다.
- Docker 이미지 생성: • 로컬에서 Docker 이미지를 빌드합니다. • (옵션) 이미지 크기를 줄이기 위해 standalone output 또는 멀티 스테이지 빌드를 활용합니다.
- 이미지 저장 및 전송: • 위의 자바 애플리케이션과 같이 docker save로 이미지를 tar 파일로 저장한 후, SCP 또는 다른 파일 전송 방식으로 원격 서버에 전송할 수 있습니다.
- 원격 서버 배포: • 원격 서버에서 Docker 이미지를 로드한 후, docker-compose로 컨테이너를 실행합니다.
따라서, Next.js 애플리케이션도 로컬 빌드 후 이미지를 원격 서버로 전송하여 배포하는 방식으로 충분히 진행할 수 있습니다. 다만, Next.js는 빌드 산출물의 구성이나 환경 변수 설정 등 세부 사항이 다를 수 있으므로 이에 맞게 Dockerfile과 docker-compose 파일을 작성해야 합니다.
- 결론 • 배포 프로세스: 로컬에서 소스 빌드 → Docker 이미지 생성 및 tar 파일 저장 → SCP로 EC2 전송 → 원격 서버에서 Docker 이미지 로드 및 docker-compose로 컨테이너 재시작. • 자바 애플리케이션의 배포는 위와 같이 진행되며, 이를 통해 기존 컨테이너를 안전하게 교체하고 업데이트할 수 있습니다. • Next.js 프로젝트도 동일한 원리를 적용할 수 있으며, 로컬 빌드 후 Docker 이미지를 생성해 원격 서버에서 배포하는 방식으로 진행할 수 있습니다.
이런 방식은 CI/CD 파이프라인 구성이나 자동화 배포 스크립트를 활용할 때도 자주 사용되는 기법입니다.