下载帮

您现在的位置是:首页 > 教程分享 > 电脑技巧

电脑技巧

使用Docker部署Java应用

2022-01-31 11:20电脑技巧

创建Java应用

这里我们使用SpringBoot创建一个提供HTTP访问能力的Java应用,以便于我们验证部署结果。

我们可以使用spring initializer来创建,如果是使用的是IntelliJ IDEA的社区版,可以在spring官网来配置一个SpringBoot项目并下载到本地。

在浏览器中打开网址:https://start.spring.io/
在这个界面中,我们可以对项目进行初始的配置。因为这个项目当前仅做演示用,因此我们暂时先不进行额外的修改。但是需要注意的是,我们需要将Java的版本选为“11”,同时添加“Spring Web”依赖。然后点击下方的“GENERATE”按钮,将生成Maven项目并下载。

生成SpringBoot项目

 

为了避免有小伙伴因为网络等原因无法生成初始项目,此处我们贴出两个关键文件的代码(其他文件即使没有也不影响)。

/pom.xml:


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.6.3version>
        <relativePath/> 
    parent>
    <groupId>com.examplegroupId>
    <artifactId>demoartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>demoname>
    <description>Demo project for Spring Bootdescription>
    <properties>
        <java.version>11java.version>
    properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

project>

/src/main/java/com/example/demo/DemoApplication.java

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

然后,我们修改DemoApplication.java文件,增加一个RESTful接口用以后续测试,此时我们仅简单地输出一个字符串即可。修改后的文件内容如下:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @RequestMapping(method = RequestMethod.GET)
    String hello() {
        return "Hello Docker";
    }
}

然后,我们打开一个控制台,进入到项目目录(包含pom.xml的目录)中,执行以下命令对项目进行编译打包:

mvn clean package

打包成功后,我们进入到“target”目录中运行应用:

cd target
java -jar demo-0.0.1-SNAPSHOT.jar

其输出如下:

  .   ____          _            __ _ _
 /\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.3)

2022-01-27 01:22:28.696  INFO 3540 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication v0.0.1-SNAPSHOT using Java 17.0.1 on talefox with PID 3540 (E:\source-code\docker\demo	arget\demo-0.0.1-SNAPSHOT.jar started by talefox in E:\source-code\docker\demo	arget)
2022-01-27 01:22:28.699  INFO 3540 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2022-01-27 01:22:29.431  INFO 3540 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-01-27 01:22:29.440  INFO 3540 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-01-27 01:22:29.440  INFO 3540 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-01-27 01:22:29.499  INFO 3540 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-01-27 01:22:29.499  INFO 3540 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 755 ms
2022-01-27 01:22:29.776  INFO 3540 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-01-27 01:22:29.783  INFO 3540 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 1.41 seconds (JVM running for 1.714)

此时应用已顺利启动,我们可以在浏览器中访问这个API:

访问本地应用

 

此时,我们已经准备好了一个Java应用,下面我们将其部署到Docker容器中。

部署应用

首先,我们在项目的根目录中创建“Dockerfile”文件,并将以下内容保存到文件中:

FROM openjdk:11
COPY ./target/demo-0.0.1-SNAPSHOT.jar /opt/demo/
WORKDIR /opt/demo

此处我们再啰嗦一次这个Dockerfile文件内容的含义:

  • 步骤一,FROM openjdk:11,使用openjdk:11镜像作为我们待部署应用的容器的父镜像,这个镜像是我们在《使用Docker制作OpenJDK镜像》章节中制作的镜像
  • 步骤二,COPY ./target/demo-0.0.1-SNAPSHOT.jar /opt/demo/,将“target”目录下的“demo-0.0.1-SNAPSHOT.jar”文件拷贝到容器的“/opt/demo/”目录中
  • 步骤三:WORKDIR /opt/demo,将“/opt/demo”设置为工作目录,即在容器中进行操作的初始目录

然后,我们将项目目录作为共享目录挂载到虚拟机中:

将项目目录挂载到虚拟机

 

之后,我们启动虚拟机,并通过SSH连接到虚拟机进行操作,继续制作镜像。

首先,我们进入到项目目录(挂载共享目录时指定的目录):

cd /root/demo

然后,我们执行以下命令,制作Docker镜像:

docker image build -t demo:0.0.1 .

需要注意的是,这行命令的最后有一个点,表示在当前目录中寻找Dockerfile文件以制作命令。其中“-t”用来指定镜像的标签,这个镜像的标签即为“demo:0.0.1”。

镜像制作完成后,其输出结果如下:

Sending build context to Docker daemon  17.71MB
Step 1/3 : FROM openjdk:11
 ---> de5d1368d569
Step 2/3 : COPY ./target/demo-0.0.1-SNAPSHOT.jar /opt/demo/
 ---> 83f24fbed424
Step 3/3 : WORKDIR /opt/demo
 ---> Running in b683a2804786
Removing intermediate container b683a2804786
 ---> 9c07fc5eb13f
Successfully built 9c07fc5eb13f
Successfully tagged demo:0.0.1

现在,我们可以在本地看到刚刚制作的“demo:0.0.1”镜像了:

docker image ls

其输出结果为:

REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
demo         0.0.1     9c07fc5eb13f   About a minute ago   532MB
openjdk      11        de5d1368d569   26 hours ago         514MB
mysql        8.0.28    5b4c624c7fe1   6 days ago           519MB
centos       7         eeb6ee3f44bd   4 months ago         204MB

验证镜像

首先,我们使用新创建的镜像来创建一个容器并运行,将本机的8080端口绑定到容器的8080端口,并在容器中运行Java应用:

docker run --name demo -p 8080:8080 -d demo:0.0.1 java -jar demo-0.0.1-SNAPSHOT.jar

其中参数的含义如下:

  • --name,指示新创建的容器的名称为“demo”
  • -p,等同于“--publish”,指示在本机的8080端口发布容器的8080端口,需要注意的是冒号前是本机端口,后面是容器的端口
  • -d,等同于“--detach”,表示后台运行,并输出容器的唯一标识

之后便是使用的镜像名称,及在容器中执行的命令。因为之前在Dockerfile中,我们已经指定了容器的工作目录为“/opt/demo”,因此此时我们直接执行java命令即可,此时便是在该工作目录下执行命令。

现在我们来通过浏览器验证一下部署的结果:

访问Docker中的应用

 

到这里,我们已经成功地将自己编写的Java应用在Docker中运行起来。

文章评论