Docker는 Dockerfile을 읽어서 이미지를 자동으로 빌드 할 수 있습니다.
Dockerfile은 사용자가 이미지를 생성하기 위해 명령 줄에서 호출할 수 있는 모든 명령이 포함된 텍스트 문서입니다. Docker 빌드를 사용하면 여러 명령 줄 지침을 연속적으로 실행하는 자동화 된 빌드를 만들 수 있습니다.
먼저 SpringInitializer를 통해 스프링부트 프로젝트를 생성하겠습니다.
plugins {
id 'org.springframework.boot' version '2.4.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
간단하게 프로젝트를 세팅합니다.
package com.example.hellodocker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class HelloDockerApplication {
@RequestMapping("/")
public String home() {
return "Hello Docker World";
}
public static void main(String[] args) {
SpringApplication.run(HelloDockerApplication.class, args);
}
}
해당 명령어를 실행하여 jar 파일을 생성하고 실행해 정상적으로 동작하는지 확인해 봅니다.
./gradlew build && java -jar build/libs/hello-docker-0.0.1-SNAPSHOT.jar
프로젝트 최상단의 바로 아래에 간단한 Dockerfile을 작성합니다.
FROM openjdk:11-jdk
WORKDIR /home/spring
COPY build/libs/*.jar /home/spring/application.jar
EXPOSE 8080
CMD ["java", "-jar", "/home/spring/application.jar"]
작성한 Dockerfile을 토대로 이미지를 빌드합니다.
# docker build -t joohyuk/hello-docker:0.0 ./
-t 옵션은 생성될 이미지의 이름을 설정합니다. -t 옵션을 사용하지 않으면 16진수 형태의 이름으로 이미지가 저장되므로 -t 옵션을 사용하는 것이 좋습니다. 그리고 명령어의 끝에는 Dockerfile이 저장된 경로를 입력합니다. 외부 URL로 부터 Dockerfile의 내용을 가져와 빌드 할 수도 있지만 현재는 로컬에 Dockerfile을 저장으므로 ./(현재 디렉토리)를 입력했습니다.
[+] Building (8/8) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 37B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/openjdk:11-jdk
=> [1/3] FROM docker.io/library/openjdk:11-jdk@sha256:d112a532f300ce7d35f5cd196c22fced33d0a28a7dd0227019da5fb430528428
=> [internal] load build context
=> => transferring context: 121B
=> CACHED [2/3] WORKDIR /home/spring
=> CACHED [3/3] COPY build/libs/*.jar /home/spring/application.jar
=> exporting to image
=> => exporting layers
=> => writing image sha256:5aa408a0318f9ed40a6e37e8861c779817751cf6d0421c8c38d68c90faf7efe9
=> => naming to docker.io/joohyuk/hello-docker:0.0
이미지가 생성되었는지 확인합니다.
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
joohyuk/hello-docker 0.0 92be09e21ff8 2 hours ago 664MB
mysql latest 8457e9155715 2 weeks ago 546MB
생성된 이미지를 이용하여 스프링부트 컨테이너를 생성합니다.
# docker run -d -p 8080:8080 --name myserver joohyuk/hello-docker:0.0
컨테이너가 생성된 것을 확인했습니다.
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c9776bbc6fb joohyuk/hello-docker:0.0 "java -jar /home/spr…" 23 seconds ago Up 22 seconds 0.0.0.0:8080->8080/tcp myserver
스프링부트 애플리케이션이 제대로 동작하는지 curl
명령어를 통해 확인해보겠습니다.
# curl localhost:8080
Hello Docker World
위에서 작성한 Dockerfile의 명령어에 대한 설명은 아래와 같습니다.
FROM openjdk:11-jdk
WORKDIR /home/spring
COPY build/libs/*.jar /home/spring/application.jar
EXPOSE 8080
docker run
명령에서 -p 옵션을 사용하여 하나 이상의 포트를 매핑시켜 줘야 합니다.CMD ["java", "-jar", "/home/spring/application.jar"]
더 많고 자세한 명령어는 공식문서를 참조하면 됩니다.