系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker

OK,我们创建一个简单的 SpringBoot 项目 DockerTest

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第1张图片

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}
                    ${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:

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第2张图片

如果打包报错:请把本地的 Xftp 关闭,因为 target 目录正在被占用。

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第3张图片

 

这时候,在我们的项目下有一个 target 目录,打开可以看到我们打包好的 jar(默认是 jar 包格式)。

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第4张图片

 

我们对生成的 jar 鼠标右键,找到 Show in Explorer,就自动打开此 jar 的目录:

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第5张图片

结果:

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第6张图片

 

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

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第7张图片

然后把 jar 上传到 dockerapp 目录下:

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第8张图片

在 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   保存退出。

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第9张图片

4、使用 docker build 命令构建镜像。格式: docker build -t 镜像名称:标签 Dockerfile的相对位置

docker build -t my-docker-test-image . 

说明:my-docker-test-image 是我自定义的镜像名称,可以叫别的,但是必须全部是小写字母。后面的点 . 是 Dockerfile 的相对位置,这里因为它们是在同一个目录下,所以用点 . 表示。

结果:

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第10张图片

 

5、验证我们的镜像文件已经打成功。使用命令:docker images

docker images

结果:

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第11张图片

6、启动容器。使用命令 docker run

docker run -d -p 8080:9090 my-docker-test-image

说明:-d 表示在后台运行,-p 表示开放容器端口映射到宿主机端口。也就是 docker 容器的 9090 端口映射到虚拟机的 8080 端口。

加了 -d 就不会显示 SpringBoot 的启动信息:

我们先不加 -d,就能看到 SpringBoot 的启动信息:

系列学习 docker 之第 4 篇 —— 构建项目的 docker 镜像并发布项目到 docker_第12张图片

如果遇到报错:

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

 

 

你可能感兴趣的:(系列学习,docker,docker,构建docker镜像)