스프링 부트 도커 이미지 생성 후 실행

appti·2022년 5월 25일
1

스프링 부트 도커 이미지 생성 후 실행

스프링 부트 프로젝트를 만들고 이를 도커 이미지로 만든 뒤 도커 컨테이너로 실행해보고자 합니다.
도커를 처음 사용해보기에 최소한의 기능만을 사용했습니다.

스프링 부트 프로젝트

도커로 스프링 부트를 실행했는지 확인할 수 있을 정도의 간단한 스프링 부트 프로젝트를 생성했습니다.

@RestController
public class TestController {

    @GetMapping("/test")
    public String test() {
        return "test";
    }
}

테스트용 컨트롤러를 추가했습니다.

./gradlew build

이후 도커 이미지를 만들기 위해 미리 빌드를 진행했습니다.

도커

설치

도커 설치는 도커 공식 홈페이지 - Get Started에서 할 수 있습니다.
또한 도커를 사용하려면 회원가입이 필요합니다.

여기서 Docker Id의 경우 도커를 사용 시 로그인할 때 사용되므로 기억해 두시는 편이 좋습니다.

docker --version

Docker version 20.10.14, build a224086

도커 설치 후 정상적으로 설치되었는지 확인하기 위해 도커 버전을 확인해봤습니다.

docker run hello-world

이후 도커가 정상적으로 실행되는지 확인하기 위해 hello-world라는 튜토리얼용 도커 컨테이너를 실행했습니다.

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
7050e35b49f5: Pull complete
Digest: sha256:80f31da1ac7b312ba29d65080fddf797dd76acfb870e677f390d5acba9741b17
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

hello-world라는 컨테이너가 없기 때문에 마지막 버전을 도커에서 다운로드 받아 실행한 것을 확인할 수 있었습니다.

docker images

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    46331d942d63   2 months ago   9.14kB

docker images로 확인해보면 hello-world 이미지를 다운로드 받았다는 것을 확인할 수 있었습니다.

Dockerfile

이제 스프링 부트 프로젝트 루트 디렉토리에 Dockerfile을 만들겠습니다.

  • Dockerfile
    • 도커가 이해할 수 있는 설정 파일입니다.
    • 도커 이미지를 만드는데 필요한 의존성을 추가해주는 파일이라고 볼 수 있습니다.
    • 현재 자바로 진행하기 때문에 어떤 자바를 사용할 것인지, 어떤 애플리케이션(빌드한 .jar)를 사용할 것인지 등을 설정해야 합니다.
FROM openjdk:11-jdk
LABEL maintainer="email"
ARG JAR_FILE=build/libs/docker-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} docker-springboot.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/docker-springboot.jar"]

하나씩 확인해보도록 하겠습니다.

FROM openjdk:11-jdk
  • 어떤 자바 버전을 사용할 것인지를 입력합니다.
LABEL maintainer="email"
  • 해당 도커 이미지를 누가 관리하는지를 입력합니다.
  • 현재 단순 테스트 용도이기 때문에 임의로 작성했습니다.
ARG JAR_FILE=build/libs/docker-0.0.1-SNAPSHOT.jar
  • JAR_FILE이라는 변수를 정의합니다.
  • 이름 그대로 .jar의 위치를 저장하기 위한 변수명입니다.
ADD ${JAR_FILE} docker-springboot.jar
  • JAR_FILE에 도커 이미지로 사용할 이름을 입력합니다.
  • .jar의 이름은 docker-0.0.1-SNAPSHOT.jar이지만 도커에서는 docker-springboot로 출력됩니다.
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/docker-springboot.jar"]
  • 컨테이너 실행 시 반드시 실행될 명령어를 입력합니다.
  • []로 여러 명령어를 지정할 수 있습니다.
  • 기본적으로 자바는 빌드된 .jar를 실행할 때 java -jar <빌드 파일명>으로 실행하기 때문에 java, /docker-springboot.jar는 필수로 입력되므로 추가했습니다.
  • -Djava.security.egd=file:/dev/./urandom 옵션의 경우 세션 ID를 생성할 때 필요한 난수 파일을 미리 적용시켜 톰캣의 실행 속도를 빠르게 하고자 추가한 옵션입니다.

도커 이미지 생성

이제 도커 이미지를 생성합니다.

docker build -t docker-springboot .

편하게 진행하기 위해 Dockerfile가 있는 디렉토리인 프로젝트 루트 디렉토리에서 진행했습니다.

[+] Building 11.5s (7/7) FINISHED
 => [internal] load build definition from Dockerfile     
...
 => => naming to docker.io/library/docker-springboot 0.0s
docker images

REPOSITORY          TAG       IMAGE ID       CREATED              SIZE
docker-springboot   latest    fbb9b9734ed9   About a minute ago   667MB
hello-world         latest    46331d942d63   2 months ago         9.14kB

프로젝트 빌드로 .jar 파일이 있고, Dockerfile이 정상적으로 설정되었다면 위와 같이 이미지 생성 이후 도커 리포지토리에서 확인할 수 있습니다.

도커 이미지 실행

docker run -p 5000:8080 docker-springboot

도커 이미지를 실행해 도커 컨테이너에서 .jar 파일을 실행합니다.
p 옵션을 통해 외부로 노출되는 포트는 5000으로 수정했습니다.

실제 로그에서는 8080포트로 출력됩니다.
즉 도커 컨테이너에서는 애플리케이션이 8080으로 리스닝 하고 있습니다.

5000번 포트로 접근이 가능합니다.
도커에서 도커 컨테이너 내부 8080 포트와 외부 포트 5000을 바인딩하고 있다고 볼 수 있습니다.

추가적으로 알아볼 내용

  • Dockerfile
    • VOLUME
    • EXPOSE
    • CMD에서 명령어를 입력하는 것과 ENTRYPOINT에서 명령어를 입력하는 것의 차이
  • 옵션
    • p
    • 다른 도커 실행 옵션들
profile
안녕하세요

0개의 댓글