docker swarm && compose 示例
docker swarm
创建docker swarm集群
//master节点操作 docker swarm init --advertise-addr materip //node节点操作 -1xdda6xk4wfir7m1o7ef20dvjckxkaqj93hge04yi608pk277g-
创建完集群后,查看docker 网络
[root@bogon ~]# docker network ls NETWORK ID NAME DRIVER SCOPE f4fe0f09576e bridge bridge local e073efefdbab docker_gwbridge bridge local #swarm用于与宿主机通信的网桥 271c8285e986 host host local 1z4lbkkd8go7 ingress overlay swarm #默认创建的为overlay网络,属于swarm 2aa41f414565 none null local
当初始化 swarm 集群或将一个 Docker 主机加入已经存在的 swarm 集群时,Docker 主机上会创建两个新网络:
- 一个称为
ingress的 overlay 网络,用来处理与 swarm 服务相关的控制和数据流。当创建的 swarm 服务没有连接到用户自定义的 overlay 网络时,这个服务会默认连接到 ingress 网络。 - 一个称为
docker_gwbridge的bridge 网络,用来将单个的 Docker 守护进程连接到 swarm 中的其他守护进程。
- 一个称为
overlay 网络驱动程序在多个 Docker 守护进程主机之间创建一个分布式网络。这个网络在允许容器连接并进行安全通信的主机专用网络之上(overlay 覆盖在上面)。Docker 透明地处理每个 Docker 守护进程与目标容器之间的数据包的路由。
创建一个自定义overlay网络
查看命令用法
[root@bogon ~]# docker network create --help
Usage: docker network create [OPTIONS] NETWORK
Create a network
Options:
--aux-address value Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
-d, --driver string Driver to manage the Network (default "bridge")
--gateway value IPv4 or IPv6 Gateway for the master subnet (default [])
--help Print usage
--internal Restrict external access to the network
--ip-range value Allocate container ip from a sub-range (default [])
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt value Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label value Set metadata on a network (default [])
-o, --opt value Set driver specific options (default map[])
--subnet value Subnet in CIDR format that represents a network segment (default [])
创建overlay网络
$ docker network create -d overlay --subnet 10.0.9.0/24 my-overlay #--subnet指定掩码或//添加--attachable参数表示此网络可以由container直接接入,这个比较重要,只有1.13版本以后才有的特性 $ docker network create -d overlay --attachable --subnet 10.0.9.0/24 --my-attachable-overlay //查看网络是否存在$ docker network ls
使用swarm创建两个使用overkay网络的容器
--network my-overlay --name tomcat1 -p : //更新服务docker service update --image hub.docker.com/image tomcat1 #直接从镜像仓库拉取镜像进行升级 //弹性伸缩与扩容
docker service update --replicas 3 tomcat (<service-name>)或docker service scale tomcat=3
查看创建的容器
[root@bogon ~]# docker service ls ID NAME MODE REPLICAS IMAGE zeqnuk9djgb6 tomcat1 replicated / :latest [root@bogon ~]# docker service ps tomcat1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 4jqnd9es5xo4 tomcat1. :latest node2 Running Running hours ago 3oxplflaq7wy tomcat1. :latest node1 Running Running hours ago
删除服务
docker service ls docker service rm service_name(服务名称)
退出集群
//node节点 docker swarm leave //如果想要在manager node上退出集群,并且还有其他worker在工作,需要加上--force选项 docker swarm leave --force(-f)
docker-compose
首先看一个例子
version: "3"
services:
web:
image: john/get-started:part1
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks: #指定网络
- webnet
networks:
webnet:
个例说明:
* 运行该镜像的五个实例作为调用的服务web,限制每个实例使用最多使用10%的CPU(跨所有内核)和50MB RAM。
* 如果发生故障,立即重新启动容器。
* 将端口80映射到主机web端口80。
* 使用默认设置(这是一个负载平衡的重叠网络)来定义网络
compose相关命令--compose swarm 使用 stack堆栈启用容器(仅限于版本3 compose file)
// 现在我们来运行它 你必须给你的应用程序一个名字。在这里,它设置为 getstartedlab: $ docker stack deploy -c docker-compose.yml getstartedlab // 看到刚刚推出的五个容器的列表: $ docker stack ps getstartedlab //列出stack$ docker stack ls //删除stack$ docker stack rm stack-name
示例:
version: '
services:
tomcat:
image:
ports:
- "8088:8080"
networks:
- my-overlay
volumes:
- /data/admin-web:/data/webapp
# - /data/logs/admin/tomcat1:/usr/local/apache-tomcat-/logs
environment:
TOMCAT_SERVER_ID: tomcat_server_001
deploy:
replicas: 2 #表示部署2个副本
restart_policy: #重启策略
condition: on-failure
resources: #注意;当启动tomcat的时候,这里如果设置的过小,tomcat容器会无限重启
limits:
cpus: "0.3"
memory: 500M
#placement:
#constraints: [node.hostname == node1] #指定部署的节点名称,当value为 node.role == manager时表示只部署在manger节点上
networks:
my-overlay:
external: true #这里指如果my-overlay此覆盖网络存在时,会直接使用,如果不存在,这里应该注释掉,并且会自动创建my-overlay覆盖网络
另:docker-compose支持环境变量,如上配置,replicas:${tomcat_replicas}
执行部署之前,添加环境export tomcat_replicas=2 或者部署时加上 -e tomcat_replicas=2 即可
部署tomcat
//创建docker stack deploy -c docker-compose.yml tomcat //更新同上
//扩容,直接修改yml文件里的replicas 数量 直接deploy即可docker stack deploy -c xxx.yml nginx(<service-name>)
查看结果
[root@bogon ~]# docker network ls #查看覆盖网络情况 NETWORK ID NAME DRIVER SCOPE 75b3f5d2931f bridge bridge local e073efefdbab docker_gwbridge bridge local 271c8285e986 host host local h7ffij3a6p95 ingress overlay swarm i313oz4q3p2z monitoring overlay swarm 2aa41f414565 none null local rjx341r1qb1j tomcat_my-overlay overlay swarm [root@bogon ~]# docker service ls #查看swarm创建的服务 ID NAME MODE REPLICAS IMAGE nl1ri9lpa2ue tomcat_tomcat replicated / :latest w1lkk5p0dixh cadvisor / google/cadvisor:latest z9wicrtu5j52 grafana replicated / docker.io/grafana/grafana:latest [root@bogon ~]# docker service ps tomcat_tomcat #查看name为tomcat_tomcat的容器信息 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS pb04uskfxanf tomcat_tomcat. :latest bogon Running Running hours ago l4i1zeakod1v tomcat_tomcat. :latest node2 Running Running hours ago ke1z5hu7ipzz tomcat_tomcat. :latest node1 Running Running hours ago [root@bogon ~]#
说明:
实际应用中(比如一个微服务架构中的各个组件: web db cache),可通过上面获取到的service name进行通信(前提是这些组件全在同一个覆盖网络(包括但不限于overlay)中),例如下测试:
上面示例中,cadvisor与grafana在同一覆盖网络中,没有和tomcat_tomcat service在同一个覆盖网络中,进入cadvisor service所创建的容器ping tomcat_tomcat不通 ping grafana服务名 可通,ping 自己可通

