项目整合参考:https://blog.csdn.net/qq_37823605/article/details/91379272
1.1.1、安装条件
Docker Compose是依赖于Docker引擎的,所以在安装Docker Compose之前要确保机器上已经安装了Docker
1.1.2、安装Compose
a)、使用curl命令从GitHub的Compose仓库拉取Docker Compose,具体指令如下:
$sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
b)、更改Docker Compose的可执行文件权限,具体操作命令如下:
$sudo chmod +x /usr/local/bin/docker-compose
$docker-compose --version
1.1.3、Compose的卸载操作,命令如下:
$sudo rm /usr/local/bin/docker-compose
Dooker Compose编排工具的使用非常简单,只需要如下三步。
(1)编写Dookerfile文件。使用Dockerfile定义应用程序的环境,这样可以在任何地方使用它,Dookefile 的作用就是为每个服务构建镜像。
(2)定义yml文件(通常是docker- compose.yml)。 就是将前面介绍的服务部署指令及相关参数都统一在该文件中编写和配置,这样就省去了针对不同服务各自运行的麻烦。
(3)运行服务部署指令。根据具体的部署需求,来执行相应的部署指令,Docker 会读即dooker- composeyml文件内容启动整个应用服务。
在上述三步中,第一步中Dockerfile文件的编写已经在第7章有过讲解,而第三步的服务部署指令会在后面服务部署环节进行说明,所以现在需要掌握的就是如何编写docker-composeym文件。接下来,将针对Compose file文件的定义和配置进行详细讲解。
这里先通过一个Compose file 文件的示例来进行展示说明,具体内容如下所示。
version: "3"
services:
mysql:
image: mysql:5.6
restart: on-failure
ports:
- 3306:3306
volumes:
- microservice-mysql:/var/lib/mysql
networks:
- microservice-net
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: microservice_mallmanagement
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints: [node.role == manager]
eureka-server:
image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8761:8761
networks:
- microservice-net
deploy:
replicas: 1
restart_policy:
condition: on-failure
gateway-zuul:
image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8050:8050
networks:
- microservice-net
depends_on:
- eureka-server
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints: [node.role == manager]
order-service:
image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 7900:7900
networks:
- microservice-net
depends_on:
- mysql
- eureka-server
deploy:
replicas: 2
restart_policy:
condition: on-failure
user-service:
image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8030:8030
networks:
- microservice-net
depends_on:
- mysql
- eureka-server
deploy:
replicas: 2
restart_policy:
condition: on-failure
visualizer:
image: dockersamples/visualizer:stable
ports:
- 8081:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints: [node.role == manager]
networks:
- microservice-net
networks:
microservice-net:
volumes:
microservice-mysql:
在Docker中,应用都是部署在容器中的,而容器又由镜像生成,镜像则通常是通过Dockerfile文件构建的,所以微服务与Docker整合的第一步就是 要提供Dockerile文件。
在上一个项目整合中讲解整合时编写的微服务项目microservice- -mallmanagement主要有4个子项目模块(包括2个微服务模块和2个辅助服务模块),我们需要针对每一个子项目模块编写对应的Dockerfile文件。这里以用户订单管理微服务模块为例,所编写的Dockerfile文件的具体内容如下所示。
FROM java:8-jre
MAINTAINER shirx
ADD ./target/microservice-orderservice-0.0.1-SNAPSHOT.jar /app/microservice-orderservice.jar
CMD ["java", "-Xmx200m", "-jar", "/app/microservice-orderservice.jar"]
EXPOSE 7900
Dockerfile文件编写完成后,就可以使用Docker的框关指令构建镜靠并运行容器。然后流问容器中的应用了。只是上述所有的操作都是手动完成的,如果需要部署多个服务。将会丰常项
针对这种情况MAVEN提供了一个dackerfile -maven-plugin插件,很好地支持了与Docker的整合。该插件的使用非常简单,只需要在所有需要生成Docker容器项目的pom文件中添加该插件,并进行一些相关配置即可,其具体使用示例如下。
com.spotify
dockerfile-maven-plugin
1.3.6
${docker.image.prefix}/${project.artifactId}
${project.version}
true
default
install
build
push
对于个别项目,可以直接通过Docker run等指令启动容器服务,但对于多个项目服务来有必要通过Docker compose编排工具运行服务。
接下来,就为microservice-mallmanagement添加一个docker-composeyml编排文件以便后续使用Docker compose编排工具,具体如文件所示
version: "3"
services:
mysql:
image: mysql:5.6
restart: on-failure
ports:
- 3306:3306
volumes:
- microservice-mysql:/var/lib/mysql
networks:
- microservice-net
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: microservice_mallmanagement
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints: [node.role == manager]
eureka-server:
image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8761:8761
networks:
- microservice-net
deploy:
replicas: 1
restart_policy:
condition: on-failure
gateway-zuul:
image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8050:8050
networks:
- microservice-net
depends_on:
- eureka-server
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints: [node.role == manager]
order-service:
image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 7900:7900
networks:
- microservice-net
depends_on:
- mysql
- eureka-server
deploy:
replicas: 2
restart_policy:
condition: on-failure
user-service:
image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8030:8030
networks:
- microservice-net
depends_on:
- mysql
- eureka-server
deploy:
replicas: 2
restart_policy:
condition: on-failure
visualizer:
image: dockersamples/visualizer:stable
ports:
- 8081:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints: [node.role == manager]
networks:
- microservice-net
networks:
microservice-net:
volumes:
microservice-mysql:
3.3.1、下载Linux版本的Maven工具包,并解压:下载地址http://maven.apache.org/download.cgi
3.3.2、将解压包移动到自定义目录下(这里将解压包直接移动到了opt目录下)
3.3.3、配置Maven环境变量。修改/etc/profile文件,
#set maven envirment
export M2_HOME=/opt/apache-maven-3.6.1/
export M2=$M2_HOME/bin
export MAVEN_OPTS="-Xms256m -Xmx512m"
export PATH=$M2:$PATH
由于之前3小节中dockerfile -maven的配置,在完成打包后也会自动构建镜像并推送到指定仓库,但无论是推送到Docker Hub还是本地私有镜像仓库,必须先登录认证才可进行推送。所以为了能够自动打包、构建镜像和推送镜像,在使用mvn install 命令打包之前,除了需要预先在dockerfile -maven插件配置中配置
192.168.159.143:5000
yxk
123
配置完成后,就可以将微服务项目microservice-malimanagement复制到manager1 服务主机的某个工作目录下,并进入到该项目pom文件所在位置(最外层的pom文件目录),然后使用mvn install 指令进行打包(首次打包会进行pom依赖文件的下载,所以需要一定的时间)。
执行完mvn install指令后的效果如下图所示。
如果出现如上图所示的“BUILD SUCCESS"信息,就表示打包、镜像构建和推送成功。如果某个过程执行失败,也可以从终端页面查看错误信息。
当确定全部执行成功后,我们还可以实际确认。先通过docker images指令查看镜像列表中是否有生成的指定镜像,然后再次进入本地私有镜像仓库配置的挂载目录/mntregistry/docker/rogistryN2/repositories进行确认,查看生成的镜像是否也推送到了本地仓库。
4.1.1、使用如下命令查看集群搭建后的网络列表详情。
docker network ls
从上图可以看出,当集群环境搭建完成后,会默认增加名为docker. gwbridge 和ingress的网络。其中ingress是集群环境下所有服务默认的网络管理方式,它主要用于在不同集群节点之间实现同一个服务的负载均衡,并且会默认为所有集群服务分配一个子网进行管理,而我们搭建微服务时,会根据需求自定义以overlay为驱动的网络用于多服务之间的通信管理。
这样,在搭建的集群环境下,就会出现多网卡网络管理的情况。由于它们分别对应不同的业务管理,所以可能会使得注册到Eureka中的服务地址有偏差,从而导致服务之间的通信失败,以及API网关代理的通信失败问题。
针对这个可能出现的问题,我们需要将自定义的网络,选择性地注册到Eureka注册中心上,具体的实现过程如下。
4.1.2、根据微服务项目的需求,在集群环境下预先自定义一 个以overlay为驱动的网络进行本地集群服务网络管理,具体操作指令如下。
docker network create -d overlay --subnet 10.0.0.0/24 microservice_net
执行上述指令后,会创建一个以overlay为驱动,名为microservice-net的网络,并且通过-- subnet参数指定该自定义网络的子网地址以10.0开头。
4.1.3、在所有需要注册到Eureka 注册中心的服务(包括microservice-gateway - zuul、microservice-orderservice和microservice-userservice服务)的配置文件application.yml中,添加指定注册到Eureka中心的优选服务子网地址信息,具体内容如下。
spring:
cloud:
inetutils:
preferred-networks:
- 10.0 # 设置注册到Eureka中心的优选服务地址
上述配置中,首先使用preferred-networks设置了该服务优选的网段以10.0开头,这与上面自定义的子网地址属于同一个网段;然后设置了prefer-ip-address属性值为true,表示优选通过IP地址找到对应的服务名称。
4.1.4、修改服务部署的编排文件docker-compose.yml,将所有服务启动时的网络设置为前面预先自定义的microservice_ net 网络来进行网络管理,将修改后的编排文件重命名为docker-compose - swarm.yml,如下所示。
version: "3"
services:
mysql:
image: mysql:5.6
restart: on-failure
ports:
- 3306:3306
volumes:
- microservice-mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: microservice_mallmanagement
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints: [node.role == manager]
eureka-server:
image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8761:8761
deploy:
replicas: 1
restart_policy:
condition: on-failure
gateway-zuul:
image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8050:8050
depends_on:
- eureka-server
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints: [node.role == manager]
order-service:
image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 7900:7900
depends_on:
- mysql
- eureka-server
deploy:
replicas: 2
restart_policy:
condition: on-failure
user-service:
image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOT
restart: on-failure
ports:
- 8030:8030
depends_on:
- mysql
- eureka-server
deploy:
replicas: 2
restart_policy:
condition: on-failure
visualizer:
image: dockersamples/visualizer:stable
ports:
- 8081:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints: [node.role == manager]
networks:
default:
external:
name: microservice_net
volumes:
microservice-mysql:
docker login 192.168.159.143:5000
注:进入为服务项目中docker-compose-swarm.yml文件所在目录下,使用docker stack deploy部署服务,具体操作如下
docker stack deploy \
> -c docker-compose-swarm.yml \
> --with-registry-auth \
> mallmanagement
docker service ls
docker stack ps mallmanagement
另外,由于在集群环境下部署服务是在后台启动的,所以在Docker客户端无法查看各个服务的启动详情。这里可以在集群管理节点上通过Docker service提供的服务日志指令来进一步查看某个具体服务从启动到运行的整个日志情况,具体操作指令如下。
docker service logs -f mallmanagement_oder-service
sudo apt install mysql-client-core-5.7
执行上述指令后,就会在当前Docker 机器上安装一一个版本为5.7的MySQL客户端(这是使用当前Ubuntu下自带的安装包进行安装的),通过该客户端我们就可以连接到刚才启动的MySQL数据库服务上,具体操作指令如下。
$ mysql -h 127.0.0.1 -uroot -P
执行上述指令并连接成功后,就可以参考第9章中的9.1.3 小节对数据库microservice_mallmanagement中的表和数据进行初始化了。
当然我们也可以不用在Docker机器上安装MySQL客户端来连接数据库进行数据操作,通过MySQL客户端连接工具(如Navicat )连接到启动的MySQL数据库的服务地址也可以进行数据库数据的初始化操作。
分别连接用户管理微服务和订单管理微服务的访问地址进行测试,具体地址分别为htp:/:/192. 168.197.143:8030/swagger-ui.html和htp://192.168.197.143:7900/swagger-ui.html (读者需要根据自己项目的服务地址进行访问)。此时测试方式同https://blog.csdn.net/qq_37823605/article/details/91379272 中的Swagger-U效果测试完全一样。
订单微服务接 口调用方法为http://192.168.159.143:7900/order-service/order/findOrders/1,而用户微服务接口调用方法为http://192.168.159.143:8050/order-service/order/findOrders/shitou,当使用Zuul 网关代理服务后,这两个微服务接口调用方法则分别更改为http://192.168.159.143:8050/order-service/order/findOrders/1和http://192.168.159.143:8050/order-service/order/findOrders/shitou(此时通过API网关访问其他所有的微服务时,访问者只会看到访问的是同一一个服务地址下的内容)。
7.1.1、下载Jenkins。官网地址:https://jenkins.io/download/
7.1.2、启动Jenkins服务
java -jar jenkins.war --httpPort=49001
7.1.3、Jenkins初始化安装。
a)初始化认证密码
b)初始化插件安装
c)创建管理员用户
7.2.1、安装Maven插件
7.2.2、系统全局插件配置
7.3.1、构建新任务
7.3.2、配置源码仓库地址 https://github.com/Datacloudeyeshot/docker.git
7.3.3、构建触发器
7.3.4、服务发布配置
7.4.1、选择Console Output查看输出信息
7.4.2、输出信息页面
7.4.3、控制台信息提示
1、集群部署过程中,创建网络检查网段是否冲突;
2、项目打包mvn install 时注意给项目包一定的执行权;
3、切换管理员用户时,注意source一下环境变量,使maven和java的环境变量生效;
4、在install过程中注意网络的连通性。