Maven 플러그인을 활용한 SpringBoot 애플리케이션 Docker 이미지 구축

개요

본 문서에서는 Maven 플러그인을 활용하여 SpringBoot 애플리케이션을 Docker 이미지로 패키징하고, 사설 레지스트리에 업로드하는 과정을 상세히 설명합니다. Docker 명령어에 익숙하지 않은 개발자는 먼저 기본 Docker 명령어 관련 자료를 참고하시기 바랍니다.

Docker Registry

Docker Registry 2.0 설치

docker run -d -p 5000:5000 --restart=always --name my-registry registry:2

이미지 다운로드 문제가 발생할 경우, /etc/docker/daemon.json 파일을 수정하여 레지스트리 미러를 추가한 후 Docker 서비스를 재시작해야 합니다:

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

Docker 원격 API 활성화

docker.service 파일 수정
vi /usr/lib/systemd/system/docker.service

수정 전:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

수정 후:

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
HTTP 프로토콜을 통한 이미지 업로드 허용
echo '{ "insecure-registries":["192.168.10.50:5000"] }' > /etc/docker/daemon.json
Docker 서비스 재시작
systemctl stop docker
systemctl start docker
방화벽에서 Docker 빌드 포트 허용
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload

Maven을 활용한 Docker 이미지 구축

본 예제는 sample-app 프로젝트的基础上 수정되었습니다.

pom.xml에 docker-maven-plugin 의존성 추가

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.1.0</version>
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <imageName>sample-repo/${project.artifactId}:${project.version}</imageName>
        <dockerHost>http://192.168.10.50:2375</dockerHost>
        <baseImage>java:8</baseImage>
        <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

설정 항목 설명:

  • executions.execution.phase: Maven 패키지 단계에서 Docker 이미지 빌드 수행
  • imageName: 이미지 이름 지정 - sample-repo는 레지스트리 이름, ${project.artifactId}는 이미지 이름, ${project.version}은 태그 버전
  • dockerHost: 이미지 업로드 대상 Docker 서버 주소
  • baseImage: 애플리케이션 기반 이미지 (여기서는 java)
  • entryPoint: Docker 컨테이너 실행 시 수행 명령
  • resources.resource.targetPath: 패키징된 리소스 파일 복사 대상 디렉토리
  • resources.resource.directory: 복사할 파일 위치 (Maven 빌드 산출물은 target 디렉토리에 저장)
  • resources.resource.include: 복사할 파일명 (빌드된 애플리케이션 JAR)

application.yml 수정 - localhost를 db로 변경

Docker 컨테이너는 독립적인 가상 환경으로 동작하므로, sample-app이 localhost로 MySQL에 접근할 수 없습니다. 컨테이너 간 통신은 사전 정의된 서비스명(database)을 통해 이루어지며, 컨테이너 실행 시 해당 이름을 지정할 수 있습니다.

spring:
  datasource:
    url: jdbc:mysql://database:3306/sample?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Seoul
    username: admin
    password: admin123

IDEA에서 프로젝트 패키징 및 이미지 빌드

참고: 기반 이미지는 사전에 다운로드되어 있어야 하며, 빌드 타임아웃을 방지할 수 있습니다. 로컬에 java:8 이미지가 없을 경우, 먼저-pull한 후 Maven 플러그인으로 빌드하시기 바랍니다.

  • Maven package 명령어 실행:
  • 빌드 성공 시:
  • 레지스트리 확인:

sample-app 프로젝트 실행

MySQL 서비스 실행

Docker 명령어로 MySQL 실행:

docker run -p 3306:3306 --name mysql-db \
  -v /mydata/mysql/log:/var/log/mysql \
  -v /mydata/mysql/data:/var/lib/mysql \
  -v /mydata/mysql/conf:/etc/mysql \
  -e MYSQL_ROOT_PASSWORD=admin123 \
  -d mysql:5.7

MySQL 컨테이너 내부 접근:

docker exec -it mysql-db /bin/bash

MySQL 클라이언트 실행:

mysql -uroot -padmin123 --default-character-set=utf8

root 계정의 모든 IP 접근 권한 부여:

grant all privileges on *.* to 'root'@'%'

데이터베이스 생성:

create database sample character set utf8

SQL 파일을 MySQL 컨테이너로 복사:

docker cp /mydata/sample.sql mysql-db:/

데이터베이스로 SQL 파일 가져오기:

use sample;
source /sample.sql;

sample-app 애플리케이션 서비스 실행

Docker 명령어로 애플리케이션 실행 (--link를 통해 database 도메인으로 MySQL 접근 가능):

docker run -p 8080:8080 --name sample-app \
  --link mysql-db:database \
  -v /etc/localtime:/etc/localtime \
  -v /mydata/app/sample-app/logs:/var/logs \
  -d sample-repo/sample-app:1.0.0

8080 포트 방화벽 허용:

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

접속 테스트:
http://192.168.10.50:8080/swagger-ui.html

태그: spring-boot maven docker maven-plugin container

7월 3일 03:39에 게시됨