1. Docker 개요
[도커] 어바웃 가상화 그리고 도커 핵심 정리
0. 강추 추천 강의 개발자를 위한 쉬운 도커 | 데브위키 - 인프런데브위키 | 현업 개발자가 도커를 사용한 경험을 녹여낸 새로운 커리큘럼으로 기존 교재 및 강의와 차별된 강의를 제공합니다.
progfrog.tistory.com
2. 전체 프로젝트 Docker 이미지 생성
./gradlew clean build -x test
- ./gradlew
- 이 명령어는 현재 디렉토리에 있는 Gradle Wrapper를 실행합니다. Gradle Wrapper는 프로젝트에 포함된 Gradle 버전을 사용하여 Gradle 빌드를 실행하는 스크립트입니다. 이것은 프로젝트가 Gradle을 설치하지 않은 경우에도 Gradle 빌드를 가능하게 합니다.
- clean
- 이 옵션은 이전에 생성된 빌드 아티팩트와 임시 파일들을 삭제합니다. 이렇게 함으로써 이전 빌드의 영향을 없애고, 깨끗한 상태에서 새로운 빌드를 시작할 수 있습니다.
- build
- 이 옵션은 프로젝트를 빌드합니다. 소스 코드를 컴파일하고 실행 가능한 아티팩트 (일반적으로 JAR 파일)를 생성합니다.
- -x test
- 이 옵션은 빌드 과정에서 테스트를 실행하지 않도록 지정합니다. 보통은 테스트를 실행하여 소프트웨어의 품질을 보장하지만, 때로는 빌드 속도를 높이거나 특정 환경에서 테스트를 실행하지 않아야 할 때 사용됩니다.
따라서 이 명령어는 프로젝트를 깨끗하게 정리한 후(이전 빌드 결과를 삭제), 테스트를 제외하고 빌드를 수행합니다.
jar vs. bootjar
실행 파일은 두 가지 종류가 있는데
- bootjar는 실행 가능한 jar 파일(ApiApplication 같이 main함수가 있는 경우)
- jar는 실행하지 않아도 빌드해서 만든 파일
domain의 경우는 main 함수가 없어서 오류가 남!
따라서, 해당 모듈은 실행 가능한 jar 파일을 만들지 말라고 명시하면 되고, 추가로 모듈별로 의존성이 있는 부분도 최상위 프로젝트의 build.gradle.kts에 작성한다.
import org.gradle.jvm.tasks.Jar
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.springframework.boot.gradle.tasks.bundling.BootJar
plugins {
kotlin("jvm") version "1.6.0"
kotlin("plugin.spring") version "1.6.10" apply false
kotlin("plugin.jpa") version "1.6.0" apply false
id("org.springframework.boot") version "2.6.3"
id("io.spring.dependency-management") version "1.0.11.RELEASE" apply false
}
repositories {
mavenCentral()
}
allprojects {
group = "happyprogfrog"
repositories {
mavenCentral()
}
}
subprojects {
apply {
plugin("org.jetbrains.kotlin.jvm")
plugin("org.jetbrains.kotlin.plugin.spring")
plugin("org.springframework.boot")
plugin("io.spring.dependency-management")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "11"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
}
project(":api") {
dependencies {
implementation(project(":domain"))
implementation(project(":kafka"))
}
}
project(":consumer") {
dependencies {
implementation(project(":domain"))
implementation(project(":kafka"))
}
}
// 최상위 프로젝트에 대해서 실행 가능한 main 함수가 없음을 명시
tasks.bootJar {
enabled = false
}
tasks.jar {
enabled = true
}
project(":domain") {
val jar: Jar by tasks
val bootJar: BootJar by tasks
bootJar.enabled = false // 실행 가능한 main 함수가 없음을 명시
jar.enabled = true
}
project(":kafka") {
val jar: Jar by tasks
val bootJar: BootJar by tasks
bootJar.enabled = false // 실행 가능한 main 함수가 없음을 명시
jar.enabled = true
}
settings.gradle.kts
gateway 모듈은 필요가 없어서(nginx로 대체) 모듈 삭제 및 여기에서도 제외해주기
rootProject.name = "fintech"
include("api")
include("consumer")
include("css")
include("domain")
include("kafka")
jar 파일을 실행하면 잘 실행되는 것을 알 수 있다.
java -jar api-0.0.1.jar
[Spring][프로젝트] Gradle MultiModule 세팅
Gradle MultiModule 세팅하기 그레이들 멀티모듈을 세팅하며 헷갈리고 어려웠던 부분을 정리합니다. > 모듈간 참조 그림 누구든 상품을 판매할 수 있는 마켓컨셉의 웹애플리케이션 빌드 에러 발생 위
velog.io
오늘의 오류 | 기본 manifest 속성이 없습니다
Travis CI 자동화 배포를 진행하면서 배포가 진행되지 않아서 로그를 확인하니 아래와 같은 에러를 확인할 수 있었다.. > *.jar에 기본 Manifest 속성이 없습니다.
velog.io
api-Dockerfile
FROM openjdk:11
RUN mkdir -p deploy
WORKDIR /deploy
COPY ./build/libs/api-0.0.1.jar api.jar
ENTRYPOINT ["java", "-jar", "/deploy/api.jar"]
consumer - Dockerfile
FROM openjdk:11
RUN mkdir -p deploy
WORKDIR /deploy
COPY ./build/libs/consumer-0.0.1.jar consumer.jar
ENTRYPOINT ["java", "-jar", "/deploy/consumer.jar"]
css - Dockerfile
FROM openjdk:11
RUN mkdir -p deployc
WORKDIR /deploy
COPY ./build/libs/css-0.0.1.jar css.jar
ENTRYPOINT ["java", "-jar", "/deploy/css.jar"]
3. Docker Compose
docker 폴더에 docker-build.sh 생성
#!/bin/sh
# Setting versions
VERSION='1.0.0'
cd ..
./gradlew clean build -x test
ROOT_PATH=`pwd`
echo $ROOT_PATH
ehco 'api Docker Image build...'
cd $ROOT_PATH/api && docker build -t fintech-api:$VERSION .
echo 'api Docker Image build... Done'
ehco 'consumer Docker Image build...'
cd $ROOT_PATH/consumer && docker build -t fintech-consumer:$VERSION .
echo 'consumer Docker Image build... Done'
ehco 'css Docker Image build...'
cd $ROOT_PATH/css && docker build -t fintech-css:$VERSION .
echo 'css Docker Image build... Done'
ehco 'nginx Docker Image build...'
cd $ROOT_PATH/nginx && docker build -t fintech-nginx:$VERSION .
echo 'nginx Docker Image build... Done'
docker-compose.yml 수정
이 부분은 내 컴퓨터에서 정상적으로 잘 진행되지 않아서,
아래의 방법으로 처리하고 프로젝트를 마무리하려고 한다.
nginx의 default.conf의 css-api - server 부분에 host.docker.internal 사용
-> 이건 nginx를 컨테이너로 띄우면, 호스트 OS의 localhost로 접근하기 위함!
upstream css-api {
server host.docker.internal:8081;
}
server {
listen 8085;
location /css {
proxy_pass http://css-api/css;
}
}
4. 테스트
그래서 수행해봤을 때, API들이 잘 호출되는 것 확인하고 프로젝트 마무리!!