项目结构

本项目采用maven构建,有三个模块,分别是pms-interfaces, pms-services, pms-portal。

模块 描述
pms-interfaces 接口层,只能存放实体,枚举,接口。
pms-services 服务层,使用 dubbo向外暴露服务
pms-portal 用户界面层,使用前后端分离的方式来构建用户界面,它又分为frontend和spring mvc两层。其中spring mvc 的controller负责访问dubbo服务,然后向frontend提供restful服务。

项目结构截图如下:

使用docker-maven-plugin

  1. 其中parent POMs和 pms-interfaces不需要构造镜像,因此需要跳过。
    <!--build plugin-->
<build>
<plugins>
<!--docker-maven-plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<skipDockerBuild>true</skipDockerBuild>
</configuration>
</plugin>
</plugins>
</build>
  1. pms-services的配置
  • POM配置
	<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--docker-maven-plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<skipDockerBuild>false</skipDockerBuild>
<imageName>${project.name}:${project.version}</imageName>
<dockerDirectory>${project.basedir}/docker</dockerDirectory>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
  • Dockerfile的定义,位置在项目目录下的docker文件夹中(${project.basedir}/docker)
# Dockerfile
FROM java:8-jre # 设置工作目录
WORKDIR /app # 将jar文件拷贝到镜像中。注:docker-maven-plugin 会将jar文件拷贝到构建目录target/docker/中
COPY ./pms-services-1.0-SNAPSHOT.jar /app/app.jar EXPOSE 20880
CMD ["java", "-jar", "/app/app.jar"]

容器在运行时向外暴露20880端口

  1. pms-portal的配置
  • POM配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--docker-maven-plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<skipDockerBuild>false</skipDockerBuild>
<imageName>${project.name}:${project.version}</imageName>
<dockerDirectory>${project.basedir}/docker</dockerDirectory>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
  • Dockerfile的定义,位置在项目目录下的docker文件夹中(${project.basedir}/docker)
# Dockerfile
FROM java:8-jre # 设置工作目录
WORKDIR /app # 将jar文件拷贝到镜像中。注:docker-maven-plugin 会将jar文件拷贝到构建目录target/docker/中
COPY ./pms-portal-1.0-SNAPSHOT.jar /app/app.jar EXPOSE 8000
CMD ["java", "-jar", "/app/app.jar"]

容器在运行时向外暴露8000端口

  1. 注意:在使用docker-maven-plugin时,还需要在~/.m2/settings.xml中的pluginGroups节点下增加com.your.plugins
 <!-- pluginGroups
| This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
| when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
| "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
|-->
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
<pluginGroup>com.spotify</pluginGroup>
</pluginGroups>
  1. 开始构建镜像
  • 在docker所在服务中配置tcp绑定
  [root@localhost ~]# cd /etc/docker
