Docker集群部署SpringCloud应用
Posted ymsk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker集群部署SpringCloud应用相关的知识,希望对你有一定的参考价值。
docker环境准备
# linux下的安装,自行百度 # windows docker toolbox下载地址 https://download.docker.com/win/stable/DockerToolbox.exe # 创建myvm3 这个虚拟机内存尽量大,6g以上最好 # https://0eenj1uv.mirror.aliyuncs.com这个是阿里云加速器的地址。 docker-machine create --virtualbox-memory "6144" --engine-registry-mirror="https://s0iielsh.mirror.aliyuncs.com" --engine-insecure-registry="0.0.0.0/0" -d virtualbox myvm3 # 停止 docker-machine.exe stop myvm3 # 启动 docker-machine.exe start myvm3 docker-machine env myvm3 # windows cmd下 执行下面这个命令,代表当前cmd控制台会使用myvm3中的docker @FOR /f "tokens=*" %i IN (‘docker-machine env myvm3‘) DO @%i # windows powershell下 执行下面这个命令,代表当前cmd控制台会使用myvm3中的docker & "docker-machine.exe" env myvm3 | Invoke-Expression
创建swarm集群
# 创建swarm集群 # 在myvm1中创建一个swarm manage主节点。 linux下直接写IP,windows下写虚拟机IP docker swarm init --advertise-addr <机器ip> # 创建集群下的网络 docker network create -d overlay --subnet 10.0.0.1/24 --attachable swarm_net # 确定集群是否完成,在manage节点上可以看到当前集群有哪些机器。 docker node ls # 添加集群可视化管理的工具portainer,它实际上还是docker提供的命令在干活 # 9001端口,进去后改密码,用户名 admin 密码 tryportainer docker service create --name docker_portainer --publish 9001:9000 --constraint ‘node.role == manager‘ --mount type=bind,src=/etc/localtime,dst=/etc/localtime --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock portainer/portainer -H unix:///var/run/docker.sock # 新的节点怎么加入? # 在manage节点上执行下面这个命令,生成一个用于新manage加入的token。 在新节点中心执行输出的内容可以用于manage加入swarm集群 docker swarm join-token manager # 在manage节点上执行下面这个命令,生成一个用于worker节点加入的token。在新节点中心执行输出的内容可以用于worker子节点加入swarm集群 docker swarm join-token worker # 如果要退出swarm集群,使用下面这个命令,退出不了就加个 --force docker swarm leave
部署基础环境
# 一键运行(这些基础中间件是单机部署的)单机和集群两种方式 # swarm集群部署(注:中间件并不是说部署了多个实例就是集群了,要注意。) docker stack deploy --compose-file .docker-compose-middleware.yml base
maven配置
<!--修改maven中conf/settings.xml文件--> <!--servers节点加入docker私有仓库的用户名和密码信息--> <servers> <server> <id>docker-aliyun-hub</id> <username>用户名</username> <password>密码</password> <configuration> <email>邮箱</email> </configuration> </server> </servers>
构建微服务的docker镜像
# 1、添加环境变量,设置docker私有仓库的地址。可以设置永久的,也可以通过下面的命令设置临时的。(永久环境变量的方法自行百度) # ip记得改成你自己的仓库地址 # windows下powershell临时设置,当前窗口有效 $Env:DOCKER_REGISTRY_URL = "192.168.99.100:5000" # windows 下cmd临时设置 set DOCKER_REGISTRY_URL=192.168.99.100:5000 # linux 下临时设置,当前登录session有效 export DOCKER_REGISTRY_URL=192.168.99.100:5000 # 注意:私服需要密码的情况,通过 docker pull 拉取镜像之前,需要先登录 docker login ... # 2、通过maven插件打包、构建镜像并推送到私有仓库 # 使用maven打包 mvn clean install # 将指定的服务 构建镜像 并 推送到私有仓库。 这个一定要在具体的服务下执行 mvn docker:build -DpushImage # mvn clean install docker:build -DpushImage # 管理私有镜像仓库 # 查看镜像,通过http请求 http://192.168.99.100:5000/v2/_catalog http://192.168.99.100:5000/v2/<镜像名>/tags/list # 删除镜像,这个操作需要在虚拟机内部去操作,喜欢折腾的去做。 # 进入容器内部 # docker exec -it registry bash # 镜像保存在这个文件夹下,可以手动删除里面的镜像 # /var/lib/registry/docker/registry/v2/repositories/ # 退出容器 exit
部署公共组件
# 公共组件有:eureka、configserver # 集群模式部署 docker stack deploy --compose-file .docker-compose-common.yml common-service
部署核心组件
# 核心组件部署 # 基础组件 网关和uaa # 数据库初始化 # 连接mysql服务器,创建uaa-db数据库 # 集群模式部署 docker stack deploy --compose-file .docker-compose-core.yml core-service # 启动完成以后,往uaa数据库中添加一个用户 INSERT INTO `uaa-db`.`tb_user` (`user_id`, `email`, `password`, `phone`, `user_name`) VALUES (‘1‘, ‘[email protected]‘, ‘123‘, ‘10086‘, ‘tony‘);
部署业务服务
# 业务服务部署 # 订单服务、仓储服务、短信服务、邮件服务 # 数据库初始化 # 连接mysql服务器,创建四个数据库order-db,wms-db,sms-db,mail-db # 集群模式部署 docker stack deploy --compose-file .docker-compose-service.yml biz-service # 启动完成以后,往wms数据添加一个商品 INSERT INTO `wms-db`.`tb_goods` (`goods_id`, `goods_name`, `sku_id`, `stock_count`, `version`) VALUES (‘1‘, ‘充气玩具‘, ‘1‘, ‘50‘, ‘0‘);
验证方式
1、获取token post 请求 http://192.168.99.101:8765/api/token/byPhone { "phone":"10086", "password":"123" } 2、 http请求时header中设置Authorization的值为上面获取的token内容。 3、下单:http://192.168.99.101:8765/api/order-service/order/new/1 返回end代表正常。 检查方式:看数据库有米有数据
集群service扩容/更新方式
# 1、通过postainer可视化界面操作 # 2、通过命令管理service 文档地址:https://docs.docker.com/engine/reference/commandline/service/ 查看集群中所有服务: docker service ls 更新指定的服务: docker service update 服务扩容: docker service scale # 服务栈 - 批量管理service 文档地址:https://docs.docker.com/engine/reference/commandline/stack/ 查看所有栈: docker stack ls 查看栈中服务的状态: docker stack ps <stack名称>
其他常用的命令
# 1、查看所有docker容器的资源占用情况 docker stats -a # 2、看容器执行日志 docker logs -f <容器ID或名称>
maven插件
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <imageName>${env.DOCKER_REGISTRY_URL}/${project.artifactId}:${project.version}</imageName> <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> <!-- 以下两行是为了docker push到DockerHub使用的。 --> <serverId>docker-aliyun-hub</serverId> <registryUrl>${env.DOCKER_REGISTRY_URL}</registryUrl> </configuration> </plugin>
编排服务
# 业务组件部署
# 订单服务、仓储服务、短信服务、邮件服务
version: "3.2"
services:
# 1、订单服务
order-service:
# 镜像地址
image: 192.168.99.100:5000/order-service:1.0.0
# 容器名称
container_name: order-service
# 端口不对外开放
env_file:
# 加载环境变量
- ./service.env
networks:
# 加入集群网络
- swarm_net
volumes:
# 将宿主机上的文件挂载到容器内
- type: "bind"
source: /etc/localtime
target: /etc/localtime
deploy:
# 实例数量
replicas: 1
# 更新选项
update_config:
# 每次更新多少个容器
parallelism: 1
# 间隔时间
delay: 10s
# 启动错误时,重新启动
restart_policy:
condition: on-failure
resources:
limits:
# CPU限制
cpus: ‘0.5‘
# 内存限制
memory: 256M
# 健康检查,启动后,当这个命令执行没问题,才会任何这个服务启动成功
healthcheck:
# 命令
test: ["CMD", "curl", "-f", "http://localhost:9001/info"]
# 间隔时间,安装应用的预计启动时间来设置。比如我们这个springcloud的应用,一般在1分钟半内预计启动完成
interval: 1m30s
timeout: 10s
# 重试次数
retries: 5
# 2、仓储服务
wms-service:
# 镜像地址
image: 192.168.99.100:5000/wms-service:1.0.0
# 容器名称
container_name: wms-service
# 端口不对外开放
env_file:
# 加载环境变量
- ./service.env
networks:
# 加入集群网络
- swarm_net
volumes:
# 将宿主机上的文件挂载到容器内
- type: "bind"
source: /etc/localtime
target: /etc/localtime
deploy:
# 实例数量
replicas: 1
# 更新选项
update_config:
# 每次更新多少个容器
parallelism: 1
# 间隔时间
delay: 10s
# 启动错误时,重新启动
restart_policy:
condition: on-failure
resources:
limits:
# CPU限制
cpus: ‘0.5‘
# 内存限制
memory: 256M
# 健康检查,启动后,当这个命令执行没问题,才会任何这个服务启动成功
healthcheck:
# 命令
test: ["CMD", "curl", "-f", "http://localhost:9002/info"]
# 间隔时间,安装应用的预计启动时间来设置。比如我们这个springcloud的应用,一般在1分钟半内预计启动完成
interval: 1m30s
timeout: 10s
# 重试次数
retries: 5
# 3、短信服务
sms-service:
# 镜像地址
image: 192.168.99.100:5000/sms-service:1.0.0
# 容器名称
container_name: sms-service
# 端口不对外开放
env_file:
# 加载环境变量
- ./service.env
networks:
# 加入集群网络
- swarm_net
volumes:
# 将宿主机上的文件挂载到容器内
- type: "bind"
source: /etc/localtime
target: /etc/localtime
deploy:
# 实例数量
replicas: 1
# 更新选项
update_config:
# 每次更新多少个容器
parallelism: 1
# 间隔时间
delay: 10s
# 启动错误时,重新启动
restart_policy:
condition: on-failure
resources:
limits:
# CPU限制
cpus: ‘0.5‘
# 内存限制
memory: 256M
# 健康检查,启动后,当这个命令执行没问题,才会任何这个服务启动成功
healthcheck:
# 命令
test: ["CMD", "curl", "-f", "http://localhost:9005/info"]
# 间隔时间,安装应用的预计启动时间来设置。比如我们这个springcloud的应用,一般在1分钟半内预计启动完成
interval: 1m30s
timeout: 10s
# 重试次数
retries: 5
# 4、邮件服务
mail-service:
# 镜像地址
image: 192.168.99.100:5000/mail-service:1.0.0
# 容器名称
container_name: mail-service
# 端口不对外开放
env_file:
# 加载环境变量
- ./service.env
networks:
# 加入集群网络
- swarm_net
volumes:
# 将宿主机上的文件挂载到容器内
- type: "bind"
source: /etc/localtime
target: /etc/localtime
deploy:
# 实例数量
replicas: 1
# 更新选项
update_config:
# 每次更新多少个容器
parallelism: 1
# 间隔时间
delay: 10s
# 启动错误时,重新启动
restart_policy:
condition: on-failure
resources:
limits:
# CPU限制
cpus: ‘0.5‘
# 内存限制
memory: 256M
# 健康检查,启动后,当这个命令执行没问题,才会任何这个服务启动成功
healthcheck:
# 命令
test: ["CMD", "curl", "-f", "http://localhost:9003/info"]
# 间隔时间,安装应用的预计启动时间来设置。比如我们这个springcloud的应用,一般在1分钟半内预计启动完成
interval: 1m30s
timeout: 10s
# 重试次数
retries: 5
networks:
swarm_net:
external: true
以上是关于Docker集群部署SpringCloud应用的主要内容,如果未能解决你的问题,请参考以下文章
docker+k8s+springcloud微服务集群部署实例
Jenkins+Docker+SpringCloud微服务持续集成(下)