Spring Core/자질구래

Docker 배포

  • -

이번 포스트에서는 Spring Boot Application을 Docker에 배포하는 방법을 살펴보자. 이 글을 읽는 사람은 Docker Desktop 등을 사용하는 사람으로 한정한다.

문서는 다음 글을 참조한다.

https://spring.io/guides/gs/spring-boot-docker

 

Getting Started | Spring Boot with Docker

Congratulations! You have created a Docker container for a Spring Boot application! By default, Spring Boot applications run on port 8080 inside the container, and we mapped that to the same port on the host by using -p on the command line.

spring.io

 

Spring Application Docker 배포하기

 

Spring Boot Application 준비

당연히 가장 먼저 필요한건 잘 동작하는 Spring Boot Application이다.

다음처럼 간단한 rest service를 제공하는 application을 만들어두자.

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class SpringWithDockerApplication {

    @GetMapping("/")
    public String home() {
        return "Hello, Docker!";
    }
    
	public static void main(String[] args) {
		SpringApplication.run(SpringWithDockerApplication.class, args);
	}

}

 

Dockerfile 생성

Docker는 이미지의 'layers'를 구성하기 위해서 Dockerfile 이라는 간단한 파일 형식을 사용한다. 우리가 만들 것은 Docker 이미지인데 이를 만들기 위한 설계도 역할을 하는 것이 Dockerfile이다. 여기서 layer란 이미지를 구성하는 각각의 층들을 의미한다. 예를 들어 운영체제 설치 --> Java 설치 --> 애플리케이션 복사와 같이 단계적으로 layer를 구성하게 된다.

프로젝트 root에 Dockerfile 이라는 파일을 만들어보자.

FROM eclipse-temurin:21-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

FROM은 지금 만들려는 이미지의 베이스가 되는 이미지이다.  docker hub에서 적절한 image를 선택 할 수 있다. 

https://hub.docker.com/_/eclipse-temurin

 

eclipse-temurin - Official Image | Docker Hub

Quick reference Supported tags and respective Dockerfile links Note: the description for this image is longer than the Hub length limit of 25000, so the "Supported tags" list has been trimmed to compensate. See also docker/hub-feedback#238⁠ and docker/ro

hub.docker.com

ARG는 변수 선언이다. JAR_FILE이라는 변수를 만들고 거기에 target/에 있는 모든 jar를 가리키는 경로를 저장한다. Maven에서 target 경로 아래에 배포 대상 jar들을 만드는데 쉽게 참조하기 위해 변수화 한다고 보면 된다.

COPY는 파일들을 Docker의 이미지 않으로 복사하는 명령이다. 위에서는 ${JAR_FILE}의 내용들을 이미지 안에 복사하고 app.jar로 변경하는 설정이다. 

EXPOST는 이 컨테이너는 8080 포트를 사용하니까 열어주세요

마지막 ENTRYPOINT는 컨테이너 시작 후 실행할 명령어이다. 요소들을 그대로 연결하면 'java -jar /app.jar'로 이미지 안에 저장해 둔 app.jar를 실행하는 코드이다.

 

이미지 빌드

일단 위의 설정대로 target 아래에 jar가 있어야 하므로 maven으로 package goal을 실행해주자.

package goal 실행으로 jar로 배포하기

이제 다음 명령으로 이미지를 생성할 수 있다. 이때 Docker Desktop 등 데몬이 실행되고 있어야 한다. docker file의 이름을 지정하는 부분(itsmeyjc/boot-sample)은 하단의 도커 이미지 이름 규칙을 참고하자.

docker build -t itsmeyjc/boot-sample .

결과 images/local에 이미지가 등록된 것을 확인할 수 있다.

배포 이미지 확인

 

container 실행 및 동작 확인

이제 image를 실행해서 container를 만들어보자. 이때 8080 포트를 포워드 해줘야 외부에서 사용할 수 있다.

이미지 생성: 8080 port 연결

이제 localhost:8080을 브라우저에서 실행하면 "Hello, Docker!" 를 확인할 수 있다.

 

이미지 공유

 

docker desktop 활용

docker 이미지를 공유하기 위해 docker desktop을 사용하면 gui 상에서 간단히 처리할 수 있다. 

일단 docker desktop에 로그인하 images에서 '⋮'를 클릭해서 Push to Docker Hub를 선택한다.

Push to Docker Hub

잠시 후 Push가 완료되면 My Hub에서 이미지를 확인할 수 있다.

이제 당연히 docker hub에서도 이미지 확인이 가능하다.

 

pull 해서 사용하기

이제 여러 방법으로 이미지를 pull 해서 사용할 수 있다.

quietjun@quietjuiMacmini ~ % docker pull itsmeyjc/boot-sample

 

도커 이미지 이름 규칙

 

도커 이미지 이름 규칙

도커 이미지는 "레지스트리주소/프로젝트명/이미지명:이미지태그" 4 부분으로 구성된다.

  • 레지스트리 주소: 이미지가 저장된 레지스트리를 지정하며 이를 통해 이미지를 어디서 다운로드 하고 업로드 할 지 결정한다. 생략하면 기본 주소로 docker.io를 사용한다.
  • 프로젝트명: 이미지가 속한 프로젝트로 레지스트리에서 이미지를 관리하는 폴더와 같다. 일반적으로 도커 허브에서는 사용자의 계정명이 프로젝트 명으로 사용된다.
  • 이미지명: 다운로드 할 이미지의 이름으로 일반적으로 애플리케이션 이름이다.
  • 이미지태그: 이미지의 버전을 나타내며 숫자와 문자를 모두 포함할 수 있다.

예시로 몇 가지 이미지를 살펴보자.

  • devwiki.com/myproject/mynginx:2.1.0-alpine:  이 이름에는 모든 요소들이 포함되어있다.
  • devwikirepo/tencounter: 여기서는 레지스트리 주소와 이미지 태그가 생략되어있다. registry는 기본 값인 docker.io가 적용되며 이미지 태그는 latest가 적용된다. 따라서 이 경로는 docker.io/devwikirepo/tencounter:latest와 같다.
  • nginx: 이 경우는 이미지 명만 적용되어있는 경우이다. 이 이미지의 프로젝트 명은 library인데 docker에서는 검증된 이미지의 경우 공식 이미지를 제공하는데 이들의 프로젝트 명은 자동으로 library가 된다. 레지스트리주소와 이미지 태그는 위와 동일하다.  따라서 이 경로는 docker.io/library/nginx:latest로 ㅏ같다.

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.