본문 바로가기
Docker

[Docker] Local 환경에서 Spring에서 Docker 사용 실습

by 도전하는 린치핀 2024. 3. 31.

해당 실습은 Github / Github Action / Docker Registory / EC2를 활용하지 않고 Local 컴퓨터 내에서 Docker Desktop을 활용한 실습으로 진행할 예정이다.

 

실습 목표

  1. Spring 환경에서 Build를 통한 JAR파일 생성하기
  2. 원하는 Docker Image를 생성하기 위해 Docker File을 생성
  3. Docker File과 JAR 파일을 가지고 Docker Build를 진행하여 Docker Image 생성
  4. 생성된 Docker Image를 Docker Desktop과 터미널에서 Docker Run을 통한 Docker Container 구동

0. 실습을 위한 환경 설정

0-1. Spring 환경 설정하기

spring 환경을 설정하기 위해 https://start.spring.io/ 에 들어가 아래와 같은 Dependices를 선택하고 Spring 환경을 설정했다.

기본적인 Spring 개발 환경만 구축하기 위해 아래 네가지만 설치한 것이니 추가적으로 필요한 것을 설치하면 된다.

사실 Spring Web과 Thymeleaf만 있어도 이번 실습에 필요한 환경은 모두 구축되는 것이니 따로 추가해주지 않아도 된다.

 

0-2. Docker Desktop 설치

기본적인 Local 환경에서 Docker를 사용하고 Docker Engine이 있어야 Docker Build / Docker Run이 가능하기 때문에 따로 Docker Desktop을 설치하도록 하자.

Docker Desktop이 없이 Docker Engine을 설치하여 사용할 수 있지만 편하게 GUI로 확인할 수 있으니 아래의 링크에 들어가 설치하도록 하자.

https://docs.docker.com/desktop/install/mac-install/

 

Install Docker Desktop on Mac

Install Docker for Mac to get started. This guide covers system requirements, where to download, and instructions on how to install and update.

docs.docker.com

https://conceptbug.tistory.com/entry/Docker-%EB%A7%A5%EC%97%90-Docker-Desktop-%EC%84%A4%EC%B9%98-1-%EC%84%A4%EC%B9%98-%EA%B9%8C%EC%A7%80%EB%A7%8C

 

[Docker] 맥에 Docker Desktop 설치 - #1 설치까지만

지금까지는 회사나 개발 워크스테이션이 모두 Linux 기반이었기 때문에 Docker를 사용할 일이 있다면 터미널을 통한 CLI 환경에서 작업해왔다. 그런데, 문득 당장 내 개인 랩탑에서 Docker를 사용할

conceptbug.tistory.com

 

1. Docker Image를 통한 Docker Container 구동

 

1-1. 초기 상태 및 빌드 후 localhos:8080 접속

 

  • 초기 initializer에서 다운로드 받은 파일을 압축 해제 후 파일을 연 뒤(왼쪽 사진), 바로 실행(java run)한 뒤 localhost:8080 접속
  • 맨 처음에는 아무것도 없고 서버가 가동된다고 해도 확인할 수 있는 것이 없음

1-2. 접속 확인을 위한 HelloController 생성

  • 맨 처음에는 아무것도 없기 때문에 추가적으로 간단하게 "hello world"라는 문자열을 반환하는 HelloControll을 생성해야 한다.
  • 이를 통해서 간단하게 서버가 구동중인지 확인할 수 있음 (Spring 환경 설정 끝)

1-3. Spring 프로젝트 내 Docker File 생성

FROM amazoncorretto:17-alpine

ARG JAR_FILE=build/libs/*.jar

COPY ${JAR_FILE} app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]
  • Docker File을 생성한 뒤 위와 같이 해당 스크립트를 작성한다.
  • Docker File은 Docker Image를 생성하기 위한 설계도로, 한줄씩 명령문이 수행되면서 Docker Image가 만들어진다고 생각하자.
    1. FROM ~~~ : 베이스 이미지를 선택하는 것으로, Docker Hub에서 베이스 이미지를 선택하는 것이다.
      • 이때, 베이스 이미지라는 것은 Docker Image에서 어떤 버전의 언어를 사용해서 구동시킬 것을 선택하는거라고 볼 수 있다.
      • Spring의 작업물을 Docker Image로 만들것이니 우리는 Java 버전을 선택하는 것이라고 생각하자.
    2. ARG JAR_FILE=build/libs/*.jar : docker file 내에서 필요한 변수 설정으로 해당 명령문은 build/libs/*.jar(spring에서 빌드가 끝난 jar파일)을 JAR_FILE이라고 변수를 설정하는 것이라고 할 수 있다.
    3. COPY ${JAR_FILE} app.jar : 파일 또는 디렉토리를 복사하는 것으로 2.에서 설정한 JAR_FILE을 app.jar로 복사하는 것이다.
    4. ENTRYPOINT ~ : Docker Container가 구동될 때 실행할 쉘 명령을 지정하는것으로 jar파일을 java를 통해서 구동시키는 것이라고 생각하자.
  • 추가적으로 Docker File을 생성할 때 주로 사용되는 명령문은 아래 사진으로 정리해보자

출처 : DevOps[도커] Docker File 기본 사용법

1-4. Spring build를 통해 .jar 파일 생성

 

  • "./gradlew clean build" 을 통해 spring 프로젝트를 Build 하여 .jar 파일을 생성하면 된다.
  • 오른쪽 사진을 보면 Docker File에 정의한대로 "/build/libs" 디렉토리 안에 .jar파일이 생성된 것을 볼 수 있다.

1-5. Docker Build를 통한 Docker Image 생성하기

  • 프로젝트 내(Docker file이 위치한 폴더) 터미널에서 "docker build -t my-image:1234 ."을 통해 Docker Build를 수행하였다.(왼쪽)
  • Docker Desktop에서 Image를 보면 방금 build한 이미지가 보인다.(오른쪽)
  • 추가적으로 터미널 내에서 "docker images"를 통해서 현재 Local에 있는 모든 Docker Image를 확인할 수 있다.

1-6. 생성된 Docker Image를 구동시켜 Docker Container 구동시키기

=

  • 터미널 내에서 "docker run -p 1000:8080 -t my-image:1234" 명령어를 통해 1000번 포트에서 8080 포트로 연결을 시켰다.
  • 기존에 Spring 프로젝트에서 Run 했을 때는 8080포트로 연결헀지만 현재 1000포트로 연결해야 제대로 수행되는 것을 확인할 수 있다.
  • 아래와 같이 Docker Desktop을 확인해보면 Docker Container가 구동중인 것을 확인할 수 있다.

 

위의 프로세스를 통해 Spring 프로젝트 내 Docker File을 생성하고,
Docker File을 build하며 Docker Image를 생성하고,
Docker Image를 Run하여 Docker Container를 구동시킬 수 있다.