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表示两个服务间通信成功。

项目中docker swarm实践的更多相关文章

  1. 在Java项目中整合Scala

    Scala是一个运行在Java JVM上的面向对象的语言.它支持函数编程,在语法上比Java更加灵活,同时通过Akka库,Scala支持强大的基于Actor的多线程编程.具有这些优势,使得我最近很想在 ...

  2. Docker Swarm和Kubernetes在大规模集群中的性能比较

    Contents 这篇文章主要针对Docker Swarm和Kubernetes在大规模部署的条件下的3个问题展开讨论.在大规模部署下,它们的性能如何?它们是否可以被批量操作?需要采取何种措施来支持他 ...

  3. Docker在云环境中的应用实践初探:优势、局限性与效能评测

    作者 商之狄 发布于 2014年11月10日 本文依据笔者所在团队的一些近期开发和应用的实践,整理出一些有意义的信息,拿出来和社区分享.其中既包括在云端应用Docker与相关技术的讨论,同时也有实施过 ...

  4. 生产环境中使用Docker Swarm的一些建议

    译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...

  5. Docker Swarm 中最重要的概念- 每天5分钟玩转 Docker 容器技术(94)

    从主机的层面来看,Docker Swarm 管理的是 Docker Host 集群.所以先来讨论一个重要的概念 - 集群化(Clustering). 服务器集群由一组网络上相互连接的服务器组成,它们一 ...

  6. Docker 系列六(Docker Swarm 项目).

    一.前言 随着互联网快速发展,以及微服务架构的流行,服务器的压力越来越大.上一篇介绍的 Docker Compose 项目,可以将多个容器捏合在一起,实现容器间的通信,比如 Web 项目对 DB.Ca ...

  7. docker swarm实现java项目的发布/滚动更新/回滚/镜像管理

    使用docker swarm滚动更新java项目,部署集群,这一切的前提是使用Jenkins+maven进行项目打包,分发等功能 具体可以参考我的另外三篇文章 https://www.cnblogs. ...

  8. docker 实践九:docker swarm

    介绍了 docker 三剑客中的 docker-machine 和 docker-compose 之后,就剩下一个 docker swarm 了.那本篇的主角就是它了. 注:环境为 CentOS7,d ...

  9. Java SpringBoot 项目构建 Docker 镜像调优实践

    PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...

随机推荐

  1. 正则表达式模式修正符 比如/esi

    正则表达式模式修正符 比如/esi 作者: 字体:[增加 减小] 类型:转载 下面列出了当前在 PCRE 中可能使用的修正符.括号中是这些修正符的内部 PCRE 名.修正符中的空格和换行被忽略,其它字 ...

  2. JavaScript—面向对象小例子

    什么是面向对象 要是以前别人问我.随口道来,封装继承多态,万物皆对象...一大推.说的自己都以为自己掌握了面向对象.呵呵一笑.确实掌握了 只是不会用..... 什么是面向对象编程 以前 学.Net 虽 ...

  3. 向mysql数据库中插入数据时显示“Duplicate entry '1′ for key ‘PRIMARY' ”错误

    错误情况如题,出现这个错误的原因十分简单: 很明显,这是主键的问题. 在一张数据表中是不能同时出现多个相同主键的数据的 这就是错误的原因,解决的方法: 1.可以将这张表设置成无主键(mysql支持,其 ...

  4. R语言入门 (有其他编程语言基础)

    慢慢才意识到概率统计的重要性,当时学的时候只知道很重要,是机器学习基础啥的,但是却没有真正意识到( ╯□╰ ).我现在的理解是,统计学习可以从大数据中挖掘出规律(其实和数据挖掘还是很相关的),在科研工 ...

  5. JAVA初学者——算数运算符

    Hello!大家好,我是浩宇大熊猫,又是学习java的一天,开开森森~ 运算符:也就是对常量或者变量进行操作的符号 表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式,不同的 ...

  6. 收藏基本Java项目开发的书

    一.Java项目开发全程实录 第1章 进销存管理系统(Swing+SQL Server2000实现) 第2章企业内部通信系统(Swing+JavaDB实现) 第3章 企业人事管理系统( Swing+H ...

  7. jQuery如何给DOM添加ID

    ID每个元素只能有一个,ID名同一页面也不能重复,addID方法是不需要的,和其他属性一样用attr方法就行了, $(singleTarget).attr('id','idName'); 更简单的 $ ...

  8. Codeforces 1288C - Two Arrays

    题目大意: 给定n和m,有两个数组,两个数组的长度都等于m 数组内每个元素都在1到n中 对于两个数组对应的位置i,必须满足a[i]<=b[i] a数组必须是不下降的序列 b数组必须是不上升的序列 ...

  9. JavaSE--Java 的基本程序设计结构

    Java 对大小写敏感 Java 中定义类名的规则很宽松.名字必须以字母开头,后面可以跟字母和数字的任意组合.长度基本上没有限制.但是不能使用 Java 保留字作为类名. 标准的命名规范为:类名是以大 ...

  10. JavaScript面试题(珍爱生命,远离面试)

    1.使用 typeof bar === "object" 判断 bar 是不是一个对象有神马潜在的弊端?如何避免这种弊端? 使用 typeof 的弊端是显而易见的(这种弊端同使用 ...