Java项目轻松搞定Docker部署

文章目录

  • 1.下面以Dockerfile的方式进行实现.
    • 1.1 在工程的pom.xml中添加dockerfile-maven-plugin插件
    • 1.2 在项目根目录下添加Dockerfile文件
    • 1.3 项目打包成镜像
    • 1.4 更多插件说明
  • 2. 将镜像发布到远程服务器的docker上
    • 2.1 远程服务器配置
    • 2.2 本地配置
  • 3. idea插件工具Docker integration
  • 4. 下一篇预告

该篇文章主要解决项目到Docker的繁琐部署过程,尽可能解放双手。

上篇文章 从Docker部署Springboot项目中学习Docker 中讲解了,Springboot项目到jar包最终在Docker中运行起来的详细部署过程,有兴趣可以看看。

如果让Springboot项目在打包的时候直接构建成镜像并上传到docker上,那就轻松多了.
手动构建镜像过程:

project -> jar -> Dockerfile -> jar+Dockerfile同一目录 -> docker build构建镜像 -> docker镜像

这种方式略有点麻烦,那么可以使用Maven插件一步到位.
Maven有个插件叫dockerfile-maven-plugin(https://github.com/spotify/dockerfile-maven)
它可以连接远程Docker,只要一个命令就能把本地的jar包打成Docker镜像,命令执行完毕后,服务器上就会有刚打包好的镜像,此时再执行该镜像即可.

project -> maven -> docker镜像

Maven插件构建镜像可以使用以下两种方式:

  • 第一种是在POM 中指定构建信息,
  • 第二种是使用 Dockerfile 中的信息构建。

第一种方式,支持将 FROM, ENTRYPOINT, CMD, MAINTAINER 以及 ADD 信息配置在 POM 中,不需要使用 Dockerfile 配置。如果使用 VOLUME 或其他 Dockerfile 中的命令的时候,需要使用第二种方式,创建一个 Dockerfile,并在 POM 中配置 dockerDirectory 来指定路径即可,默认情况下Dockerfile放在更路径下,不需要显示指定。

1.下面以Dockerfile的方式进行实现.

具体实现:

1.1 在工程的pom.xml中添加dockerfile-maven-plugin插件

            
                com.spotify
                dockerfile-maven-plugin
                ${dockerfile-maven-version}
                
                    
                        default
                        
                            build
                            push
                        
                    
                
                
            
                    eureka-server
                    ${project.version}
                    
                        ${project.build.finalName}.jar
                    
                
            

配置插件版本号

   
        1.4.9
    

p r o j e c t . b u i l d . f i n a l N a m e 默 认 为 {project.build.finalName}默认为 project.build.finalName{project.artifactId}-${project.version}的组合,这里就不做修改.

1.2 在项目根目录下添加Dockerfile文件

这里依然使用的Eureka-server为示例
Dockerfile的配置基本上和上一篇文章eureka-server的配置一致,只需要修改部分配置

FROM java:alpine
ARG JAR_FILE
ADD target/${JAR_FILE} eureka_server.jar
EXPOSE 9990
ENTRYPOINT ["java","-jar","/eureka_server.jar","--spring.profiles.active=prod"]

Java项目轻松搞定Docker部署_第1张图片

1.3 项目打包成镜像

通过以下命令进行打包:

mvn package -DskipTests

或者

mvn dockerfile:build

前者为maven自带的打包方式,插件会对maven的部分命令进行绑定处理;后者为插件提供的打包方式;
在控制台可以看到如下编译过程:

[INFO] Image will be built as eureka_server:0.0.1
[INFO] 
[INFO] Step 1/5 : FROM java:alpine
[INFO] 
[INFO] Pulling from library/java
[INFO] Digest: sha256:d49bf8c44670834d3dade17f8b84d709e7db47f1887f671a0e098bafa9bae49f
[INFO] Status: Image is up to date for java:alpine
[INFO] ---> 3fd9dd82815c
[INFO] Step 2/5 : ARG JAR_FILE
[INFO] 
[INFO] ---> Running in 41c578f75aed
[INFO] Removing intermediate container 41c578f75aed
[INFO] ---> 6c086f6e46b7
[INFO] Step 3/5 : ADD target/${JAR_FILE} eureka_server.jar
[INFO] 
[INFO] ---> 91e3b865def6
[INFO] Step 4/5 : EXPOSE 9990
[INFO] 
[INFO] ---> Running in b5bfb7b84db2
[INFO] Removing intermediate container b5bfb7b84db2
[INFO] ---> 9bbb925f43ba
[INFO] Step 5/5 : ENTRYPOINT ["java","-jar","/eureka_server.jar","--spring.profiles.active=prod"]
[INFO] 
[INFO] ---> Running in efcabf60de60
[INFO] Removing intermediate container efcabf60de60
[INFO] ---> de2b5c91d917
[INFO] Successfully built de2b5c91d917
[INFO] Successfully tagged eureka_server:0.0.1
[INFO] 
[INFO] Detected build of image with id de2b5c91d917
[INFO] Building jar: /Users/hgspiece/work/java/BootProject/server_zero/target/eureka_server-0.0.1-docker-info.jar
[INFO] Successfully built eureka_server:0.0.1

以上日志基本上和我们通过build命令执行日志一摸一样.

如果本地没有安装docker将会报如下错误:

HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1] failed: Connection refused: connect 