创建好以后,在同网络下,每个容器均能通过service_name访问所创建的服务,并且访问swarm集群任何一个节点均能访问服务,docker swarm默认做好了负载均衡(ps : web应用中配置文件可以写service_name实现内部容器组件的通信)
遇到的问题
扩容时遇到如下问题

一个节点的服务一直起不来,查看发现此节点有其它多个swarm覆盖网络,删除没用的覆盖网络即可
[root@node1 admin-web]# docker network ls NETWORK ID NAME DRIVER SCOPE dbb58a4775e0 bridge bridge local 78ec346bc9a8 docker_gwbridge bridge local 8a9cc214fa1c harbor_harbor bridge local 5b384f583952 host host local h7ffij3a6p95 ingress overlay swarm 599f223ed3bc none null local 2q81x47v42v2 tomcat_default overlay swarm [root@node1 admin-web]# docker network rm tomcat_defaulttomcat_default [root@node1 admin-web]# docker network ls NETWORK ID NAME DRIVER SCOPE dbb58a4775e0 bridge bridge local 78ec346bc9a8 docker_gwbridge bridge local 8a9cc214fa1c harbor_harbor bridge local 5b384f583952 host host local h7ffij3a6p95 ingress overlay swarm 599f223ed3bc none null local runvcjgcolwf tomcat_my-overlay overlay swarm
再次创建服务即可创建成功
docker swarm && compose 示例的更多相关文章
- docker swarm compose
swarm docker run swarm --help compose curl -L https://github.com/docker/compose/releases/download/1. ...
- 云计算之路-阿里云上-容器难容:优化自建 docker swarm 集群的部署
在上周六遭遇阿里云容器服务 swarm 版的故障之后,我们决定还是走自建 docker swarm 之路,只要不是阿里云底层的问题,我们相信会找到办法解决或避开自建 docker swarm 不稳定的 ...
- Docker 小记 — Compose & Swarm
前言 任何相对完整的应用服务都不可能是由单一的程序来完成支持,计划使用 Docker 来部署的服务更是如此.大型服务需要进行拆分,形成微服务集群方能增强其稳定性和可维护性.本篇随笔将对 Docker ...
- docker swarm(当前官网示例)
介绍 Docker Swarm 是 Docker 公司推出的官方容器集群平台,基于 Go 语言实现 作为容器集群管理器,Swarm 最大的优势之一就是 100% 支持标准的 Docker API.各种 ...
- docker swarm和compose 的使用(阿里)
基本的docker使用参考:Docker 入门 到部署Web 程序- (阿里面试常用的docker命令和优点) 昨天去阿里面试 问我如果给你5台服务器 如何部署docker,我说一个个拷贝,面试官听了 ...
- Dockerfile & Docker Swarm & Docker Stack & Docker Compose
Dockerfile 通俗地讲,它是为了指导单个镜像从无到有的构建过程.如果你镜像是从Docker registry上面拉下来的,那就用不到这个文件:如果你是自己的应用,想打包成镜像,那就需要这个文件 ...
- Docker Machine, Compose, and Swarm: How They Work Together
The three tools are now neatly packaged into what’s called the Docker Toolbox. Docker Machine1/ crea ...
- Docker,Docker Compose,Docker Swarm,Kubernetes之间的区别
Dcoker Docker 这个东西所扮演的角色,容易理解,它是一个容器引擎,也就是说实际上我们的容器最终是由Docker创建,运行在Docker中,其他相关的容器技术都是以Docker为基础,它是我 ...
- docker学习之使用 DockerFile 构建镜像并搭建 swarm+compose 集群
题目要求 (1)将springboot应用程序打成jar包:Hot.jar (2)利用dockerfile将Hot.jar构建成镜像 (3)构建 Swarm 集群 (4)在 Swarm 集群中使用 c ...
随机推荐
- maven install时自动施行单元测试
maven install时自动执行单元测试 1.maven-surefire-plugin简介 Maven本身并不是一个单元测试框架,它只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUni ...
- Android Volley的基本用法
1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...
- SlowHTTPTest-慢速DoS攻击
Slowhttptest是一个依赖于实际HTTP协议的Slow HTTP DoS攻击工具,它的设计原理是要求服务器所有请求被完全接收后再进行处理. SlowHTTPTest是一款对服务器进行慢攻击的测 ...
- python学习之数据结构
python的数据很丰富,所以对于数据分析来讲, python是一种最合适的选择 下面讲述一下常见的数据结构,包括栈,队列,元组,字典,集合等,以及对这些数据结构进行操作 #堆栈,后进先出 a=[10 ...
- MySql必知必会实战练习(四)主键、外键、sql约束、联结表
本博将对主键.外键.MySql数据库约束和联结表的相关特性进行总结和实战 1. 主键 表中的每一行都应该具有可以唯一标识自己的一列(或一组列),而这个承担标识作用的列称为主键 如果没有主键,数据的管理 ...
- MySql必知必会实战练习(五)存储过程
1. 为什么使用存储过程? (1) 通过把处理封装在容易使用的单元中,简化复杂操作 (2) 为了保证数据的完整性,不要求反复建立一系列的处理操作,所有开发人员和应用程序都使用同一(试验和测试)存储过程 ...
- 重装Oracle时出现SID已存在问题的解决办法
重装Oracle时出现SID已存在问题的解决办法 手机打开 注意安装oracle服务器的环境,不稳定导致数据库出现问题,后果很严重! 方法如下: 1.开始->设置->控制面板-&g ...
- 剑指offer-第五章优化时间和空间效率(从1到n的整数中1出现的次数)
题目:输入一个整数n,从1到n这n个十进制整数中1出现的次数. 思路1:对1到n中的任意一个数i对其进行求余数来判断个位是否为1,然后再求除数,判断十位是否为1.统计出1的个数.然后对1到n用一个循环 ...
- Java 程序员容易犯的10个SQL错误
Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...
- 在android开发中添加外挂字体
1.在项目目录中,右键app——New——Folder—— Assets Folder 2.把.ttf或者.oft文件拷进这个assets文件夹 3.在onCreate()中 Typeface typ ...