在本教程中,我们将向您展示如何对Java应用程序(可执行的Jar文件)进行Docker化。
经过测试
- Docker 19.03
- Ubuntu 19
- Java 8
- 马文
在本文的结尾,我们将创建一个可执行的Jar文件,并在docker容器中运行。
1.项目目录
1.1标准的Maven项目结构。 在项目的根部看到Dockerfile
吗? 我们只需要此Dockerfile
文本文件即可对Java应用程序进行Docker化。
注意 .idea
文件夹和docker-java-app.iml
是IDEA配置文件,请忽略它。
2. Maven和Java应用程序
现在,我们将创建一个可执行的Jar文件。 该Jar将使用jsoup HTML parser
从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软件包并运行它。 它将在target/find-links.jar
处创建一个可执行jar文件,并将jsoup
依赖项复制到target/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
容器中启动此find-links.jar
。
4. Docker文件
Dockerfile
是一个文本文件,包含用于组装Dockerfile
所有命令。
4.1查看Dockerfile
的命令,它基于openjdk:8-jdk-alpine
(安装了openjdk-8
的高山Linux)创建一个Dockerfile
,并使用WORKDIR
更改了工作目录并将可执行的jar及其依赖项复制到此路径/usr/local/runme/
,然后使用ENTRYPOINT
运行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. Dockerize Java应用程序
现在,我们需要运行Dockerfile
的命令来解析Dockerfile
来组装Dockerfile
镜像。
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让我们使用sudo docker build -t name:tag .
构建一个docker镜像sudo docker build -t name:tag .
$ 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启动app.jar
容器,在启动过程中运行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应用程序进行了docker化。
6.常见问题
6.1如何访问docker容器的文件系统或shell进行调试?
答:在ENTRYPOINT
中注释ENTRYPOINT
,以避免Dockerfile
容器在启动过程中运行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 .
重新运行它,因为我们在Dockerfile
文件中定义了WORKDIR
,所以Dockerfile
容器将启动一个Shell并将目录更改为/usr/local/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映像进行部署?
答:更快的方法是将映像推送到docker hub并将其从服务器中拉出。
# 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 Boot的示例
下载源代码
$ git clone https://github.com/mkyong/docker-java
$ cd docker-java-app
$ mvn软件包
$ java -jar target / find-links.jar https://google.com// dockerize
//创建一个docker镜像
$ sudo docker build -t docker-java:1.0。
// 运行
$ sudo docker run -t docker-java:1.0 https://google.com
参考文献
- Dockerfile参考
- 码头工人
- docker hub openjdk图片
- Maven教程
- 改进的Docker容器与Java 10的集成
- Docker + Spring Boot示例
翻译自: https://mkyong.com/docker/docker-and-java-application-examples/