서론
도커 파일을 이용해 Spring Boot 이미지 내 디렉터리 생성 및 권한 부여 그리고 이미지 생성하고,
실행 스크립트를 통해 서버 내 디렉토리와 도커 이미지 내 디렉터리를 마운트 하는 부분을 기록하려고 합니다.
본론
Spring Boot 프로젝트를 설계할 때, Thymeleaf를 함께 사용하여 모놀리식으로 설계 및 개발하였다.
그래서, 리액트나 뷰와 같은 프론트 프레임워크를 사용하지 않았기에 배포할 때는 SpringBoot 만을 배포하면 되었기에 편하기는 했다.
아래는 스프링부트 환경에 대해 나타내었다.
Spring Boot
- Java 17.0.2
- Spring Boot 3.3.2
이제 IDE에서 Maven Install 혹은 Gradle build 하여 나온 .jar 파일을 가지고 도커에서 이미지로 만들기 위해 DockerFile을 작성해야 한다.
필자는 집에서 따로 맥미니 서버를 구동하고 있기 때문에 해당 서버에서 배포를 진행하려고 한다.
맥미니 서버와 같은 경우는 아래 게시글을 참고 바랍니다!
2024.02.29 - [Server/HomeServer] - 2014 Mac Mini로 홈서버 구축하기 #1 - 왜, 맥 미니인가?
2014 Mac Mini로 홈서버 구축하기 #1 - 왜, 맥 미니인가?
시리즈 2024.02.29 - [개발기록/홈서버] - 2014 Mac Mini로 홈서버 구축하기 #1 - 왜, 맥 미니인가? 2024.03.01 - [개발기록/홈서버] - 2014 Mac Mini로 홈서버 구축하기 #2 - 원격 프로그램 점프 데스크탑(Jump Desktop)
abuuu.tistory.com
아래는 DockerFile이 있는 디렉토리 구조를 나타낸다.
/my-project
├── Dockerfile # Spring Boot의 Dockerfile
├── start-script.sh # image를 Container로 실행하는 파일
└── project.jar # 이미지로 만들 jar 파일
첫 번째로 DockerFile 도커 파일을 작성한다.
# OpenJDK 17를 기본 이미지로 사용하겠다고 설정
# 각자 프로젝트 자바 버전으로 변경 필요
FROM openjdk:17
# 타임존 환경 변수를 서울로 설정
ENV TZ=Asia/Seoul
# 도커파일이 존재하는 디렉토리 내 존재하는 jar 파일을 대상으로 설정
ARG JAR_FILE=./*.jar
# 이미지 내에서 application 디렉토리를 주로 설정
WORKDIR /application
# 위에서 설정한 디렉토리 내에 project.jar를 저장
COPY ${JAR_FILE} project.jar
# 이미지내에서 사용할 이미지와 로그를 저장할 디렉토리를 생성하고 권한 부여
RUN mkdir -p /application/log /application/images && \
chmod -R 777 /application/log /application/images
# 어플리케이션 포트 지정 필자는 9808로 하였음
EXPOSE 9808
# 자바 명령어로 해당 jar를 실행하고 부가적으로 톰켓 arguments도 함께 지정
# 타임존과 Ipv4 스택을 지정하였음, 필요에 따라 추가 요망
ENTRYPOINT ["java", "-Duser.timezone=${TZ}", "-Djava.net.preferIPv4Stack=true", "-jar", "/application/houdini.jar", "--server.port=9808"]
이런 식으로 도커파일을 생성하였고, 필자는 Filezilla를 이용해 도커를 구동시킬 맥 서버로 파일을 전송하였다.
DockerFile과 Spring Boot jar를 동일한 디렉터리에 저장한 뒤 이미지를 생성하기 위해 아래 명령어를 수행한다.
docker build -f Dockerfile -t project:1.0.5 .
명령어 docker build -f Dockerfile -t houdini:1.0.5 .의 의미
- docker build
- Docker 이미지를 빌드하라는 명령어입니다.
- -f Dockerfile
- 사용할 Dockerfile의 경로를 지정합니다. 이 경우, 현재 경로에 있는 Dockerfile을 사용합니다.
- -t project:1.0.5
- 생성될 이미지의 이름(houdini)과 태그(1.0.5)를 지정합니다. 이 태그는 보통 버전 관리에 사용됩니다.
- .
- 현재 디렉토리를 콘텍스트로 사용하여 이미지를 빌드합니다. Dockerfile에서 참조할 파일들을 현재 디렉터리에서 찾습니다.
결론적으로, 이 명령어는 현재 디렉토리의 Dockerfile을 기반으로 houdini라는 이름의 Docker 이미지를 만들고, 버전 태그 1.0.5를 지정하는 것입니다.
명령어를 수행한 이후, 생성된 이미지를 확인합니다.
이제 생성된 이미지를 컨테이너로 실행하기 위해 아래와 같은 스크립트를 생성하였습니다.
원래는 명령어로 실행했지만, 마운트 시켜야 할 디렉터리가 점차 많아지면 명령어로 전부 작성하기에는 길기도 하고 실수할 확률도 높아져서 실행 스크립트를 생성하였습니다.
#!/bin/bash
docker run -p 443:9808 \
-v ~/Desktop/log:/application/log \
-v ~/Desktop/log/images:/application/images \
--name project \
project:1.0.5
이 명령어는 bash 스크립트에서 Docker 컨테이너를 실행시키는 파일입니다.
- #!/bin/bash
- 이 스크립트가 Bash 셸에서 실행된다는 선언입니다.
- docker run
- Docker 컨테이너를 실행하라는 명령어입니다.
- -p 443:9808
- 호스트의 포트 443을 컨테이너의 포트 9808에 바인딩합니다. 즉, 외부에서 호스트의 443 포트로 요청이 들어오면 Docker 컨테이너 내의 9808 포트로 전달됩니다. (여기서 443은 HTTPS 기본 포트입니다).
- -v ~/Desktop/log:/application/log
- 호스트의 ~/Desktop/log 디렉토리를 컨테이너 내의 /application/log 디렉터리에 바인딩(마운트)합니다. 이로 인해 컨테이너 내에서 /application/log에 저장되는 파일들은 호스트의 ~/Desktop/log에 저장됩니다.
- -v ~/Desktop/log/images:/application/images
- 호스트의 ~/Desktop/log/images 디렉토리를 컨테이너의 /application/images 디렉터리에 바인딩합니다. 위와 동일한 방식으로, 이 경로에 저장되는 파일들이 호스트와 공유됩니다.
- --name project
- 실행되는 컨테이너의 이름을 project로 지정합니다. 컨테이너에 대한 식별자로 사용됩니다.
- project:1.0.5
- 실행할 Docker 이미지를 지정합니다. 여기서 project라는 이름의 이미지의 1.0.5 버전을 사용하여 컨테이너를 실행합니다.
결론적으로 이 명령은 project:1.0.5 Docker 이미지를 기반으로 project라는 이름의 컨테이너를 실행하며, 호스트와 컨테이너 사이에 파일 경로를 공유하고, 외부의 443 포트를 내부의 9808 포트와 연결합니다.
./start-script.sh
위 명령어를 입력하면 이전에 작성한 실행 스크립트가 동작하고 위 설명과 같이 지정하여 컨테이너를 생성합니다.
이후 해당 서버의 https://도메인 을 입력해서 정상적으로 화면이 표출되는 것을 볼 수 있습니다.
서버가 실행되면서 생성한 로그와 저장된 이미지 파일들은 로컬 서버에 동기화가 되어 백업하는 부분에서도 유용한 점이 있다고 생각합니다.
결론
도커파일과 실행 스크립트를 통해 편하게 이미지를 배포하고 컨테이너를 생성하는 방법을 알게 되었습니다.
또한, 외부 서버를 사용하면 포트포워딩도 설정이 필요할 수 있기 때문에, 각자 설정한 포트에 맞게 오픈 여부도 확인해 주시면 좋을 것 같습니다..
감사합니다!
'Server > Docker' 카테고리의 다른 글
[Docker] Docker Compose를 이용해 Docker + Nginx + SpringBoot + React(w/ Vite) + CertBot 배포하기 (0) | 2024.10.02 |
---|---|
[Docker] 맥 Mac M1(Silicon) Redis 설치하기 (0) | 2024.03.26 |