Вы создали приложение Spring Boot. Оно отлично работает на вашем локальном компьютере, и теперь вам нужно развернуть приложение где-то еще. На некоторых платформах вы можете напрямую отправить файл jar, и он будет развернут. В некоторых местах вы можете запустить виртуальную машину, загрузить туда исходный код, собрать ее и запустить. Но в большинстве случаев вам придется развертывать приложение с помощью контейнеров. Большую часть времени Docker используется для сборки и запуска образа в контейнере. Кроме того, когда вы загружаете файл jar на некоторые платформы, приложение запускается внутри контейнера под капотом.
Итак, в этом блоге мы увидим 3 различных способа создания образа Docker для данного приложения Spring Boot. Начнём:
Наивный и недостаточный способ создания образа Docker для любого приложения — использовать простой Dockerfile, который копирует файл jar внутри образа и запускает его с помощью команды java -jar.
Вот Dockerfile, который можно поместить в корень проекта:
FROM eclipse-temurin:21-jre-ubi9-minimal ARG JAR_FILE COPY ${JAR_FILE} application.jar ENTRYPOINT ["java", "-jar", "/application.jar"]
Мы указали один аргумент JAR_FILE, который является расположением используемого jar-файла.
После создания вышеуказанного файла Docker для создания образа Docker используются следующие шаги:
Создайте jar-файл для проекта Spring Boot:
./gradlew bootJar # For Gradle build system
ИЛИ
./mvnw spring-boot:build-jar # For Maven build system
Используйте Dockerfile для создания образа Docker с использованием последней версии jar-файла. В приведенной ниже команде замените {IMAGE_NAME} на необходимое имя изображения и {JAR_FILE} на путь к сгенерированному файлу jar. Имя изображения также содержит тег, например - mycompany/product-service:0.0.1-SNAPSHOT:
docker build --build-arg JAR_FILE={JAR_FILE} --tag {IMAGE_NAME} .
Проверьте, создан ли образ Docker, с помощью следующей команды. Вы должны увидеть изображение с именем, указанным в приведенной выше команде:
docker images
Хотя можно и легко упаковать jar Spring Boot uber как образ Docker (как упоминалось в предыдущем методе), копирование и запуск fat jar в образе Docker имеет множество недостатков. Например,
Поскольку мы компилируем наш код чаще, чем обновляем версию Spring Boot, лучше разделить вещи немного больше. Если мы поместим эти jar-файлы (которые редко изменяются) на уровень перед уровнем приложения, то Docker часто потребуется изменить только нижний уровень, а остальное можно будет выбрать из своего кеша.
Чтобы создать многоуровневый образ Docker, нам нужно сначала создать многоуровневый jar-файл. В настоящее время он включен по умолчанию в Gradle и Maven. Вы можете включить или отключить многоуровневое поведение jar, используя следующий параметр:
// build.gradle tasks.named("bootJar") { layered { enabled = false } }
// build.gradle.kts tasks.named("bootJar") { layered { enabled.set(false) } }
org.springframework.boot spring-boot-maven-plugin true
Вы даже можете настроить способ создания слоев. См. документацию по настройке gradle или maven.
Ниже приведен файл Dockerfile, который можно использовать для использования многоуровневого jar-файла и создания многоуровневого образа Docker приложения Spring Boot.
# Perform the extraction in a separate builder container FROM eclipse-temurin:21-jre-ubi9-minimal AS builder WORKDIR /builder # This points to the built jar file in the target folder # Adjust this to 'build/libs/*.jar' if you're using Gradle ARG JAR_FILE=target/*.jar # Copy the jar file to the working directory and rename it to application.jar COPY ${JAR_FILE} application.jar # Extract the jar file using an efficient layout RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted # This is the runtime container FROM eclipse-temurin:21-jre-ubi9-minimal WORKDIR /application # Copy the extracted jar contents from the builder container into the working directory in the runtime container # Every copy step creates a new docker layer # This allows docker to only pull the changes it really needs COPY --from=builder /builder/extracted/dependencies/ ./ COPY --from=builder /builder/extracted/spring-boot-loader/ ./ COPY --from=builder /builder/extracted/snapshot-dependencies/ ./ COPY --from=builder /builder/extracted/application/ ./ # Start the application jar - this is not the uber jar used by the builder # This jar only contains application code and references to the extracted jar files # This layout is efficient to start up and CDS friendly ENTRYPOINT ["java", "-jar", "application.jar"]
Шаги по созданию многоуровневого образа Docker такие же, как и при создании базового образа Docker. Пожалуйста, обратитесь туда.
Что, если я скажу вам, что вы можете создать образ Docker, не создавая Dockerfile? Мы можем создавать образы докеров непосредственно из плагина Gralde или Maven, используя Cloud Native Buildpacks. Некоторые платформы (например, Heroku или Cloud Foundry) используют Buildpacks для преобразования предоставленных jar-файлов в работоспособные образы.
Spring Boot включает поддержку сборок непосредственно для Maven и Gradle. Нам не нужно включать какие-либо дополнительные плагины. Просто запустите следующую команду:
./gradlew bootBuildImage # For gradle build system
ИЛИ
./mvnw spring-boot:build-image # For maven build system
Приведенная выше команда создает изображение с именем по умолчанию {PROJECT_NAME}:${PROJECT_VERSION}. Если вы хотите настроить имя сгенерированного изображения, вы можете выполнить следующие шаги:
Мы можем настроить задачу bootBuildImage для установки имени образа, например:
// For build.gradle.kts val imagePrefix = "javarush" val dockerImageName = "docker-example" tasks.named("bootBuildImage") { imageName.set("${imagePrefix}/${dockerImageName}:${version}") }
// For build.gradle def imagePrefix = "javarush" def dockerImageName = "docker-example" tasks.named("bootBuildImage") { imageName = "${imagePrefix}/${dockerImageName}:${version}" }
Мы можем настроить Spring-boot-maven-plugin для использования другого имени образа, например:
... javarush org.springframework.boot spring-boot-maven-plugin ${imagePrefix}/${project.artifactId}:${project.version}
Мы даже можем определить имя образа при запуске команды для создания образа.
./gradlew bootBuildImage --imageName=javarush/docker-example:1.0.0 # For grade build system ./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=javarush/docker-example:1.0.0 # For maven build system
Вы можете просмотреть документацию для дальнейшей настройки плагина Gradle или Maven.
Это мой основной метод создания образа Docker для любого приложения Spring Boot.
После создания образа Docker вам необходимо убедиться, что он работает должным образом. Убедившись, что образ создан, вы можете напрямую запустить его с помощью команды docker run. Например,
docker run -p "8080:8080" {IMAGE_NAME}
Но в производственных приложениях изображения используются не так. Docker Compose используется для запуска и управления несколькими образами Docker.
В этом блоге мы увидели, как создавать образы Docker для приложений Spring Boot, используя различные методы. Умение создавать образы Docker для ваших приложений — это обязательный навык, потому что именно образ доставляется. Спасибо, что дочитали статью до конца. Я ценю это. Я встречусь с тобой в следующем. Как всегда, все отзывы и предложения приветствуются.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3