一、准备工作

1.1 安装Docker环境

Docker 给旧版本的WIN系统提供的是Docker Toolbox下载(https://docs.docker.com/toolbox/overview/)。所以作者采用的是Docker Toolbox,下载后双击DockerToolbox.exe,

注意安装路径不要有中文

最后一项记得打上对勾

安装成功

安装完成后桌面会生成三个快捷方式,分别为:
(1) Docker Quickstart Terminal: 提供Docker的命令行操作
(2) Oracle VM VirtualBox: 虚拟机软件
(3) Kitematic (Alpha):图形化的docker工具

你可通过CMD查看docker是否安装成功,输入docker-machine,出现版本等信息。

在使用Docker前,要先创建docker machine,它其实是台虚拟机,不过在使用它的时候,你可能根本察觉不出来它是虚拟的。默认情况下,docker machine的所有文件都会保存在用户的根目录下,一般是在C盘,如果就用默认的位置,C盘的空间会越来越小,所以最好还是换个地方。 点击Git Bash,在起开所有docker应用之前需要先使用这个才能更改成功,修改默认的default machine的路径,不然,默认安装在C盘,会使C盘空间越来越小。

1.2 准备Java镜像

  (1)拉取java镜像

  # docker pull java => 默认为最新版本的镜像

  # docker pull java:8 => 标签为8的java镜像版本

  (2)查看java镜像

  # docker images java

  

  PS:java镜像有点大啊,643MB

二、部署Spring Boot微服务到Docker

2.1 Spring Boot示例准备

  这里以一个spring boot应用程序:eureka-service来介绍,它是基于spring cloud eureka的一个服务注册与发现的微服务应用程序,你可以从这里获取其源码。

  

2.2 快速借助Dockerfile部署到Docker

  (1)使用Maven打包项目:执行下面的命令,将其构建成jar包

MVN> mvn clean package  

  (2)在jar包所在目录,创建Dockerfile文件,并添加以下内容

# 基于Java8镜像
FROM java:8

# 将本地文件夹挂在到当前容器
VOLUME /tmp

# 复制文件到容器
ADD eureka-service-sn-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'

# 声明需要暴露的端口
EXPOSE 9000

# 配置容器启动后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

  (3)通过FTP工具将jar包和Dockerfile文件一起传送到服务器端,然后通过Shell工具登录并跳转到这个目录下,执行以下命令打包镜像:

  # docker build -t edc/discovery-service-eureka:0.0.1 . => 不要忘记这里有个 .

  

  # docker images => 可以看到在Java8的镜像基础之上,针对eureka-service的镜像已准备好

  

  (4)启动镜像:

  # docker run --name eureka-service -d -p 8761:8761 edc/service-discovery-eureka:0.0.1

  

  (5)验证是否已成功启动:访问http://docker宿主机IP:8761/,可以正常显示Eureka Server首页。

三、使用Docker Compose编排微服务

3.1 Docker Compose简介

  在实际的微服务架构中,一般包含很多个微服务,而且每个微服务都会部署多个实例,如果每个微服务都需要手动启停,那么效率会很低下,维护量也会很大。

  Compose是一个用于定义和运行多容器的Docker应用程序的工具,非常适合在开发、测试、构建CI工作流等场景。

  Compose的安装请参考:https://docs.docker.com/compose/install/#install-compose

  

  安装后验证如下:# docker-compose --version

  

  PS:我这里使用的Compose版本是1.22.0

3.2 Docker Compose快速入门示例

  首先,我们来了解下使用Compose的3个基本步骤:

  • 使用Dockerfile(或其他方式)定义应用程序环境,以便于在任何地方重现该环境
  • 在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行
  • 运行docker-compose up命令,启动并运行整个应用程序

  其次,我们仍然以上面的eureka-service为例,来快速实践一下Compose的基本步骤:

  (1)打包eureka-service,同上,不再赘述

  (2)创建Dockerfile文件,同上,不再赘述

  (3)在Dockerfile同一路径下创建docker-compose.yml,并添加以下内容:

version: '3'
services:
  eureka:                      # 指定服务的名称
    build: .                     # 指定Dockerfile所在路径,注意这里是个 .
    ports:
      - "8761:8761"         # 指定端口映射,类似docker run的-p选项,注意使用字符串形式

  (4)通过FTP工具将jar包、dockerfile以及docker-compose.yml一同拷贝到docker宿主机指定文件夹中

  (5)在这个目录下执行以下命令,启动容器。

  # docker-compose up

  

  PS:也可以使用docker-compose up -d 来通过后台运行的方式启动并运行这些容器

  (6)验证容器是否成功启动:访问http://docker宿主机IP:8761/,可以正常显示Eureka Server首页。

 

  最后,说说Docker Compose将所管理的容器分为三层,分别是工程(Project)、服务(Service)以及容器(Container)。Docker Compose运行目录下的所有文件(docker-compose.yml、extends文件或环境变量文件等)组成一个工程(默认为docker-compose.yml所在目录的目录名称)。一个工程可以包含多个服务,每个服务定义了容器运行的镜像、参数和依赖,一个服务可以包括多个容器实例。

  

  对应上图中的名称,工程名称是eureka-service(对应docker宿主机上的目录名称),该工程包含了1个服务,服务名称是eureka。当执行docker-compose up命令时,启动了eureka服务的1个容器实例eureka_1。

3.3 Docker Compose编排Spring Cloud微服务

  这里仍然会采用在2.1节提到的部分示例来(详情请参见github的part5部分)演示,将要编排的微服务列表如下表所示:

微服务项目名称 项目微服务中的角色
eureka-service   服务发现&注册组件
zuul-service   API网关
user-service   服务提供者
movie-service   服务提供者

  (1)分别通过maven打成jar包,不再赘述。

  PS:可以通过使用maven插件来构建docker镜像,需要在pom.xml添加一些内容,这里不阐述,有兴趣的可以百度一下。此外,由于Docker默认网络模式是bridge,各个容器的IP都不相同,因此如果在服务提供者的配置文件中设置了http://localhost:8761/eureka/会无法满足要求。这时,我们可以为Eureka Server所在容器配置一个主机名(例如discover),并让各个微服务使用主机名来访问Eureka Server。所以,这里讲所有微服务关于Eureka地址的配置改为如下内容:

eureka:
  client:
    serviceUrl:
      defaultZone: http://discovery:8761/eureka/

  (2)依次进行build打包docker镜像,这里仍然借助dockerfile,即每个微服务一个dockerfile

  

  (3)编写docker-compose.yml文件

version: '3'
services:
  # 指定服务名称
  eureka-service:
    # 指定服务所使用的的镜像,后续不再赘述
    image: edc/eureka-service:0.0.1
    # 暴露端口信息
    ports:
      - "8761:8761"
  zuul-service:
    image: edc/zuul-service:0.0.1
    # 连接到 eureka-service,这里使用的是SERVICE:ALIAS的形式
    links:
      - eureka-service:discovery
  user-service:
    image: edc/user-service:0.0.1
    links:
      - eureka-service:discovery
  movie-service:
    image: edc/movie-service:0.0.1
    links:
      - eureka-service:discovery

  (4)执行以下命令启动项目

  # docker-compose up -d

  PS:这里加上了-d,表示后台运行,否则你的整个屏幕都是日志输出...

  

  最终效果如下图所示:

3.4 Docker Compose编排高可用的Eureka Server

  针对Eureka Server,实现高可用的话,也可以通过Compose来编排Eureka Server集群(比如一个2个节点的高可用最小规模集群)。

  首先,需要针对Eureka Service的配置文件进行改造,以便通过同样的配置属性就可以实现两个节点的配置,这里仍然使用2.1节中的github中的示例(参见part1部分)。下面是eureka-service-ha-1的配置项,eureka-service-ha-2同理,不再赘述。

spring:
  application:
    name: eureka-service-ha-1
---
spring:
  # profile=peer1
  profiles: peer1
server:
  port: 8761
eureka:
  instance:
    # when profile=peer1, hostname=peer1
    hostname: peer1
  client:
    service-url:
      # register self to peer2
      defaultZone: http://peer2:8762/eureka
---
spring:
  # profile=peer2
  profiles: peer2
server:
  port: 8762
eureka:
  instance:
    # when profile=peer2, hostname=peer2
    hostname: peer2
  client:
    service-url:
      # register self to peer1
      defaultZone: http://peer1:8761/eureka

  从上面的配置文件中,两个节点是通过spring.profiles.active来区分配置属性的。

  然后,再来编写一个针对高可用eureka server的docker-compose.yml文件:

version: '3'
services:
  # 指定服务名称
  eureka-service-ha-1:
    hostname: peer1           # 指定hostname
    image: edc/eureka-service-ha:0.0.1-SNAPSHOT
    links:
      - eureka-service-ha-2   # 注册到另一个eureka-service中
    ports:
      - "8761:8761"
    environment:
      - spring.profiles.active=peer1
  # 指定服务名称
  eureka-service-ha-2:
    hostname: peer2           # 指定hostname
    image: edc/eureka-service-ha:0.0.1-SNAPSHOT
    links:
      - eureka-service-ha-1   # 注册到另一个eureka-service中
    ports:
      - "8762:8762"
    environment:
      - spring.profiles.active=peer2      

  其他步骤如3.3所述,这里不再进行演示。

3.5 Docker Compose编排可伸缩的微服务

  这里仍然以3.3中的movie-service为例,执行以下命令来达到微服务节点的扩展(这里从1个节点变为2个节点):

  # docker-compose scale movie-service=2

  从上图可以看出,movie-service实例已从1个变为了2个。

  同理,要伸缩为1个节点,只需要将2改为1即可,不再赘述。

四、小结

  本文极简地介绍了如何通过借助dockerfile的方式部署一个spring boot应用程序到docker,docker compose的快速入门示例以及如何通过docker compose编排spring cloud微服务应用程序,还介绍了实现编排高可用eureka server以及可伸缩的微服务的实现思路。关于docker与docker compose,还有许许多多的内容,其官方文档已经写得非常详细,并对常见的问题也已经有了很多详细的总结,大家可以参见:https://doc.docker.com/compose/faq/ 浏览。此外,十分感谢本文参考资料周立老师著的《Spring Cloud与Docker微服务架构实战(第二版)》,带我快速入门Spring Cloud的世界,谢谢!

Spring Boot在Docker上的部署的更多相关文章

  1. Spring Boot 和 Docker 实现微服务部署

    Spring boot 开发轻巧的微服务提供了便利,Docker 的发展又极大的方便了微服务的部署.这篇文章介绍一下如果借助 maven 来快速的生成微服务的镜像以及快速启动服务. 其实将 Sprin ...

  2. Spring Boot with Docker

    翻译自:https://spring.io/guides/gs/spring-boot-docker/ Spring Boot with Docker 这篇教程带你一步步构建一个Docker镜像用来运 ...

  3. spring boot——结合docker

    spring boot——结合docker 前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 liunx机器上,也可以实现虚 ...

  4. Spring Boot入门——文件上传与下载

    1.在pom.xml文件中添加依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  5. 集成spring boot + mysql + docker实战

    前言 网上找过很多文章,关于通过docker构建mysql容器并将应用容器和docker容器关联起来的文章不多.本文将给出具体的范例.此处为项目的源码 前置条件 该教程要求在宿主机上配置了: dock ...

  6. 居然仅用浏览器,就完成了Spring Boot应用的开发与部署!

    最近有幸试用了一下阿里云的一个新产品:云开发平台,体验一把全新的开发模式!虽然中间也碰到了一些问题,但整体的体验透露着未来感,因为整个过程都不需要使用我们最常用的IDEA,仅依靠浏览器就把一个Spri ...

  7. 使用Spring Boot创建docker image

    目录 简介 传统做法和它的缺点 使用Buildpacks Layered Jars 自定义Layer 简介 在很久很久以前,我们是怎么创建Spring Boot的docker image呢?最最通用的 ...

  8. Spring Boot 创建 Docker 镜像

    随着越来越多的组织转向容器和虚拟服务器,Docker正成为软件开发工作流程中一个更重要的部分.为此,Spring Boot 2.3中最新的功能之中,提供了为Spring Boot应用程序创建 Dock ...

  9. Spring Boot 在接收上传文件时,文件过大异常处理问题

    Spring Boot 在接收上传文件时,文件过大时,或者请求过大,spring内部处理都会抛出异常,并且捕获不到. 虽然可以通过调节配置,增大 请求的限制值. 但是还是不太方便. 之所以捕获不到异常 ...

随机推荐

  1. Gym 101194D Ice Cream Tower

    被一道数位DP折磨得欲仙欲死之后,再做这道题真是如同吃了ice cream一样舒畅啊 #include<bits/stdc++.h> using namespace std; #defin ...

  2. 深入理解Mysql——锁、事务与并发控制

    本文对锁.事务.并发控制做一个总结,看了网上很多文章,描述非常不准确.如有与您观点不一致,欢迎有理有据的拍砖! mysql服务器逻辑架构 每个连接都会在mysql服务端产生一个线程(内部通过线程池管理 ...

  3. 压缩工具gzip、bzip2、xz的使用

    2019独角兽企业重金招聘Python工程师标准>>> 本文使用 为了要压缩 常见压缩格式 压缩工具 gzip压缩工具 bz2压缩工具 xz压缩工具 为什么要压缩 为什么要压缩?文件 ...

  4. Docker PHP7官方镜像安装Redies扩展

    2019独角兽企业重金招聘Python工程师标准>>> 直接RUN docker-php-ext-install redis 失败,google得到: ENV PHPREDIS_VE ...

  5. 信息竞赛进阶指南--区间最值问题的ST算法

    void ST_prework() { for (int i = 1; i <= n; i++) f[i][0] = a[i]; int t = log(n) / log(2) + 1; for ...

  6. Scrapy爬虫快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

  7. 15分钟从零开始搭建支持10w+用户的生产环境(四)

    上一篇文章,介绍了这个架构中,WebServer的选择,以及整个架构中扩展时的思路. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(三)   五.架构实践 前边用了三篇文章,详细介绍了这个 ...

  8. Json格式数据的解析

    JSON是一种轻量级的数据交换格式,我们在编程中遇到的JSON数据通常就是一串字符串,只不过按照特定的格式去书写,这样当你把JSON数据传输给别人的时候对方只要使用这种特定的规则去阅读解析你的数据即可 ...

  9. JVM 虚拟机&&类加载(一)

    虚拟机 虚拟机简介 Java 虚拟机(JVM)是运行java程序的抽象计算机,它是计算机设备的规范,可以采用不同方式进行实现,java 程序通过运行在JVM中实现跨平台,一次编译到处运行,不同的操作系 ...

  10. jquery判断邮箱及密码是否输入正确的表单提交

    jquery我接触的也不是很多,基本就是照着案例然后查相关方法做出来的,基本用了大概半天的时间,手打加查资料实现.具体如下,首先下载一个jquery包,网址是https://jquery.com/do ...