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
  

原文地址:https://www.cnblogs.com/ymsk/p/10723518.html

时间: 2024-07-31 16:02:11

Docker集群部署SpringCloud应用的相关文章

docker集群部署:第1部分:定位和设置

在这个由六部分组成的教程中:(1)在此页面上获取设置和导向.(2)建立并运行你的第一个应用程序(3)把你的应用变成一个扩展服务(4)跨多台机器跨越您的服务(5)添加一个持久数据的访客计数器(6)部署生产用的集群说明:应用程序本身非常简单,所以你不会被代码干扰太多.毕竟,Docker的价值在于它如何构建,发布和运行应用程序;对于你的应用程序实际上做什么是完全不可知的. 前提条件虽然我们将一路定义概念,但在开始之前,了解Docker的含义是非常好的.在继续之前,我们还需要熟悉一些概念:(1)IP地址

docker集群部署:第3部分:服务

介绍在第3部分中,我们将扩展应用程序并实现负载平衡. 关于服务在分布式应用程序中,应用程序的不同部分被称为"服务".例如,一个视频共享站点,它可能包括一个用于将应用程序数据存储在数据库中的服务,后面的视频转码服务用户上传东西,为前端服务等等.服务实际上只是"生产中的容器".服务只运行一个镜像,但它定义镜像运行的方式 - 应该使用哪个端口,容器应该运行多少个实例,以便服务具有所需的容量,以及等等.缩放服务会更改运行该软件的容器实例的数量,从而为流程中的服务分配更多的计

docker集群部署:第2部分:容器

介绍现在是开始构建Docker应用程序.我们将从这个应用程序的层次结构的底部开始,这个应用程序是一个容器.在这个层次上面是一个服务,它定义了容器在生产中的行为方式,将在第3部分中进行讨论.最后,在顶层是堆栈,定义了所有服务的交互,将在第5部分进行讨论. docker开发环境在过去,如果你要开始编写一个Python应用程序,你的第一步就是在你的服务器上安装一个Python运行库.但是,这会造成你的服务器上的环境必须如此,以使你的应用程序能够按预期运行.使用Docker,docker具有可移植性,你

docker 集群二(docker1.7)centos6.8 离线安装

一切都以客户为上帝,相信做实施的都遇到过,客户给的环境都是不让连接互联网的,是企业内网,那么离线安装docker就变的必要了. 1.首先说可以联网的安装docker yum install -y docker-engine service docker start 就是这么简单,你说要是让联网我们的效率能提高多少. 2.离线安装docker a.准备离线安装包 yum install --downloadonly --downloaddir=/root/docker http://dl.fedo

Docker Swarm集群部署应用

在Docker Swarm集群部署应用 我们过去使用docker run的命令创建容器, 把前面替换成docker service create就行了. 建议搭建一个registry,为所的docker主机提供镜像下载,否则你需要在每个docker主机本地存在容器镜像. 所以搭建一个私有仓库,由私有仓库提供所需要的镜像, 本实验环境中用node1同时作为registry. 拉取本地私有仓库registry,查看registry镜像 基础环境 全部为CentOS7系统,Docker 版本为1.12

Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)

0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 master 服务器的组件有:kube-apiserver.kube-controller-manager.kube-scheduler 因此需要下载k8s master,下载地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGE

SpringCloud组件:Eureka高可用集群部署

高可用集群部署 Eureka 服务注册中心.构建项目使用 idea 开发工具创建一个 SpringBoot 项目,添加 Eureka Server 依赖即可, pom.xml 配置文件如下所示: ...... <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>

Docker Swarm集群部署实战

基本概念: Swarm介绍:Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(dockerclient in Go, docker_py,docker等)均可以直接与Swarm通信.Swarm几乎全部用Go语言来完成开发,Swarm0.2版本增加了一个新的策略来调度集群中的容器,使得在可

Docker 集群环境实现方式

Docker 集群环境实现的新方式 近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展,加之企业业务需求的不断变化,紧随技术更新的步伐,导致企业架构要随时更改以适合业务需求.当前,越来越多的公司都已将以 Docker 为代表的容器技术用于企业级业务平台,比如:腾讯,京东,美团,新浪,阿里巴巴等互联网公司.数据的安全.Docker 容器的稳定运行是众多用户关注的,这就要求我们提供一套行