zoukankan      html  css  js  c++  java
  • 项目中docker swarm实践

    docker swarm 集群服务通信

    前置要求

    1. 服务需要在同一个docker swarm集群中
    2. 服务需要处于同一个overlay网络上
    3. 服务需要暴露容器端口
    4. 有2个以上服务名不同的服务

    服务部署流程(手动方式)

    1、 创建overlay网络

    1
    2
    docker network create
    docker network ls

    2、 创建swarm服务

    1
    2
    docker service create --name ai_voice_engine-development --network lvdoo-networ
    --replicas 1 --with-registry-auth ai_voice_engine-development:1.1.112

    参数说明

    • network: 指定overloy网络,只有在同一网络中的服务才可以通过服务名+端口号进行通信
    • replicas: 可以理解为在swarm集群中会起多少个实例
    • with-registry-auth: 启动容器所指定的镜像

    3、 暴露端口

    1
    docker service update --publish-add published=18088,target=18088 ai_voice_engine-development

    参数说明

    • published:对外暴露的端口
    • target: 容器暴露的端口

    自动化部署swarm服务

    ansible脚本示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    - name: 概要信息
    debug:
    msg:
    - "应用名: {{ application_name }}"
    - "工作空间: {{ workspace_path }}"
    - "服务名: {{ service_name }}"
    - "是否重新创建服务: {{ is_recreate_service }}"
    - "服务副本数量: {{ replicas }}"
    - "镜像名: {{ image_name }}"
    - "激活的Profiles: {{ active_profiles }}"
    - "Swarm 网络名称: {{ lvdoo_network }}"
    - name: 登录到仓库,准备拉取镜像
    shell: "docker login -u root -p 123456 {{ hub_host }}"
    - name: 拉取镜像
    shell: "docker pull {{ image_name }}"
    ignore_errors: yes
    - name: 移除正在运行的Swarm服务
    shell: "docker service rm {{ service_name }}"
    when: is_recreate_service
    ignore_errors: yes
    - name: 检查Swarm此前是否已经创建该服务
    shell: "docker service ls"
    register: "docker_service_check_output"
    - name: 创建新的Swarm服务 | 如果当前服务尚未创建
    shell: "docker service create --name {{ service_name }} --network {{ lvdoo_network }}
    --replicas {{ replicas }} --update-failure-action rollback --restart-max-attempts 3
    --update-parallelism 1 --update-delay 10s --update-monitor 10s -e
    'SPRING_PROFILES_ACTIVE={{ active_profiles }}' -e JAVA_OPTS='-Xmx512m'
    --with-registry-auth {{ image_name }}"
    when: 'service_name not in docker_service_check_output.stdout'
    - name: 暴露端口 | 如果当前服务需要暴露指定端口
    shell: "docker service update --publish-add published={{ application_exposed_port }},target={{ application_startup_port }} {{ service_name }} "
    when: not( (application_exposed_port is undefined) or (application_exposed_port is none) or (application_exposed_port | trim == '') )
    - name: 开启XXL-Job端口 | 如果当前服务指定了xxl-job端口
    shell: "docker service update --publish-add published={{ xxl_port_to_expose }},target={{ xxl_port_in_container }} {{ service_name }} "
    when: xxl_port_to_expose is defined
    - name: 更新Swarm服务 | 如果当前服务此前已创建
    shell: "docker service update {{ service_name }} --image {{ image_name }} --update-delay 10s"
    when: 'service_name in docker_service_check_output.stdout'
    - name: 暂停10秒,等待服务启动并准备收集日志
    pause:
    seconds: 10
    - name: 检查服务启动状态
    shell: "docker service ps {{ service_name }} -f 'desired-state=running' | grep -v ID "
    register: "docker_swarm_service_status"
    - name: 当前服务状态
    debug:
    msg:
    - "{{ docker_swarm_service_status.stdout | to_yaml }}"
    - name: 检查服务是否已经启动
    fail:
    msg: "服务未启动成功,请检查。"
    when: docker_swarm_service_status.stdout == ""

    测试容器间通信

    已部署好两个docker swarm 服务,如下图:

    服务名 容器内端口 对外暴露端口
    ai_callcenter-development 8080 18084
    ai_voice_engine-development 18088 18088

    登录ai_callcenter-development 容器中

    1
    2
    docker ps |grep ai_callcenter
    docker exec -it 容器id /bin/bash

    访问ai_voice_engine-development服务

    注意:服务名+端口号,这个端口号是容器内的端口,而不是对外暴露的端口,这里正好两个端口是一致的。如下图所示,出现Hello world表示两个服务间通信成功。

  • 相关阅读:
    git与eclipse集成之代码提交
    git与eclipse集成之创建及切换个人本地分支
    git与eclipse集成之导入组件到Eclipse工程
    ural1086. Cryptography
    ural 1118. Nontrivial Numbers
    ural 1104. Don’t Ask Woman about Her Age暴力
    ural 1141. RSA Attack RSA算法
    51nod 1119 机器人走方格 V2组合数
    2016 ACM/ICPC Asia Regional Qingdao Online1001 &&hdoj 5878 I Count Two Three
    51nod 1010 只包含因子2 3 5的数 打表二分
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12375893.html
Copyright © 2011-2022 走看看