一、准备工作

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. 【集群实战】NFS网络文件共享服务

    1. NFS介绍 1.1 什么是NFS? NFS是Network File System的缩写,中文意思是网络文件系统. 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录. ...

  2. js数组排序和打乱

    js数组根据不同的业务需求,会要求数组有序或者无序,记录一下流传较广,通用性较强的排序和乱序方法. 数组排序: arr.sort(function(a,b){//从小到大 return a-b;[re ...

  3. Java ArrayList工作原理及实现

    http://yikun.github.io/2015/04/04/Java-ArrayList%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE% ...

  4. Mybatis详解系列(五)--Mybatis Generator和全注解风格的MyBatis3DynamicSql

    简介 Mybatis Generator (MBG) 是 Mybatis 官方提供的代码生成器,通过它可以在项目中自动生成简单的 CRUD 方法,甚至"无所不能"的高级条件查询(M ...

  5. Clickhouse 时区转换(下)

    Clickhouse 时区转换续—时区参数转换 天天加班,时间不够,主要还是我太懒,流汗,,,,,,另外如果这篇学习笔记超过100阅读量并有评论,我可能半夜也会爬起来更新的. 相信大家看我之前记录的这 ...

  6. #Week1 Introduction

    一.What is Machine Learning 课程里主要给了两个供参考的定义: By Arthur Samuel: Field of study that gives computers th ...

  7. P2024 食物链(种类并查集)

    P2024 [NOI2001]食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动 ...

  8. VMware15.5.0安装MacOS10.15.0系统 安装步骤(下)

    VMware15.5.0安装MacOS10.15.0系统安装步骤(下)超详细! 接上文第5条如果没看过上篇的话传送门:https://www.cnblogs.com/Top-chen/p/128024 ...

  9. CSS的基本语法及页面引用

    CSS的基本语法及页面引用 CSS基本语法 CSS的定义方法是: 选择器 { 属性:值; 属性:值; 属性:值;} 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多个 ...

  10. CC2530ADC转换

    一.ADC简介 ADC支持 14 位的模拟数字转换,具有多达12 位的 ENOB(有效数字位).它包括一个模拟多路转换器,具有多达8 个各自可配置的通道,以及一个参考电压发生器.转换结果通过DMA写入 ...