소프트웨어 공학 수업 프로젝트의 일환으로 내가 만든 스프링부트 앱을 다른 사람이 돌려야 했다.
스프링부트로 만든 앱을 배포하는 방법은 jar로 의존 라이브러리들을 한 번에 묶어서 간편하게 배포할 순 있지만... 몇 가지 고려해야할 점들이 있었다.
1. 자바 버전을 맞춰줘야 한다. 내가 사용하는 버전은 11이었다.
2. DB 설정을 맞춰줘야 한다. DB 이름이며, 비밀번호까지
그런데 프론트 개발자 입장에선 자바 개발을 할 것도 아닌데 굳이 설치할 이유가 없었다.
그래서 이번에 컨테이너 스터디에서 배운 도커를 사용하여 개발 환경을 셋팅해보기로 했다!
이 글은 도커에 대한 기본 개념은 알고 있다는 가정 하에 작성하였다.
내가 배포하기 위해 고려한 점들은 다음과 같다.
1. 프론트 개발자 입장에서 별도의 셋팅을 해주어야만 하는가?
2. 백엔드 단의 설정을 프론트가 알아야 하는가?
특히 2번은 백단에서는 DB와 연결 설정 등을 알아야 하지만, 프론트에서는 굳이 고려하지 않아도 된다.
자 이제 도커에서 어떻게 해결할 수 있는지 알아보자.
Dockcer Compose로 한 번에 설정하자.
일반적인 Docker 컨테이너를 돌리는 방법으로 컨테이너를 돌리려면 docker run을 통해 파라미터들을 다 넣어주어야 했다. 그런데, 너무 귀찮다.. 언제 하나하나 다 넣는가
그래서! 컴포즈를 통해 한 번에 셋팅할 수 있는 방법을 설명한다.
스프링부트 공식 문서에서 친절하게 도커라이징하는 방법을 소개하고 있다.
https://spring.io/guides/gs/spring-boot-docker/
Spring Boot with Docker
this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team
spring.io
gradle이나 maven으로 jar를 빌드하고, 도커 이미지를 빌드할 때 복사하는 방식을 채택하여, 나 또한 가이드라인을 따라했다.
하지만 이 방법도 여러모로 불편했다.
1. 도커 이미지와 jar 파일을 각각 따로 빌드해주어야 한다.
2. jar파일의 용량이 커서 github에 올릴 수 없다. (그래서 구글 드라이브에 공유하는 방식으로 했었다;;)
(장고는 소스코드와 requirment.txt만 있으면 컴파일된 바이너리가 없어도 알아서 다 해주던데..)
그래서 리서치해본 결과 Jib라는 라이브러리가 있다는걸 알게 되었다.
https://github.com/GoogleContainerTools/jib
GoogleContainerTools/jib
🏗 Build container images for your Java applications. - GoogleContainerTools/jib
github.com
그림을 통해 간단히 알아보자.
와우! 도커 이미지를 빌드할 때 프로젝트에서 jar파일을 빌드하여 넣는 과정을 Jib가 해준다!
즉, 우리는 Jib로 빌드하면 도커 레지스트리에 바로 jar와 베이스 도커 이미지가 빌드된 이미지를 푸쉬할 수 있다!
나는 gradle로 테스트했기 때문에 gradle로만 소개한다.
plugins {
...
id 'com.google.cloud.tools.jib' version '3.0.0'
}
ext{
BUILD_VERSION = new Date().format("yyyyMMddHHmmSS")
}
jib{
from{
//베이스 이미지
image = 'openjdk:11.0.6-jre-slim-buster'
}
to{
//업로드할 이미지 이름
image = "arsgsg/jib-example"
//이미지의 태그
tags = ["${project.version}".toString(), "${BUILD_VERSION}".toString()]
}
container{
//실행될 메인 클래스의 경로
mainClass = "com.dockerspring.demo.DemoApplication"
//expose시킬 포트 번호
ports = ["8080"]
//도커 볼륨과 같다.
volumes = ["/tmp"]
}
}
실행하는 명령어는 다음과 같다.
//도커 허브에 액세스할 수 있어야 한다. 기본으로는 로컬에 저장된 도커 credential을 따른다.
./gradlew jib
와우! 도커 허브에 이미지가 푸쉬되었다! 이제 컴포즈를 실행하면 이미지를 pull 받을 수 있게 되었다.
#docker-compose.yml
version: '3.8'
services:
db:
image: postgres:13
restart: always
environment:
POSTGRES_PASSWORD: kw123
db_admin:
image: dpage/pgadmin4
depends_on: [db]
ports: [8081:80]
environment:
PGADMIN_DEFAULT_EMAIL: postgres@kw.ac.kr
PGADMIN_DEFAULT_PASSWORD: kw123
controller:
image: arsgsg/jib-example
depends_on: [db]
ports: [8080:8080]
volumes:
- ./images:/var/lib/kw/images
controller.image에 주목하자. docker-compose up을 실행하면 계정명/도커 이미지 이름으로 pull받아 실행하게 된다.
앞서 수동으로 jar를 빌드할 때와 무엇이 달라졌는지 살펴보자.
1. 빌드된 jar의 버전이 도커 이미지와 묶여서 버전 관리를 같이할 수 있게 되었다.
2. 이미지 레이어 캐싱을 사용하여 빌드를 빠르게 할 수 있다.
(jar로 묶인 파일은 캐싱을 적용할 수 없다고 한다. 하려면 압축을 풀어서, 단계를 나눠야 한다)
'컨테이너 스터디' 카테고리의 다른 글
쿠버네티스 이론 및 실습 (0) | 2021.05.11 |
---|---|
도커 컴포즈 (0) | 2021.04.27 |
도커의 작동 원리 이론과 실습 (0) | 2021.04.13 |