但执行完成后,我们可以进入项目目录看看build过程产生了什么,如下目录:
Java项目轻松搞定Docker部署_第2张图片
可见在target目录下多出了一个docker文件和一个xxx-docker-info的jar包,其中docker文件夹下每一个文件都是镜像的一些信息,打开文件一看便知,jar包便是用于打包成镜像的jar包,我们可以从上面build日志中看出.
进入本地执行的Docker,查看镜像是否存在
命令:docker images
在这里插入图片描述
运行eureka_server镜像

docker run -p 9990:9990 --name eureka eureka_server:0.0.1

启动该镜像看看好不好使用,正常情况一切顺利,不在多说.

1.4 更多插件说明

插件还提供了以下命令:

# 将镜像push到私有仓库
mvn deploy  相当于 mvn dockerfile:push

如果不想让插件绑定maven原有的命令,只需要将executions代码块注释即可


    
        default
        
              build
              push
        
    
 

2. 将镜像发布到远程服务器的docker上

上面成功的将项目通过maven插件的方式构建成本地镜像.可服务器在远程,那我该怎么办?

2.1 远程服务器配置

开放远程Docker远程访问端口

# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2377 -H unix:///var/run/docker.sock

Java项目轻松搞定Docker部署_第3张图片

在配置项中修改该属性,该方式会直接暴露可以操控docker进程的端口,需要注意安全,修改完后重启docker服务

sudo service docker restart

2.2 本地配置

让本地Docker访问到远程docker有两种方式(推荐方法1)
2.2.1 方法1:
docker-maven-plugin 插件默认连接本地 Docker 地址为:localhost:2375,所以我们需要先设置下环境变量

DOCKER_HOST=tcp://:2375

注意:如果没有设置 DOCKER_HOST 环境变量,可以命令行显示指定 DOCKER_HOST 来执行,如我本机指定 DOCKER_HOST:DOCKER_HOST=unix:///var/run/docker.sock mvn clean install docker:build。

2.2.2 方法2:
非Dockerfile文件的方式,直接在pom中进行配置

 
	${project.name}:${project.version}
	java
	["java","-jar","/${project.build.finalName}.jar}"]
	
	 http://:2375
	
	${project.artifactId}
	${project.version}
	
		
			/
			${project.build.directory}
			${project.build.finalName}.jar
		
	
	
	   	${project.build.finalName}.jar
	
 
  • imageName:用于指定镜像名称, p r o j e c t . n a m e 指 定 镜 像 名 称 , {project.name}指定镜像名称, project.name{project.version}镜像版本。
  • baseImage:用于指定基础镜像,类似于Dockerfile中的FROM指令。
  • entrypoint:类似于Dockerfile的ENTRYPOINT指令。
  • resources.resource.directory:用于指定需要复制的根目录,${project.build.directory}表示target目录。
  • resources.resource.include:用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。
  • buildArgs:定义构建时需要的参数。

并使用命令mvn clean package docker:build -DskipTests进行构建,顺利的话即可成功发布镜像。
到此Maven项目添加Docker相关插件告一段落,继续
紧接着也可以将ServerA和ServerB通过Maven插件方式打包成镜像.

3. idea插件工具Docker integration

有事你可能不想在maven上做配置,闲麻烦,同时也想降低项目与Docker的耦合性。这里推荐一个idea上的Docker插件。
http://plugins.jetbrains.com/plugin/7724-docker-integration
idea安装插件的具体操作这里不细说了,插件操作直接看图吧

  1. 配置插件,链接docker
    Java项目轻松搞定Docker部署_第4张图片
  2. 添加一个执行配置
    Java项目轻松搞定Docker部署_第5张图片
  3. 具体配置如下示例
    Java项目轻松搞定Docker部署_第6张图片
  4. 插件提供的功能操作区
    Java项目轻松搞定Docker部署_第7张图片
    其中包含了Docker已有容器及镜像,可以通过右键进行功能选择操作,是不是更加方便了。

快去试一试吧!

注意以上方式只试用于我们开发与测试,不太建议用于生产。

4. 下一篇预告

构建镜像的繁琐步骤变的简单来不少,但服务一多依然要写一大堆的link来启动我们的应用
针对改痛点,这里引出一个编排工具的概念。先来认识一下:
Docker-compose: 是一个基于Docker的编排工具,所谓编排个人理解就是将不同的镜像通过配置,组成一个新的运行环境,官方定义是:Compose is a tool for defining and running multi-container Docker applications.

你可能感兴趣的:(Docker)