이번 포스팅에서는 앞선 [CI/CD] Github Action으로 CI/CD 구축하기 - 2. AWS EC2 생성 및 Dockr 환경 세팅 에 이어 Docker 이미지로 만들기 위한 SpringBoot, Nginx의 DockerFile과 Nginx 설정을 위한 nginx.conf 파일을 작성해보도록 하겠습니다.
공식문서에 의하면 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 이 지원하는 명령어는 다음과 같습니다.
Instruction | Description |
---|---|
ADD | 로컬 또는 원격 파일과 디렉토리를 추가합니다. |
ARG | 빌드 시 사용할 변수를 설정합니다. |
CMD | 기본 명령을 지정합니다. |
COPY | 파일과 디렉토리를 복사합니다. |
ENTRYPOINT | 기본 실행 파일을 지정합니다. |
ENV | 환경 변수를 설정합니다. |
EXPOSE | 애플리케이션이 수신 대기할 포트를 지정합니다. |
FROM | base 이미지를 기반으로 새로운 빌드 스테이지를 생성합니다. |
HEALTHCHECK | 컨테이너 시작 시에 컨테이너의 상태를 확인합니다. |
LABEL | 이미지에 메타데이터를 추가합니다. |
MAINTAINER | 이미지의 작성자를 지정합니다. |
ONBUILD | 이미지 빌드에 사용될 때 실행할 명령을 지정합니다. |
RUN | 빌드 명령을 실행합니다. |
SHELL | 이미지의 기본 shell을 설정합니다. |
STOPSIGNAL | 컨테이너 종료 시 사용할 시스템 호출 시그널을 지정합니다. |
USER | 사용자 및 그룹 ID를 설정합니다. |
VOLUME | 볼륨 마운트를 생성합니다. |
WORKDIR | 작업 디렉토리를 변경합니다. |
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
:ARG JAR_FILE=build/libs/clothstar-0.0.1-SNAPSHOT.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 파일을 자동으로 참조하게 됩니다.
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의 사용자 정의 설정 파일로, 기본 설정을 덮어씁니다.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
등은 클라이언트의 원래 요청 정보를 전달하는 데 중요한 역할을 합니다.