使用Docker部署Java应用
创建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中运行起来。
- 上一篇
使用Docker制作OpenJDK镜像
准备OpenJDK首先,我们需要下载OpenJDK的Release包,下载地址: https://download.java.net/java/ga/jdk11/openjdk-11_linux-x64_bin.tar.gz说明:在虚拟机中下载可能会比较慢,这里
- 下一篇
为Kubernetes安装Dashboard
在《使用VirtualBox安装CentOS 7和Kubernetes》章节中,我们已经成功地使用VirtualBox虚拟机安装了CentOS 7.9、Docker和Kubernetes,现在我们继续安装Dashboard服务,以便于我们