[root@localhost ~]# vim daemon.json
{
"registry-mirrors": ["http://b24820b7.m.daocloud.io"],
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
[root@localhost ~]# service docker restart
  • 在开发环境中配置环境变量DOCKER_HOST

  • 开始构建镜像
  mvn clean package docker:build -Dmaven.test.skip=true

在服务器上运行容器并测试

  • 依次运行pms-services, pms-portal
  [root@localhost ~]# docker run -d pms-services:1.0-SNAPSHOT
[root@localhost ~]# docker run -d -p 8000:8000 pms-portal:1.0-SNAPSHOT
  • 登录zookeeper gui查看dubbo服务注册信息



  # provider

  dubbo://172.17.0.2:20880/com.lovefly.pms.interfaces.service.TestService?anyhost=true&application=pms-services&dubbo=2.5.3&interface=com.lovefly.pms.interfaces.service.TestService&methods=echo&pid=1&revision=1.0-SNAPSHOT&side=provider&timestamp=1504436089577

  # consumer

  consumer://172.17.0.3/com.lovefly.pms.interfaces.service.TestService?application=pms-portal&category=consumers&check=false&dubbo=2.5.3&interface=com.lovefly.pms.interfaces.service.TestService&methods=echo&pid=1&revision=1.0-SNAPSHOT&side=consumer&timestamp=1504436100128

  • 在浏览器中访问pms-portal

  • 使用curl测试pms-portal

  [root@localhost docker]# curl -X GET http://192.168.41.128:8000/api/echo?input=ping2222
ping2222: pong from service
[root@localhost docker]#

在容器中配置时区的两种方式

  1. 通过docker-compose的volumes配置,跟宿主服务器操持一致
  volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
  1. 通过环境变量设置时区
  # 设置时区
ENV TZ=Asia/Shanghai

在容器中设置hosts

  1. 通过docker-compose的extra_host配置
  extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
  1. 通过命令行参数--add-host设置
  [root@localhost ~]# docker run -d --add-host "service.ielong.cn":172.17.0.4 --add-host "servicewx.ielong.cn":172.17.0.5  pms-services:1.0-SNAPSHOT

参考文档:

spring-boot dubbo项目使用docker方式部署的更多相关文章

  1. 【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志

    如题: docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志 场景再现: docker部署并启动 ...

  2. spring boot本地开发与docker容器化部署的差异

    spring boot本地开发与docker容器化部署的差异: 1. 文件路径及文件名区别大小写: 本地开发环境为windows操作系统,是忽略大小写的,但容器中区分大小写 2. docker中的容器 ...

  3. Spring Boot工程发布到Docker

    先聊聊闲话 搞过企业级的application运维的同仁肯定深有感触,每个application的功能交叉错杂,数据交换就让人焦头烂额(当然这和顶层业务设计有关系), 几十个application发布 ...

  4. 15 个优秀开源的 Spring Boot 学习项目,一网打尽!

    Spring Boot 算是目前 Java 领域最火的技术栈了,松哥年初出版的 <Spring Boot + Vue 全栈开发实战>迄今为止已经加印了 8 次,Spring Boot 的受 ...

  5. 15 个优秀开源的 Spring Boot 学习项目

    Spring Boot 算是目前 Java 领域最火的技术栈了,松哥年初出版的 <Spring Boot + Vue 全栈开发实战>迄今为止已经加印了 8 次,Spring Boot 的受 ...

  6. Spring Boot Dubbo applications.properties 配置清单

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 与其纠结,不如行动学习.Innovate ,And out execute ! 』 本文 ...

  7. 运行 Spring Boot 应用的 3 种方式

    今天介绍 3 种运行 Spring Boot 应用的方式,看大家用过几种? 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 ...

  8. 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南

    [SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...

  9. Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践

    Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践 Spring Boot + Nginx + Mysql 是实际工作中 ...

随机推荐

  1. JS原生添加删除class的方法

    之前习惯了使用jquery的addClass的方法,然后就去找了下别人写的代码. [javascript] view plain copy function hasClass(obj,cls) { r ...

  2. localStorage/cookie 用法分析与简单封装

    本地存储是HTML5中提出来的概念,分localStorage和sessionStorage.通过本地存储,web应用程序能够在用户浏览器中对数据进行本地的存储.与 cookie 不同,存储限制要大得 ...

  3. [Android] 针对生成的图片文件在系统Gallery不显示的处理

    之前遇到过一个问题,就是发现我在程序中生成一个新的 Bitmap 之后,当我打开系统的 Gallery 查看时,并没有看到新生成的图像.然而打开文件浏览器,找到保存 Bitmap 所在的文件夹下,还能 ...

  4. 《ECMAScript6标准入门》第三版--读书笔记

    2015年6月,ECMAScript 6正式通过,成为国际标准.尽管在目前的工作中还没有使用ES6,但是每项新技术出来总是忍不住想尝尝鲜,想知道ES6能为前端开发带来哪些变化?对自己的工作有哪些方面可 ...

  5. sublime中如何用less实现css预编译

    实现css预编译的方式有很多,听说glup很流行而且功能也很强大,但是就目前的工作而言,仅要css预编译和YUIcompress就够了,接下来切入正题 Less 是一门 CSS 预处理语言,它扩展了 ...

  6. 您还在用下一步下一步的方式安装SQLSERVER和SQLSERVER补丁吗?

    您还在用下一步下一步的方式安装SQLSERVER和SQLSERVER补丁吗? 介绍 假如你有50台服务器需要安装SQLSERVER,如果你用下一步下一步的方式,用远程桌面不停切换,那个效率... 大家 ...

  7. 一个服务器多个tomcat的配置

    下面我们把配置的详细过程写在下面,以供参考:(此例以配置三个Tomcat为例)1. 下载apache-tomcat-7.0.63,下载下来的文件为apache-tomcat-7.0.63.zip.2. ...

  8. SQL Server 复制表结构、整表数据

    1.将表1结构复制到表2 SELECT * INTO 表2 FROM 表1 WHERE 1=2 2.将表1内容全部复制到表2 SELECT * INTO 表2 FROM 表1

  9. pvr.ccz 与 png 格式 互转的解决方案

    pvr.ccz与png互转 pvr是苹果的一种图片格式,我们需要转成png,最简单的办法就是用TexturePacker. 准备工作 TexturePacker :http://www.codeand ...

  10. 【QT5】 第一个hello world 程序

    #include <QApplication> #include <QWidget> #include <QPushButton> int main(int arg ...