一. 准备工作

      关于Docker的内容与入门命令实现已经在其他文章里详细介绍了,这里就不再多说。本篇文章主要详细讲解如何使用Docker部署Spring Cloud项目。

      本文采用的工程来自前面文章的工程eureka-server和eureka-client,我们将采用maven的方式去构建项目,并采用docker-maven-plugin去构建docker镜像。


二. 具体实现

      首先改造eureka-server工程,在pom.xml上加上插件:


<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<!-- tag::plugin[] -->
			<plugin>
				<groupId>com.spotify</groupId>
				<artifactId>docker-maven-plugin</artifactId>
				<version>1.0.0</version>
				<configuration>
					<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
					<baseImage>java</baseImage>
					<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
					<resources>
						<resource>
							<targetPath>/</targetPath>
							<directory>${project.build.directory}</directory>
							<include>${project.build.finalName}.jar</include>
						</resource>
					</resources>
				</configuration>
			</plugin>
			<!-- end::plugin[] -->
		</plugins>
	</build>






      简单说明一下插件的配置:

      · imageName指定了镜像的名称,“/”前面是仓库名称,后面是镜像名称,也可以再加上标签名称;

      · resources是指那些需要和Dockerfile放在一起,在构建镜像时使用的文件,一般应用 jar 包需要纳入。resources.resource.directory用于指定需要复制的根目录,${project.build.directory}表示target目录,resources.resource.include用于指定需要复制的文件,${project.build.finalName}.jar指的是打包后的jar包文件。

      然后修改application.properties配置文件:

server.port=8761

eureka.instance.prefer-ip-address=true
# 代表不向注册中心注册自己
eureka.client.register-with-eureka=false
# 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以设置为false
eureka.client.fetch-registry=false




      最后使用maven命令构建镜像:


mvn clean package docker:build

      这样运行后eureka-server镜像就构建完成。

      eureka-client镜像的构建也类似。pom.xml的一样加上插件配置,Dockerfile文件的编写也类似,然后修改application.properties配置文件:


spring.application.name=hello-service
# host改为镜像名
eureka.client.serviceUrl.defaultZone=http://eureka-server:8761/eureka
server.port=8763
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.application.name}:${random.int}

      注意上面的host要改为eureka-server镜像名。

      最后同样使用maven构建镜像:

mvn clean package docker:build




      到这里eureka-server和eureka-client镜像已经都构建好了,接着使用命令行启动镜像:


# 启动服务器
docker run --name eureka-server -p 8761:8761 -t dan/eureka-server 
# 注册服务
docker run --link eureka-server:8761 -p 8763:8763 -t dan/eureka-client



      运行起来后就能看到之前一样的内容了。


三. 使用docker-compose启动镜像

      我们从上面实现知道,可以使用Dockerfile(或Maven)构建镜像,然后使用docker命令操作容器,例如docker run、docker stop等。然而,使用微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例。如果每个微服务都要手动启停,那么效率之低、维护量之大可想而知。这时就需要使用Docker Compose了。

      Docker Compose 是一个用于定义和运行多容器的Docker应用的工具。使用Compose,你可以在一个配置文件(yaml格式)中配置你应用的服务,然后使用一个命令,即可创建并启动配置中引用的所有服务。


      接下来我们来使用docker-compose编排启动我们之前第九篇文章中的微服务工程。

      微服务列表如下:

      · eureka-server

      · eureka-client

      · service-ribbon

      · service-feign

      · service-zuul


3.1 构建镜像

      首先按照上面的方法为每个工程构建镜像,分别修改pom.xml、application.properties和Dockerfile。


3.2 使用docker-compose编排并启动镜像

      创建docker-compose.yml,编写内容:

version: '3'
services:
  eureka-server:
    image: dan/eureka-server
    ports:
      - "8761:8761"

  hello-service:
    image: dan/eureka-client
    ports:
      - 8763
    links:
      - eureka-server

  service-ribbon:
    image: dan/service-ribbon
    ports:
      - "8764:8764"
    links:
      - eureka-server 

  service-feign:
    image: dan/service-feign
    ports:
      - "8765:8765"
    links:
      - eureka-server

  service-zuul:
    image: dan/service-zuul
    ports:
      - "8769:8769"
    links:
      - eureka-server




      最后执行命令启动镜像:


docker-compose up



      使用浏览器访问http://localhost:8761/看到,所有服务都注册了:


docker springcloud 结合 springcloud docker部署_Docker

      如果要增加或减少docker实例,直接使用docker-compose scale hello-service=3修改实例数;停止运行则使用docker-compose stop即可。

源码下载:https://github.com/lingd3/SpringCloudLearning/tree/master/chapter12