[CI/CD] Github Action으로 CI/CD 구축하기 - 3. SpringBoot, Nginx DokerFile, nginx.conf 파일 작성하기

Ogu·2024년 9월 14일
0

이번 포스팅에서는 앞선 [CI/CD] Github Action으로 CI/CD 구축하기 - 2. AWS EC2 생성 및 Dockr 환경 세팅 에 이어 Docker 이미지로 만들기 위한 SpringBoot, Nginx의 DockerFile과 Nginx 설정을 위한 nginx.conf 파일을 작성해보도록 하겠습니다.

DockerFile

공식문서에 의하면 Dockerfile에 관한 설명은 다음과 같습니다.

Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image.

Docker는 Dockerfile에 작성된 명령어를 읽어 자동으로 이미지를 빌드할 수 있습니다. Dockerfile은 사용자가 이미지 빌드를 위해 커맨드 라인에서 실행할 수 있는 모든 명령어를 포함하는 텍스트 문서입니다.
https://docs.docker.com/reference/dockerfile/

한마디로 도커 이미지를 만들기 위한 명령어 집합 파일입니다.

Dockerfile 명령어

Dockerfile 이 지원하는 명령어는 다음과 같습니다.

InstructionDescription
ADD로컬 또는 원격 파일과 디렉토리를 추가합니다.
ARG빌드 시 사용할 변수를 설정합니다.
CMD기본 명령을 지정합니다.
COPY파일과 디렉토리를 복사합니다.
ENTRYPOINT기본 실행 파일을 지정합니다.
ENV환경 변수를 설정합니다.
EXPOSE애플리케이션이 수신 대기할 포트를 지정합니다.
FROMbase 이미지를 기반으로 새로운 빌드 스테이지를 생성합니다.
HEALTHCHECK컨테이너 시작 시에 컨테이너의 상태를 확인합니다.
LABEL이미지에 메타데이터를 추가합니다.
MAINTAINER이미지의 작성자를 지정합니다.
ONBUILD이미지 빌드에 사용될 때 실행할 명령을 지정합니다.
RUN빌드 명령을 실행합니다.
SHELL이미지의 기본 shell을 설정합니다.
STOPSIGNAL컨테이너 종료 시 사용할 시스템 호출 시그널을 지정합니다.
USER사용자 및 그룹 ID를 설정합니다.
VOLUME볼륨 마운트를 생성합니다.
WORKDIR작업 디렉토리를 변경합니다.

SpringBoot DockerFile 생성

SpringBoot를 실행시킬 수 있는 .jar 파일을 이미지로 만들기 위한 Dockerfile을 작성해보겠습니다.

FROM openjdk:17-alpine

ARG JAR_FILE=build/libs/clothstar-0.0.1-SNAPSHOT.jar

COPY ${JAR_FILE} app.jar

ENTRYPOINT ["java","-Dspring.profiles.active=dev","-jar","/app.jar"]
  • FROM openjdk:17-alpine :
    Docker 이미지의 기본 이미지를 정의합니다. 여기서는 Java 17이 설치된 가벼운 alpine Linux 이미지를 사용합니다. alpine은 경량화된 Linux 배포판으로, Docker 이미지를 최소화하는 데 유리합니다.
    oracle 등 jdk 배포판은 원하는 것을 지정해도 됩니다.
  • ARG JAR_FILE=build/libs/clothstar-0.0.1-SNAPSHOT.jar :
    ARG는 Dockerfile에서 빌드 시 사용할 수 있는 변수로, JAR_FILE이라는 이름의 변수에 빌드된 Spring Boot 애플리케이션의 .jar 파일 경로를 지정합니다. build/libs/~~SNAPSHOT.jar는 기본적으로 Spring Boot 프로젝트의 Gradle 빌드 결과물 경로로 파일 이름을 전체적으로 명시합니다.
  • COPY ${JAR_FILE} app.jar : 호스트의 JAR 파일을 컨테이너 내의 app.jar라는 이름으로 복사합니다. ${JAR_FILE}은 위에서 정의한 ARG 값을 참조합니다. (복사할 파일 이름은 원하는대로 지정합니다.)
  • ENTRYPOINT ["java","-Dspring.profiles.active=dev","-jar","/app.jar"] : 컨테이너가 시작될 때 실행할 명령어를 정의합니다. 여기서는 java -jar 명령어를 사용하여 app.jar 파일을 실행하고, -Dspring.profiles.active=dev를 통해 Spring Boot 애플리케이션이 dev 프로파일로 실행되도록 설정합니다. 프로파일 설정은 상황에 따라 활성화 시킬 프로파일로 지정합니다.

