1. Docker Compose简介
在实际的微服务架构中,一般包含很多个微服务,而且每个微服务都会部署多个实例,如果每个微服务都需要手动启停,那么效率会很低下,维护量也会很大。
Compose是一个用于定义和运行多容器的Docker应用程序的工具,非常适合在开发、测试、构建CI工作流等场景。
Compose的安装请参考:Docker-compose
安装后验证如下:# docker-compose —version
2. Docker Compose快速入门示例
首先,我们来了解下使用Compose的3个基本步骤:
- 使用Dockerfile(或其他方式)定义应用程序环境,以便于在任何地方重现该环境
- 在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行
- 运行docker-compose up -d命令,启动并运行整个应用程序
(1)分别通过maven打成jar包,目录结构如下。
(2)创建Dockerfile文件,这里可以省略。
(3)创建docker-compose.yml,并添加以下内容。
version: "3.2"
services:
registry: # 指定服务的名称
image: java:latest
volumes:
- ./code/registry.jar:/code/registry.jar
- ./code/registry.file:/code/registry.file
- /etc/localtime:/etc/localtime
ports:
- "8761:8761" # 指定端口映射,类似docker run的-p选项,注意使用字符串形式
restart: always
entrypoint: java -Xms500m -Xmx500m -jar /code/registry.jar > /code/registry.file 2>&1
network_mode: "host"
environment:
TZ: Asia/Shanghai
getway:
image: java:latest
volumes:
- ./code/getway.jar:/code/getway.jar
- ./code/getway.file:/code/getway.file
- /etc/localtime:/etc/localtime
ports:
- "9000:9000"
restart: always
entrypoint: java -Xms500m -Xmx500m -jar /code/getway.jar > /code/getway.file 2>&1
network_mode: "host"
environment:
TZ: Asia/Shanghai
sms:
image: java:latest
volumes:
- ./code/sms.jar:/code/sms.jar
- ./code/sms.file:/code/sms.file
- /etc/localtime:/etc/localtime
ports:
- "8090:8090"
restart: always
entrypoint: java -Xms500m -Xmx500m -jar /code/sms.jar > /code/sms.file 2>&1
network_mode: "host"
environment:
TZ: Asia/Shanghai
oss:
image: java:latest
volumes:
- ./code/oss.jar:/code/oss.jar
- ./code/oss.file:/code/oss.file
- /etc/localtime:/etc/localtime
ports:
- "8100:8100"
restart: always
entrypoint: java -Xms500m -Xmx500m -jar /code/oss.jar > /code/oss.file 2>&1
network_mode: "host"
environment:
TZ: Asia/Shanghai
quality:
image: java:latest
volumes:
- ./code/quality.jar:/code/quality.jar
- ./code/quality.file:/code/quality.file
- /etc/localtime:/etc/localtime
ports:
- "8040:8040"
restart: always
entrypoint: java -Xms500m -Xmx500m -jar /code/quality.jar > /code/quality.file 2>&1
network_mode: "host"
environment:
TZ: Asia/Shanghai
common:
image: java:latest
volumes:
- ./code/common.jar:/code/common.jar
- ./code/common.file:/code/common.file
- /etc/localtime:/etc/localtime
ports:
- "8082:8082"
restart: always
entrypoint: java -Xms500m -Xmx500m -jar /code/common.jar > /code/common.file 2>&1
network_mode: "host"
environment:
TZ: Asia/Shanghai
account:
image: java:latest
volumes:
- ./code/account.jar:/code/account.jar
- ./code/account.file:/code/account.file
- /etc/localtime:/etc/localtime
ports:
- "8010:8010"
restart: always
entrypoint: java -Xms500m -Xmx500m -jar /code/account.jar > /code/account.file 2>&1
network_mode: "host"
environment:
TZ: Asia/Shanghai
citic-pru:
image: java:latest
volumes:
- ./code/citic-pru.jar:/code/citic-pru.jar
- ./code/citic-pru.file:/code/citic-pru.file
- /etc/localtime:/etc/localtime
ports:
- "8011:8011"
restart: always
entrypoint: java -Xms500m -Xmx500m -jar /code/citic-pru.jar > /code/citic-pru.file 2>&1
network_mode: "host"
environment:
TZ: Asia/Shanghai
zipkin:
image: java:latest
volumes:
- ./code/zipkin.jar:/code/zipkin.jar
- ./code/zipkin.file:/code/zipkin.file
- /etc/localtime:/etc/localtime
ports:
- "9100:9100"
restart: always
entrypoint: java -Xms500m -Xmx500m -jar /code/zipkin.jar > /code/zipkin.file
network_mode: "host"
environment:
TZ: Asia/Shanghai
PS:可以通过使用maven插件来构建docker镜像,需要在pom.xml添加一些内容,这里不阐述。此外,由于Docker默认网络模式是bridge,各个容器的IP都不相同,因此如果在服务提供者的配置文件中设置了http://localhost:8761/eureka/会无法满足要求。这时,有两种办法解决这个问题:方法一:使用Docker的host模式,容器内不再产生虚拟网卡,完全共享宿主机网卡,我这里使用的是这种方法。方法二:我们可以为Eureka Server所在容器配置一个主机名(例如discover),并让各个微服务使用主机名来访问Eureka Server。所以,这里讲所有微服务关于Eureka地址的配置改为如下内容:
registry:
client:
serviceUrl:
defaultZone: http://discovery:8761/eureka/
(4)在这个目录下执行以下命令,启动容器。
# docker-compose -f docker-compose.yml up -d
(5)验证容器是否成功启动:访问http://docker宿主机IP:8761/,可以正常显示registry Server首页,并且注册中心可以发现注册的服务。
Docker Compose将所管理的容器分为三层,分别是工程(Project)、服务(Service)以及容器(Container)。Docker Compose运行目录下的所有文件(docker-compose.yml、extends文件或环境变量文件等)组成一个工程(默认为docker-compose.yml所在目录的目录名称)。一个工程可以包含多个服务,每个服务定义了容器运行的镜像、参数和依赖,一个服务可以包括多个容器实例。
(6)查看容器内输出的日志
docker-compose logs -f citic-pru
3. Docker Compose编排高可用的Eureka Server
针对Eureka Server,实现高可用的话,也可以通过Compose来编排Eureka Server集群(比如一个2个节点的高可用最小规模集群)。
首先,需要针对Eureka Service的配置文件进行改造,以便通过同样的配置属性就可以实现两个节点的配置。
4. Docker Compose编排可伸缩的微服务
这里仍然以3.3中的movie-service为例,执行以下命令来达到微服务节点的扩展(这里从1个节点变为2个节点):
# docker-compose scale oss-service=2