整体架构

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 "" --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/ --attachable swarm_net # 确定集群是否完成,在manage节点上可以看到当前集群有哪些机器。
docker node ls # 添加集群可视化管理的工具portainer,它实际上还是docker提供的命令在干活
# 9001端口,进去后改密码,用户名 admin 密码 tryportainer
docker service create --name docker_portainer --publish : --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镜像

# 、添加环境变量,设置docker私有仓库的地址。可以设置永久的,也可以通过下面的命令设置临时的。(永久环境变量的方法自行百度)
# ip记得改成你自己的仓库地址
# windows下powershell临时设置,当前窗口有效
$Env:DOCKER_REGISTRY_URL = "192.168.99.100:5000"
# windows 下cmd临时设置
set DOCKER_REGISTRY_URL=192.168.99.100:
# linux 下临时设置,当前登录session有效
export DOCKER_REGISTRY_URL=192.168.99.100: # 注意:私服需要密码的情况,通过 docker pull 拉取镜像之前,需要先登录 docker login ... # 、通过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 ('', '123@qq.com', '', '', '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 ('', '充气玩具', '', '', '');

验证方式

、获取token
post 请求 http://192.168.99.101:8765/api/token/byPhone
{
"phone":"",
"password":""
} 、 http请求时header中设置Authorization的值为上面获取的token内容。
、下单:http://192.168.99.101:8765/api/order-service/order/new/1
返回end代表正常。 检查方式:看数据库有米有数据

集群service扩容/更新方式

# 、通过postainer可视化界面操作

# 、通过命令管理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名称>

其他常用的命令

# 、查看所有docker容器的资源占用情况
docker stats -a # 、看容器执行日志
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应用的更多相关文章

  1. 27.Docker集群部署

    对于scrapy的部署方式 1.Scrapyd 安装扩展组件,远程控制scrapy任务,包括部署源代码,启动任务,监听任务.scrapy-client .scrapyd api 协助完成部署和监听操作 ...

  2. RocketMQ(2)---Docker集群部署RocketMQ

    RocketMQ(2)-Docker集群部署RocketMQ =前言= 1.因为自己只买了一台阿里云服务器,所以RocketMQ集群都部署在单台服务器上只是端口不同,如果实际开发,可以分别部署在多台服 ...

  3. Spring Eureka 本地Docker集群部署

    故事背景 最近因为产线使用的服务与发现服务,使用的是Spring Cloud Eureka集群部署,为了以后调试产线的问题,想在本地搭建和产线一样的环境.产线的所有服务都是基于K8s和Docker部署 ...

  4. Clickhouse Docker集群部署

    写在前面 抽空来更新一下大数据的玩意儿了,起初架构选型的时候有考虑Hadoop那一套做数仓,但是Hadoop要求的服务器数量有点高,集群至少6台或以上,所以选择了Clickhouse(后面简称CH). ...

  5. Kubernetes&Docker集群部署

    集群环境搭建 搭建kubernetes的集群环境 环境规划 集群类型 kubernetes集群大体上分为两类:一主多从和多主多从. 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单 ...

  6. docker集群部署

    一.使用自定义网桥连接跨主机容器 要是Linux可以工作在网桥模式,必须安装网桥工具bridge-utils,运行命令:# yum install bridge-utils 查看桥连状态:# brct ...

  7. Nacos Docker集群部署

    参考文档:https://nacos.io/zh-cn/docs/quick-start-docker.html 1.从git上下载nacos-docker项目,本地目录为/docksoft/naco ...

  8. 使用Docker构建持续集成与自动部署的Docker集群

    为什么使用Docker " 从我个人使用的角度讲的话  部署来的更方便 只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 虚拟化让集群的管理和控制部署都更方便 hub.docke ...

  9. Docker集群管理工具 - Kubernetes 部署记录 (运维小结)

    一.  Kubernetes 介绍 Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernete ...

随机推荐

  1. Python3利用Dlib19.7实现摄像头人脸识别的方法

    0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,提取人脸特征,通过计算欧氏距离来和预存的人脸特征进行对比,达到人脸识别的目的: 可以自动从摄像头中抠取人脸图片存储到本地,然后提取构建 ...

  2. FileWriter与BufferedWriter的适用场景

    IO这块,各种Writer,Reader,让人眼晕 而在网上基本找不到在什么时候用哪个类,并且网上的IO demo 很多用法都是错的 在这简单的分析一下FileWriter与BufferedWrite ...

  3. MySQL案例05:CPU负载优化

    最近有套系统数据库周末总是告警,CPU使用率超过90%,开始由开发那边再跟进处理,我也就没参与,后来发现没进展就登录上去看了下,然后进行了部分优化,优化后效果还是比较明显的,具体优化过程本文会做详细的 ...

  4. 将旧的时间字符串转换为新的string时间字符串

    旧的时间字符串-->simpledataformat1.parse(该字符串) 获得date类型 -->simpledataformat2.format(date) simpledatef ...

  5. DRAM(动态)存储器

    一.DRAM的存储元电路 常见的DRAM存储元电路有四管式和单管式两种,它们的共同特点是靠电容存储电荷的原理来存储信息.电容上存有足够多的电荷表示“1”,电容上无电荷表示“0”. 由于电容存储的电荷会 ...

  6. Vue中$refs的用法

    说明:vm.$refs 一个对象,持有已注册过 ref 的所有子组件(或HTML元素) 使用:在 HTML元素 中,添加ref属性,然后在JS中通过vm.$refs.属性来获取 注意:如果获取的是一个 ...

  7. 寒假关于计算机课程的学习计划(第二次作业<二>)

    由于自己刚从紧张的高中学习中解脱出来,进入大学学习意识不够重视,导致学业与别人相差较大,特别是C语言,所以打算寒假主要先补一补C语言.自己在网上查找了很多资料,包括浙江大学翁凯老师在网易云课堂讲的&l ...

  8. facebook开源的代码审核工具phabricator

    主页地址:http://phabricator.org/

  9. 如何把GitHub中的开源项目导入到Eclipse

    准备: 1.需要注册GitHub的账号,并找到自己想导入的项目 2.在Eclipse的help-->Marketplace中搜索egit插件,然后安装 操作步骤: 1.有三种导入方式HTTP.S ...

  10. 协议森林03 IP接力赛 (IP, ARP, RIP和BGP协议)

    网络层(network layer)是实现互联网的最重要的一层.正是在网络层面上,各个局域网根据IP协议相互连接,最终构成覆盖全球的Internet.更高层的协议,无论是TCP还是UDP,必须通过网络 ...