• docker swarm overlay stack 服务部署记录


    项目xxx(后端),xxx-ui前端(前后端分离的项目)

    依赖mysql,elasticsearch.
    分别制作了四个镜像来做这件事。
    希望可以制作跨主机的部署,使用了swarm,以下是学习记录。

    参考 https://www.cnblogs.com/xishuai/p/docker-swarm.html

    docker-machine create -d virtualbox manager1 &&
    docker-machine create -d virtualbox manager2 &&
    docker-machine create -d virtualbox worker1 &&
    docker-machine create -d virtualbox worker2


    #docker-machine ssh manager1 "docker swarm leave --force"
    alias dm=docker-machine
    docker-machine ssh manager1 "docker swarm init --advertise-addr 192.168.99.100"

    export TOKEN=SWMTKN-1-67oknnrzlnt62wp5xecpz8nvodizd3mdtpvb2thsk6ldvolqx5-4srdcvj0vehcoc6gs8nhcp6lh
    docker-machine ssh worker1 docker swarm join --token $TOKEN 192.168.99.100:2377
    docker-machine ssh worker2 docker swarm join --token $TOKEN 192.168.99.100:2377


    dm ssh manager1 docker swarm join-token manager
    dm ssh manager2 docker swarm join --token SWMTKN-1-67oknnrzlnt62wp5xecpz8nvodizd3mdtpvb2thsk6ldvolqx5-6f3po7z2ih2n06qztl2fnj1wb 192.168.99.100:2377

    #create a overlay network
    当初始化 swarm 集群或将一个 Docker 主机加入已经存在的 swarm 集群时,Docker 主机上会创建两个新网络:
    一个称为 ingress 的 overlay 网络,用来处理与 swarm 服务相关的控制和数据流。
    当创建的 swarm 服务没有连接到用户自定义的 overlay 网络时,这个服务会默认连接到 ingress 网络。
    一个称为 docker_gwbridge 的bridge 网络,用来将单个的 Docker 守护进程连接到 swarm 中的其他守护进程。
    可以使用 docker network create 命令创建用户定义的 overlay 网络,就像可以创建用户定义的 bridge 网络一样。
    服务或容器一次可以连接到多个网络。服务或容器只能通过它们各自连接的网络进行通信。
    TCP 端口 2377:用于集群管理通信
    TCP 和 UDP 端口 7946:用于节点之间通信
    UDP 端口 4789:overlay 网络流量

    要创建可以用于 swarm 服务和独立容器跟其他 Docker 守护进程中运行的独立容器通信的 overlay 网络,添加 --attachable 标志:
    docker network create -d overlay --attachable my-overlay
    连接到同一 overlay 网络的 swarm 服务可以有效地将所有端口暴露给对方
    默认情况下,发布端口的 swarm 服务使用路由网格(routing mesh)来完成。
    当连接到任何 swarm 节点上的已发布端口(无论是否运行给定服务)时,都会透明地将连接重定向到正在运行该服务的 worker 节点。
    实际上,Docker 充当了 swarm 服务的负载平衡器。基于路由网格的服务以虚拟 IP(VIP)模式运行。
    可以将 Docker 配置为使用单独的网络接口来处理两种不同类型的流量
    初始化或加入 swarm 时,分别指定 --advertise-addr 和 --datapath-addr。
    一开始在manager1上创建的这个overlay网络,只会同步到同为manager角色的机器上去,而worker节点,只会在分配到任务时才会创建刚才的网络。

    #简单构建docker的私有他库
    docker run -d -v /home/student/docker_registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry

    默认拉取推送操作都是使用https协议来做的,做完这个之后,需要修改/etc/docker/daemon.json
    以下是我本机的,主要是第一行,下面两行是配置拉取镜像时默认的地址,我使用的是阿里云的,阿里云加速,拉取镜像会快些。
    我们需要在上面的四个虚机中执行
    {
    "insecure-registries":["192.168.99.1:5000"],
    "registry-mirrors": ["https://85qcsfak.mirror.aliyuncs.com"],
    "graph": "/home/student/docker_data"
    }
    在创建的所有虚机中执行如下命令:
    sudo touch /etc/docker/daemon.json &&
    sudo chmod 777 /etc/docker/daemon.json &&
    sudo echo '{ "insecure-registries": ["192.168.99.1:5000"] }' > /etc/docker/daemon.json
    #如何把从公有库中拉取的镜像推送到私有仓库
    docker tag nginx 192.168.99.1:5000/nginx:latest
    docker push 192.168.99.1:5000/nginx:latest
    如上示例,需要先对镜像打个标签,然后就可以push到私服上去。

    #删除某些名字相似的容器
    docker rm --force $(docker ps -q -f name=abc*)
    #查看私有仓库内容
    curl http://192.168.99.1:5000/v2/_catalog

    #经过测试,通过swarm集群建好后,可以直接使用standalone的docker run 的方式部署各自的服务,没有问题。
    唯一的一个问题是,在docker-machine创立的虚机中开启es的时候,因为XMS过大,没法分配内存导致失败,
    把es迁移到宿主机后开启成功,整个测试也成功了。
    1.直接使用standalone的方式,使用docker run -itd --net my-overlay 的方式直接部署,也没有问题,可以跨主机互访,服务部署成功。
    2.使用docker service的方式部署,这样可以使用--replicas 同时在多台主机上部署服务,可以解决单点故障问题。测试成功。
    3.使用docker stack deploy的方式部署,暂时还有些问题,服务部署基本成功,没有测试通过。


    docker run -itd --name mysql --net my-overlay
    -e MYSQL_ROOT_PASSWORD=xxx
    -e MYSQL_PASSWORD=xxx
    -e MYSQL_USER=xxx
    -e MYSQL_DATABASE=xxx
    -p 3306:3306
    192.168.99.1:5000/mysql:5.7
    #elastic
    docker run -itd --name elastic --net my-overlay -p 9200:9200 -p 9300:9300 elastic
    #server backend
    docker run -itd --name xxx-server --net my-overlay -p 8080:8080 192.168.99.1:5000/xxx
    #ui front end
    docker run -itd --name xxx-ui --net my-overlay -p 80:80 192.168.99.1:5000/xxx-ui

    下面测试使用docker service ,这样可以自带负载均衡和多副本,提高了高可用和高吞吐量。
    docker service create --name mysql
    --network my-overlay --hostname mysql
    --replicas 2
    -e MYSQL_ROOT_PASSWORD=xxx
    -e MYSQL_PASSWORD=xxx
    -e MYSQL_USER=xxx
    -e MYSQL_DATABASE=tss_log_insight_new_new
    192.168.99.1:5000/mysql:5.7

    docker service create --name xxx-server --network my-overlay
    --replicas 2 --hostname xxx-server
    -p 8080:8080 192.168.99.1:5000/xxx

    docker service create --name xxx-ui --network my-overlay
    --replicas 4 --hostname xxx-ui
    -p 80:80 192.168.99.1:5000/xxx-ui

    docker-compose.yaml内容:
    version: '3'
    services:
    tssxxx-ui:
    image: 192.168.99.1:5000/xxx-ui
    ports:
    - 80:80
    deploy:
    replicas: 5
    tssxxx-server:
    image: 192.168.99.1:5000/xxx
    environment:
    - SPRING_PROFILES_ACTIVE=dev,swagger
    - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/tssxxx?useUnicode=true&characterEncoding=utf8&useSSL=false
    - SPRING_DATASOURCE_USERNAME=xxx
    - SPRING_DATASOURCE_PASSWORD=xxx
    - JHIPSTER_SLEEP=10 # gives time for the database to boot before the application
    # - SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES=tssxxx-elasticsearch:9300
    # - SPRING_DATA_ELASTICSEARCH_CLUSTER_NAME=elastic
    ports:
    - 8080:8080
    container_name: xxx-server
    hostname: xxx-server
    tssxxx-mysql:
    image: 192.168.99.1:5000/mysql:5.7
    container_name: mysql
    hostname: mysql
    # volumes:
    # - ~/volumes/jhipster/tssxxx/mysql/:/var/lib/mysql/
    environment:
    - MYSQL_USER=tss
    - MYSQL_PASSWORD=tss
    - MYSQL_DATABASE=tssxxx
    - MYSQL_ROOT_PASSWORD=root
    ports:
    - 3306:3306
    command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8mb4 --explicit_defaults_for_timestamp
    networks:
    default:
    external:
    name: my-overlay
    my-overlay:
    driver: overlay


    docker stack deploy -c docker-compose.yaml xxx
    docker stack ls
    docker stack rm xxx
    docker stack ps

    下面是一个集群管理服务,可以尝试。
    portainer:
    image: 192.168.99.1:5000/portainer/portainer:latest
    ports:
    - "9000:9000"
    volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
    replicas: 1
    placement:
    constraints: [node.role == manager]

     总结:

    1.制作服务镜像,如mysql,es,后端和前端的应用

    2.docker在各主机上的安装(本机使用最新的docker-ce 18.06),docker-compose单独安装

    3.构建swarm集群,通过docker swarm init /docker swarm join 搭建集群

    4.在manager角色的节点上创建overlay驱动的网卡

    5.使用docker run -t --net 或docker service 或docker stack deploy来部署自己的服务

  • 相关阅读:
    Docker 相关资源
    ReferenceFinder 学习
    AssetBundle 复习
    Coroutine 复习
    Unreal 相关资源
    Houdini 相关资源
    MySQL多数据库合并到一个数据库
    Module is not specified
    idea导入多maven项目
    redis-cluster部署遇到为问题记录
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/9894544.html
Copyright © 2020-2023  润新知