OK,我们创建一个简单的 SpringBoot 项目 DockerTest:
pom.xml 代码如下,注意我们需要指定启动类,否则会报错,找不到主程序类:
4.0.0
com.study
DockerTest
1.0.1.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-parent
2.2.0.RELEASE
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
Greenwich.SR2
pom
import
org.apache.maven.plugins
maven-compiler-plugin
2.4
${java.version}
${project.build.sourceEncoding}
true
lib/
com.study.DockerTestApplication
org.springframework.boot
spring-boot-maven-plugin
bootstrap.yml 代码如下,微服务的端口号是 9090:
server:
port: 9090
# 将SpringBoot项目作为单实例部署调试时,不需要注册到注册中心
eureka:
client:
fetch-registry: false
register-with-eureka: false
启动类 DockerTestApplication:
package com.study;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DockerTestApplication {
public static void main(String[] args) {
SpringApplication.run(DockerTestApplication.class,args);
}
}
请求类 TestController:
package com.study.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author biandan
* @description
* @signature 让天下没有难写的代码
* @create 2021-05-02 下午 7:26
*/
@RestController
public class TestController {
SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@RequestMapping(value = "/getInfo", method = RequestMethod.GET)
public String getInfo() {
return "现在是北京时间:" + SDF.format(new Date());
}
}
启动微服务,浏览器地址输入:http://127.0.0.1:9090/getInfo
1、我们先使用 maven 命令将项目打成 jar 包,最简单的方式就是使用 maven 插件 clean、package:
如果打包报错:请把本地的 Xftp 关闭,因为 target 目录正在被占用。
这时候,在我们的项目下有一个 target 目录,打开可以看到我们打包好的 jar(默认是 jar 包格式)。
我们对生成的 jar 鼠标右键,找到 Show in Explorer,就自动打开此 jar 的目录:
结果:
2、我们把打好的 jar 包放到虚拟机上。我们先创建 /usr/local/dockerapp 目录。
[root@localhost ~]# cd /usr/local/
[root@localhost local]# mkdir dockerapp
把 jar 通过 Xftp 上传到 dockerapp 目录下。最新推荐一个好用的 Xshell 客户端:https://pan.baidu.com/s/1_fp7sntXHawcFcelgD1a1A 提取码:4pmm
然后把 jar 上传到 dockerapp 目录下:
在 Xshell 端查看结果:
3、通过 Dockerfile 将 jar 构建成镜像文件,步骤如下:
先在 dockerapp 目录下创建 Dockerfile 文件:vi 命令如果有文件,表示编辑,没有表示新增。
[root@localhost dockerapp]# vi Dockerfile
然后把下面的代码粘贴到 Dockerfile 中:(进入编辑页面后,按键盘的 i 键进入 INSERT 模式)
#指定java8环境镜像
FROM java:8
# 复制文件到容器,MyDockerTest是我们重命名后的jar
ADD DockerTest-1.0.1.RELEASE.jar /MyDockerTest.jar
# 声明docker容器的启动端口号(与我们的微服务端口一致)
EXPOSE 9090
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","/MyDockerTest.jar"]
然后按 Esc 退出编辑模式,然后输入 :wq 保存退出。
4、使用 docker build 命令构建镜像。格式: docker build -t 镜像名称:标签 Dockerfile的相对位置
docker build -t my-docker-test-image .
说明:my-docker-test-image 是我自定义的镜像名称,可以叫别的,但是必须全部是小写字母。后面的点 . 是 Dockerfile 的相对位置,这里因为它们是在同一个目录下,所以用点 . 表示。
结果:
5、验证我们的镜像文件已经打成功。使用命令:docker images
docker images
结果:
6、启动容器。使用命令 docker run
docker run -d -p 8080:9090 my-docker-test-image
说明:-d 表示在后台运行,-p 表示开放容器端口映射到宿主机端口。也就是 docker 容器的 9090 端口映射到虚拟机的 8080 端口。
加了 -d 就不会显示 SpringBoot 的启动信息:
我们先不加 -d,就能看到 SpringBoot 的启动信息:
如果遇到报错:
docker: Error response from daemon: driver failed programming external connectivity on endpoint vigorous_chaplygin
(1cb5489ceacba9a45aa958d1221e8226a52a5efd62d6c9cb449b6797ffbc8fab): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9090 -j DNAT --to-destination 172.17.0.2:9090 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).
就重启 docker:
systemctl restart docker
7、列出运行中的容器:docker ps -a
结果:
8、浏览器输入地址:http://192.168.0.106:8080/getInfo (注意是输入虚拟机的IP地址,不是本机的127.0.0.1)
如果无法访问到,考虑关闭防火墙:
systemctl stop firewalld
OK,docker发布项目成功!
演示的代码地址:https://pan.baidu.com/s/1_00agW8l7YGXQzvqiiRrAw 提取码:77ee