Docker和Java应用程序示例

Docker和Java应用程序示例_第1张图片 Docker和Java应用程序示例_第2张图片

在本教程中,我们将向您展示如何对Java应用程序(可执行的Jar文件)进行Docker化。

经过测试

  • Docker 19.03
  • Ubuntu 19
  • Java 8
  • 马文

在本文的结尾,我们将创建一个可执行的Jar文件,并在docker容器中运行。

1.项目目录

1.1标准的Maven项目结构。 在项目的根部看到Dockerfile吗? 我们只需要此Dockerfile文本文件即可对Java应用程序进行Docker化。

Docker和Java应用程序示例_第3张图片 Docker和Java应用程序示例_第4张图片

注意 .idea文件夹和docker-java-app.iml是IDEA配置文件,请忽略它。

2. Maven和Java应用程序

现在,我们将创建一个可执行的Jar文件。 该Jar将使用jsoup HTML parser从URL或网页中查找所有链接。

2.1项目依赖性。

pom.xml



    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应用程序。

App.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文件。

Dockerfile
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文件。

Dockerfile
#...

# 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/

你可能感兴趣的:(java,运维,shell)