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 示例的更多相关文章

  1. docker swarm compose

    swarm docker run swarm --help compose curl -L https://github.com/docker/compose/releases/download/1. ...

  2. 云计算之路-阿里云上-容器难容:优化自建 docker swarm 集群的部署

    在上周六遭遇阿里云容器服务 swarm 版的故障之后,我们决定还是走自建 docker swarm 之路,只要不是阿里云底层的问题,我们相信会找到办法解决或避开自建 docker swarm 不稳定的 ...

  3. Docker 小记 — Compose & Swarm

    前言 任何相对完整的应用服务都不可能是由单一的程序来完成支持,计划使用 Docker 来部署的服务更是如此.大型服务需要进行拆分,形成微服务集群方能增强其稳定性和可维护性.本篇随笔将对 Docker ...

  4. docker swarm(当前官网示例)

    介绍 Docker Swarm 是 Docker 公司推出的官方容器集群平台,基于 Go 语言实现 作为容器集群管理器,Swarm 最大的优势之一就是 100% 支持标准的 Docker API.各种 ...

  5. docker swarm和compose 的使用(阿里)

    基本的docker使用参考:Docker 入门 到部署Web 程序- (阿里面试常用的docker命令和优点) 昨天去阿里面试 问我如果给你5台服务器 如何部署docker,我说一个个拷贝,面试官听了 ...

  6. Dockerfile & Docker Swarm & Docker Stack & Docker Compose

    Dockerfile 通俗地讲,它是为了指导单个镜像从无到有的构建过程.如果你镜像是从Docker registry上面拉下来的,那就用不到这个文件:如果你是自己的应用,想打包成镜像,那就需要这个文件 ...

  7. 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 ...

  8. Docker,Docker Compose,Docker Swarm,Kubernetes之间的区别

    Dcoker Docker 这个东西所扮演的角色,容易理解,它是一个容器引擎,也就是说实际上我们的容器最终是由Docker创建,运行在Docker中,其他相关的容器技术都是以Docker为基础,它是我 ...

  9. docker学习之使用 DockerFile 构建镜像并搭建 swarm+compose 集群

    题目要求 (1)将springboot应用程序打成jar包:Hot.jar (2)利用dockerfile将Hot.jar构建成镜像 (3)构建 Swarm 集群 (4)在 Swarm 集群中使用 c ...

随机推荐

  1. Android onTouchEvent和setOnTouchListener中onTouch的区别

    OnTouchEvent()方法 是获取的对屏幕的各种操作,比如向左向右滑动,点击返回按钮等等. 属于一个宏观的屏幕触摸监控. OnTouchListener()方法 是获取某一个控件某一个View的 ...

  2. C++11 Lambda表达式(匿名函数)

    http://www.cnblogs.com/RainyBear/p/5733399.html http://blog.163.com/lvan100@yeah/blog/static/6811721 ...

  3. NIO:异步非阻塞I/O,AIO,BIO

    Neety的基础使用及说明 https://www.cnblogs.com/rrong/p/9712847.html BIO(缺乏弹性伸缩能力,并发量小,容易出现内存溢出,出现宕机 每一个客户端对应一 ...

  4. JDBC 1 利用Statement对数据库进行增删改查

    准备工作 1新建po类:User private int id; private String name; private String pwd; set,get方法省略 2  新建UserDao类, ...

  5. 重温CLR(八 ) 泛型

    熟悉面向对象编程的开发人员都深谙面向对象的好处,其中一个好处是代码重用,它极大提高了开发效率.也就是说,可以派生出一个类,让他继承基类的所有能力.派生类只需要重写虚方法,或添加一些新方法,就可定制派生 ...

  6. 几个开源faas 框架

    funktion open source event based lambda programming for kubernetes 官方地址: funktion.fabric8.io serverl ...

  7. web 模板引擎

    baiduTemplate:  http://baidufe.github.io/BaiduTemplate/ artTemplate: https://github.com/aui/artTempl ...

  8. bzoj 3295 (洛谷3157、3193) [Cqoi2011]动态逆序对——树套树 / CDQ分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3295 题目--洛谷3157:https://www.luogu.org/problemnew ...

  9. Linux盘符漂移问题

    Linux管理多块磁盘时(以sata盘为例),会按磁盘加载的顺序依次给磁盘命名为/dev/sda, /dev/sdb... 这种命名规则就会导致,一块磁盘在发生热插拔或系统重启后,盘符可能发生变化,会 ...

  10. contiki学习心路历程【转】xukai871105 大神

    https://blog.csdn.net/xukai871105/article/details/9072993