| 
                             
                              | 
                                   
                                    | 编辑推荐: |   
                                    | 本文来自于个人博客,本文简单的介绍了如何通过借助dockerfile的方式部署一个spring 
                                      boot应用程序到docker。 |  |  一、准备工作 1.1 安装Docker环境 
 这一部分请参考我的另一篇文章《ASP.NET Core on Docker》,本文不再赘述。需要注意的是,如果你是Windows想要安装Docker,Docker 
                            for Windows需要64bit Windows 10 Pro,且需要开启Hyper-V。如果你不想开启Hyper-V,而又事先安装了VMware 
                            Workstation,可以参考晓晨的《Docker for Windows 使用VMware Station》。 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包 (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个基本步骤: 1.使用Dockerfile(或其他方式)定义应用程序环境,以便于在任何地方重现该环境 2.在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行 3.运行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部分)演示,将要编排的微服务列表如下表所示: 
 (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)编写docker-compose.yml文件 
                           
                              | version: 
                                  '3'services:
 # 指定服务名称
 eureka-service:
 build:
 context: eureka-service/
 # 指定服务所使用的的镜像,后续不再赘述
 image: edc/eureka-service:0.0.1
 # 暴露端口信息
 ports:
 - "8761:8761"
 zuul-service:
 build:
 context: zuul-service/
 image: edc/zuul-service:0.0.1
 # 连接到 eureka-service,这里使用的是SERVICE:ALIAS的形式
 links:
 - eureka-service:discovery
 user-service:
 build:
 context: user-service/
 image: edc/user-service:0.0.1
 links:
 - eureka-service:discovery
 movie-service:
 build:
 context: movie-service/
 image: edc/movie-service:0.0.1
 links:
 - eureka-service:discovery
 |  PS:这里我将各个服务都放在了分别的目录下,可以参考下图这个目录结构: 
 (3)通过以下命令在docker-comopose.yml所在的目录下进行build,统一打包镜像 # docker-compose build 
 打包后查看已经build好的镜像列表 
 (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即可,不再赘述。 四、小结 本文极简地介绍了docker compose的快速入门示例以及如何通过docker 
                            compose编排spring cloud微服务应用程序,还介绍了实现编排高可用eureka server以及可伸缩的微服务的实现思路。    |