🏷️ build/libs/~~SNAPSHOT.jar 로 파일 이름을 전체적으로 명시하는 이유

ARG JAR_FILE=build/libs/.jar와 같이 와일드카드()를 사용하여 파일을 명시하는 이유는 Spring Boot 애플리케이션의 빌드 과정에서 생성되는 JAR 파일의 종류 때문입니다.
기본적으로 ./gradlew build 명령어를 실행하면 아래와 같이 두 가지 유형의 .jar 파일이 생성됩니다:

  • SNAPSHOT.jar: 이 파일은 실행 가능한 JAR 파일로, 애플리케이션을 실행하기 위한 모든 클래스 파일과 라이브러리를 포함하고 있습니다. java -jar 명령어를 사용하여 직접 실행할 수 있습니다.
  • SNAPSHOT-plain.jar: 이 파일은 일반 JAR 파일로, 실행에 필요한 외부 라이브러리나 클래스 파일을 포함하지 않는 비실행 JAR 파일입니다. 이 파일은 다른 프로젝트에서 참조용으로 사용되며, java -jar로 실행할 수 없습니다.

    그에 비해 ./gradlew bootJar 명령어를 사용하면 오직 실행 가능한 SNAPSHOT.jar 파일만 생성됩니다. bootJar는 Spring Boot에서 제공하는 빌드 작업으로, 실행에 필요한 모든 요소를 포함한 JAR 파일을 생성하는 데 특화되어 있습니다.
    bootJar 명령어를 사용한다면 ARG JAR_FILE=build/libs/*.jar와 같이 명시적으로 파일 이름을 지정하지 않고도 와일드카드를 사용하여 JAR 파일을 지정하면 bootJar 명령어로 빌드된 실행 가능한 JAR 파일을 자동으로 참조하게 됩니다.

Nginx Dockerfile 생성

FROM nginx
COPY ./nginx/conf.d/nginx.conf /etc/nginx/conf.d
  • FROM nginx : Docker 이미지를 생성할 때 사용할 기본 이미지를 정의합니다. nginx 공식 이미지를 사용하고 뒤에 tag가 명시되어있지 않으므로 :latest 가 생략되어 최신 버전의 Nginx가 설치된 경량화된 Linux 환경을 사용합니다.
  • COPY ./nginx/conf.d/nginx.conf /etc/nginx/conf.d : 호스트 시스템에 있는 nginx.conf 파일을 컨테이너 내의 /etc/nginx/conf.d 디렉토리로 복사합니다. nginx.conf 파일은 Nginx의 사용자 정의 설정 파일로, 기본 설정을 덮어씁니다.

nginx.conf 설정파일 구성

server {
    listen 80;
    server_name *.compute.amazonaws.com
    access_log off;

    location / {
        proxy_pass http://clothstar-springboot-dev:8080;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
  • listen 80;: Nginx가 80번 포트에서 HTTP 요청을 수신하도록 설정합니다.
  • server_name *.compute.amazonaws.com;: server_name은 수신할 요청의 도메인 이름을 지정합니다. 여기서는 AWS EC2 인스턴스의 도메인 이름(예: *.compute.amazonaws.com)을 사용합니다.
  • access_log off; : Nginx 액세스 로그를 비활성화합니다. 개발 또는 디버깅 중에는 로그를 끌 수 있으며, 배포 환경에서는 필요에 따라 켜는 것이 좋습니다.
  • location / { ... } : 이 블록은 루트 URL(/)로 들어오는 모든 요청에 대해 프록시 설정을 정의합니다.
  • proxy_pass http://clothstar-springboot-dev:8080; : 모든 요청을 clothstar-springboot-dev라는 Spring Boot 애플리케이션 컨테이너의 8080 포트로 전달합니다. clothstar-springboot-dev는 Docker Compose 또는 Docker 네트워크에서 정의된 컨테이너 이름이어야 합니다.
  • proxy_set_header 지시어들 : 원본 요청의 헤더 정보를 전달하기 위해 사용됩니다. 이러한 헤더는 서버의 원본 요청 정보를 확인하고 로깅 또는 보안 검사에 사용될 수 있습니다.
  • Host, X-Forwarded-Host, X-Real-IP, X-Forwarded-For 등은 클라이언트의 원래 요청 정보를 전달하는 데 중요한 역할을 합니다.
profile
Hello! I am Ogu, a developer who loves learning and sharing! 🐤🐤 <br> こんにちは!学ぶことと共有することが好きな開発者のOguです!🐤

0개의 댓글