
OK,我們創建一個簡單的 SpringBoot 專案 DockerTest:

pom.xml 代碼如下,注意我們需要指定啟動類,否則會報錯,找不到主程式類:
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>DockerTest</artifactId>
<version>1.0.1.RELEASE</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent>
<dependencies>
<!--Spring boot 集成包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--web支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.4</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<!-- 指定啟動類 -->
<mainClass>com.study.DockerTestApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/283074.html
標籤:其他
上一篇:【博客414】Go gin框架
下一篇:TCP/UDP
