В этом уроке мы покажем вам, как настроить Java-приложение (исполняемый файл Jar).
Протестировано с
- Докер 19.03
- Ubuntu 19
- Java 8
- Знаток
В конце статьи мы создадим исполняемый файл Jar и запустим его в контейнере docker.
1. Каталог проектов
1.1 Стандартная структура проекта Maven. Смотрите файл Dockerfile
в корне проекта? Нам нужен только этот Dockerfile
текстовый файл для настройки Java-приложения.
Примечание .идея
папки и docker-java-app.iml
являются файлами конфигурации IDEA, игнорируйте их.
2. Приложение Maven и Java
Теперь мы создадим исполняемый файл Jar. Этот Jar будет использовать синтаксический анализатор HTML jsoup
для поиска всех ссылок с URL-адреса или веб-страницы.
2.1 Зависимости проекта.
4.0.0 com.mkyong docker-java-app 1.0 docker-java-app https://www.mkyong.com UTF-8 1.8 1.8 1.8 1.12.1 5.4.0 org.jsoup jsoup ${jsoup.version} org.junit.jupiter junit-jupiter-params ${junit.version} test find-links org.apache.maven.plugins maven-compiler-plugin 3.8.0 ${java.version} ${java.version} org.apache.maven.plugins maven-jar-plugin 3.2.0 true com.mkyong.App lib/ org.apache.maven.plugins maven-dependency-plugin 3.1.1 copy-dependencies package copy-dependencies ${project.build.directory}/lib/
2.2 Простое приложение Java.
package com.mkyong; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; import java.util.HashSet; import java.util.Set; public class App { public static void main(String[] args) throws IOException { if (args.length < 1) { System.err.println("[Usage] jar -jar find-links.jar"); return; } String url = args[0]; for (String link : findLinks(url)) { System.out.println(link); } } private static Set findLinks(String url) throws IOException { Document doc = Jsoup.connect(url) .data("query", "Java") .userAgent("Mozilla") .cookie("auth", "token") .timeout(3000) .get(); Set links = new HashSet<>(); Elements elements = doc.select("a[href]"); for (Element element : elements) { links.add(element.attr("href")); } return links; } }
3.3 Пакет Maven и запустите его. Он создаст исполняемый файл jar по адресу target/find-links.jar
, и скопируйте jsoup
зависимости в целевую/lib
папку
Примечание – Забудьте о зависимостях JUnit 5
, мы не собираемся создавать никаких модульных тестов.
$ cd ~/projects/docker-java-app $ mvn package $ tree target â"œâ"€â"€ find-links.jar â"œâ"€â"€ lib â"'  â"œâ"€â"€ apiguardian-api-1.0.0.jar â"'  â"œâ"€â"€ jsoup-1.12.1.jar â"'  â"œâ"€â"€ junit-jupiter-api-5.4.0.jar â"'  â"œâ"€â"€ junit-jupiter-params-5.4.0.jar â"'  â"œâ"€â"€ junit-platform-commons-1.4.0.jar â"'  â""â"€â"€ opentest4j-1.1.1.jar $ java -jar target/find-links.jar [Usage] jar -jar find-links.jar$ java -jar target/find-links.jar https://google.com https://play.google.com/?hl=en&tab=w8 https://www.google.com/calendar?tab=wc /intl/en/about.html https://photos.google.com/?tab=wq&pageId=none https://drive.google.com/?tab=wo https://translate.google.com.my/?hl=en&tab=wT //...
Готово, далее мы начнем это find-links.jar
в контейнере докера.
4. Файл настройки
Файл Dockerfile
представляет собой текстовый файл, содержащий все команды для сборки образа docker.
4.1 Просмотрите команды в файле Dockerfile
, он создает базу изображений docker на openjdk:8-jdk-alpine
, в alpine linux с установленным openjdk-8
, изменил рабочий каталог с помощью WORKDIR
и скопируйте исполняемый файл jar и его зависимости по этому пути //usr/локальный/runme/
и запустите файл jar с ТОЧКОЙ ВХОДА
.
FROM openjdk:8-jdk-alpine ARG JAR_FILE=target/find-links.jar ARG JAR_LIB_FILE=target/lib/ # cd /usr/local/runme WORKDIR /usr/local/runme # copy target/find-links.jar /usr/local/runme/app.jar COPY ${JAR_FILE} app.jar # copy project dependencies # cp -rf target/lib/ /usr/local/runme/lib ADD ${JAR_LIB_FILE} lib/ # java -jar /usr/local/runme/app.jar ENTRYPOINT ["java","-jar","app.jar"]
Примечание Мы можем найти больше базовых изображений из docker hub
5. Докеризация Java-Приложения
Теперь нам нужно выполнить команды docker, чтобы проанализировать Файл Dockerfile
для сборки образа docker.
5.1 Перейдите в папку, содержащую Dockerfile
.
$ cd project $ pwd /home/mkyong/projects/docker-java-app $ ls -lsah 4.0K drwxr-xr-x 5 mkyong mkyong 4.0K Jan 21 18:35 . 4.0K drwxr-xr-x 6 mkyong mkyong 4.0K Jan 20 15:27 .. 4.0K -rw-r--r-- 1 mkyong mkyong 352 Jan 21 18:26 Dockerfile 4.0K -rw-r--r-- 1 mkyong mkyong 3.3K Jan 21 18:13 pom.xml 4.0K -rw-r--r-- 1 mkyong mkyong 267 Jan 21 18:35 readme.md 4.0K drwxr-xr-x 4 mkyong mkyong 4.0K Jan 20 15:27 src 4.0K drwxr-xr-x 10 mkyong mkyong 4.0K Jan 21 18:17 target
5.2 Позвольте создать образ docker с именем sudo docker build -t:тегом.
$ pwd /home/mkyong/projects/docker-java-app $ sudo docker build -t docker-java:1.0 . [sudo] password for mkyong: Sending build context to Docker daemon 1.206MB Step 1/7 : FROM openjdk:8-jdk-alpine ---> a3562aa0b991 Step 2/7 : ARG JAR_FILE=target/find-links.jar ---> Running in 8eaabda7c1ce Removing intermediate container 8eaabda7c1ce ---> 50eedc2911be Step 3/7 : ARG JAR_LIB_FILE=target/lib/ ---> Running in 7a6c30690589 Removing intermediate container 7a6c30690589 ---> 053f8ebac2a0 Step 4/7 : WORKDIR /usr/local/runme ---> Running in 91ab9f0f41d3 Removing intermediate container 91ab9f0f41d3 ---> eadff9da3d5d Step 5/7 : COPY ${JAR_FILE} app.jar ---> f52d6a8440c8 Step 6/7 : ADD ${JAR_LIB_FILE} lib/ ---> fd693617a411 Step 7/7 : ENTRYPOINT ["java","-jar","app.jar"] ---> Running in 1dce276e93b3 Removing intermediate container 1dce276e93b3 ---> 94b4a465425f Successfully built 94b4a465425f Successfully tagged docker-java:1.0
5.3 Запустите контейнер docker, запустите app.jar
файл во время запуска. Когда файл Jar завершит работу, выйдите из контейнера docker.
$ sudo docker run -t docker-java:1.0 https://google.com https://play.google.com/?hl=en&tab=w8 https://www.google.com/calendar?tab=wc /intl/en/about.html https://photos.google.com/?tab=wq&pageId=none https://drive.google.com/?tab=wo https://translate.google.com.my/?hl=en&tab=wT https://maps.google.com.my/maps?hl=en&tab=wl https://books.google.com.my/bkshp?hl=en&tab=wp https://mail.google.com/mail/?tab=wm //...
Закончив, мы докеризуем Java-приложение.
6. Часто задаваемые вопросы
6.1 Как получить доступ к файловой системе или оболочке контейнера docker для отладки? A: Прокомментируйте ТОЧКА ВХОДА
в Dockerfile
, чтобы контейнер docker не запускал файл jar во время запуска.
#... # cd /usr/local/runme WORKDIR /usr/local/runme #... # java -jar /usr/local/runme/app.jar # ENTRYPOINT ["java","-jar","app.jar"]
Перестройте образ docker.
$ sudo docker build -t docker-java:1.0 .
Повторите его, так как мы определили WORKDIR
в файле Dockerfile
контейнер docker запустит оболочку и изменит каталог на /usr/локальный/runme
, начните отладку здесь.
# -i $ sudo docker run -it docker-java:1.0 # This is docker container shell! /usr/local/runme # ls -lsah total 16 4 drwxr-xr-x 1 root root 4.0K Jan 21 10:38 . 4 drwxr-xr-x 1 root root 4.0K Jan 21 10:38 .. 4 -rw-r--r-- 1 root root 3.4K Jan 21 10:17 app.jar 4 drwxr-xr-x 2 root root 4.0K Jan 21 10:38 lib /usr/local/runme # cd lib /usr/local/runme/lib # ls -lsah total 1128 4 drwxr-xr-x 2 root root 4.0K Jan 21 10:38 . 4 drwxr-xr-x 1 root root 4.0K Jan 21 10:38 .. 4 -rw-r--r-- 1 root root 2.1K Jan 15 10:29 apiguardian-api-1.0.0.jar 388 -rw-r--r-- 1 root root 387.8K Jan 15 10:28 jsoup-1.12.1.jar 132 -rw-r--r-- 1 root root 131.0K Jan 15 10:29 junit-jupiter-api-5.4.0.jar 500 -rw-r--r-- 1 root root 499.9K Jan 15 10:29 junit-jupiter-params-5.4.0.jar 88 -rw-r--r-- 1 root root 87.2K Jan 15 10:29 junit-platform-commons-1.4.0.jar 8 -rw-r--r-- 1 root root 7.0K Jan 15 10:29 opentest4j-1.1.1.jar /usr/local/runme/lib # which java /usr/bin/java /usr/local/runme/lib # java -version openjdk version "1.8.0_212" OpenJDK Runtime Environment (IcedTea 3.12.0) (Alpine 8.212.04-r0) OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
Примечание Если контейнер docker запущен, мы можем получить к нему прямой доступ с помощью этой команды
$ sudo docker exec -ti container_name /bin/bash $ sudo docker exec -ti container_name /bin/sh
6.2 Как отправить образ docker для развертывания? A: Более быстрый способ – отправить изображение в концентратор docker и извлечь его с сервера.
# client # tag $ sudo docker image tag docker-java:1.0 mkyong2002/docker-java:1.0 # push $ sudo docker image push mkyong2002/docker-java:1.0 # server $ sudo docker pull mkyong2002/docker-java:1.0
Примечание Вам может понравиться это Примеры загрузки Docker + Spring
Скачать Исходный Код
//dockerize//создание образа докера $sudo сборка докера -t докер-java:1.0.//запустите его $sudo docker run -t докер-java:1.0 https://google.com
Рекомендации
- Ссылка на файл настройки
- сборка докера
- docker hub изображения openjdk
- Учебные пособия Maven
- Улучшена интеграция контейнера Docker с Java 10
- Примеры загрузки Docker + Spring
Оригинал: “https://mkyong.com/docker/docker-and-java-application-examples/”