用 Docker 1.12 Swarm 模式创建 Swarm 集群

llfc10 8年前
   <h3>Swarm 让你事半功倍</h3>    <p>2016 年 DockerCon (天啊……我多么希望我当时在场)上展示的最重大的变革之一就是 1.12 版本引擎的 Swarm 模式。它意味着什么呢? 它意味着:如果你在运行 Docker 1.12时 ,你就可以原生创建一个 Swarm 集群 。</p>    <p>用这样一条简单的命令:</p>    <pre>  $ dockerswarminit  </pre>    <p>就足够创建一个 Swarm 了(虽然是一个只有简易管理节点的 Swarm,但已经是 Swarm 集群的最简集合)。</p>    <pre>  $ dockernodels  ID                          HOSTNAME  MEMBERSHIP  STATUS  AVAILABILITY  MANAGERSTATUS  7sytb3zk0yswdfky6mbh7nzk2 *  moby      Accepted    Ready  Active        Leader     </pre>    <h3>来看看多节点吧!</h3>    <p>只有一个节点的 Swarm,用途是有限的,所以让我们来创建一个有两个管理节点(manager nodes)和两个工作节点(worker nodes)的 Swarm。 首先,我们来创建 4 个 Docker 主机。Docker Machine 是完成此任务的理想工具,所以我们就用它。</p>    <pre>  $ docker-machinecreate --drivervirtualboxmanager1  $ docker-machinecreate --drivervirtualboxmanager2  $ docker-machinecreate --drivervirtualboxworker1  $ docker-machinecreate --drivervirtualboxworker2     </pre>    <p>如果你手头上没有别的用 Machine 创建的主机,那么在显示集群节点时,你的显示信息就需要与下文给出的范例比较接近。</p>    <pre>  $ docker-machinels  NAME              ACTIVE  DRIVER        STATE    URL                        SWARM  DOCKER        ERRORS  manager1          -        virtualbox    Running  tcp://192.168.99.100:2376           v1.12.0-rc3  manager2          -        virtualbox    Running  tcp://192.168.99.101:2376           v1.12.0-rc3  worker1          -        virtualbox    Running  tcp://192.168.99.102:2376           v1.12.0-rc3  worker2          -        virtualbox    Running  tcp://192.168.99.103:2376           v1.12.0-rc3     </pre>    <h3>初始化 Swarm</h3>    <p>上文介绍了一种用 1.12 版引擎来创建 Swarm 的最简单的命令(提示:“docker swarm init”),但我们在这里还将调用几种附加选项,让集群主机可以互相通信,并在无需许可的情况下加入集群。</p>    <pre>  $ MANAGER1_IP=$(docker-machineipmanager1)  $ docker-machinesshmanager1dockerswarminit --auto-acceptmanager --auto-acceptworker --listen-addr $MANAGER1_IP:2377     </pre>    <p>注意:–listen-addr 是 Swarm 内不同节点互相访问的地址</p>    <h3>添加第二管理节点</h3>    <p>Docker Swarm 命令中还需要添加一些选项:</p>    <p>* join:表明一个新的节点将被添加进 Swarm</p>    <p>* –manager:表明节点的性质(manager vs worker)</p>    <p>* –listen-addr:让一个新添加的节点可以访问 Swarm 内的其他节点</p>    <p>* 最后的参数就是第一管理节点的地址(即这一命令将被送到的那个节点)</p>    <pre>  $ MANAGER2_IP=$(docker-machineipmanager2)  docker-machinesshmanager2dockerswarmjoin --manager --listen-addr $MANAGER2_IP:2377 $MANAGER1_IP:2377     </pre>    <p>注意:由于 –auto-accept manager 选项会在 Swarm 初始化的过程中被提供,所以第二管理节点会被自动接受。如果没有这一选项,那么第二管理节点需要被第一管理节点手动接受。</p>    <h3>添加工作节点</h3>    <p>往集群内添加工作节点的方式,跟添加管理节点几乎相同:</p>    <pre>  $ WORKER1_IP=$(docker-machineipworker1)  $ docker-machinesshworker1dockerswarmjoin --listen-addr $WORKER1_IP:2377 $MANAGER1_IP:2377  $ WORKER2_IP=$(docker-machineipworker2)  $ docker-machinesshworker2dockerswarmjoin --listen-addr $WORKER2_IP:2377 $MANAGER1_IP:2377     </pre>    <p>注意:由于 –auto-accept worker 选项会在 Swarm 初始化的过程中被提供,所以工作节点会被自动接受。如果没有这一选项,那么工作节点需要被管理节点手动接受。</p>    <h3>我们的 Swarm 看起来像什么呢?</h3>    <p>让我们来看看。</p>    <pre>  $ docker-machinesshmanager1dockernodels  ID                          HOSTNAME  MEMBERSHIP  STATUS  AVAILABILITY  MANAGERSTATUS  109a5ufy8e3ey17unqa16wbj7    manager2  Accepted    Ready  Active        Reachable  4chbn8uphm1tidr93s64zknbq *  manager1  Accepted    Ready  Active        Leader  8nw7g1q0ehwq1jrvid1axtg5n    worker2  Accepted    Ready  Active  8rrdjg4uf9jcj0ma2uy8rkw5v    worker1  Accepted    Ready  Active     </pre>    <p>现在每个节点都归属于 Swarm,并都处在了待机状态。管理节点 1 是领导者,一切都各居其位,井井有条。</p>    <h3>是什么使它如此特别呢?</h3>    <p>这个 Swarm 是得到安全传输层协议(TLS)保证的,能在设备外自动认证升级。</p>    <p><img src="https://simg.open-open.com/show/540aac75f00c55046460e83b599da225.png"></p>    <p>同样,它也不再需要 Consul、Zookeeper 之类的键值存储,所有东西都在掌控之中。</p>    <p><img src="https://simg.open-open.com/show/7922c7e5b86b22531a5512d17dee5f59.png"></p>    <h3>现在就来用它吧</h3>    <p>如果不在上面运行点什么,Swarm 要来何用呢……?当然,我们将要在我们的 Swarm 上部署一些服务,但这一点,还是留给下一篇文章细讲吧。</p>    <h3>复制和粘贴</h3>    <p>下面是一小段用来创建 Docker 主机并部署 Swarm 的 Shell 脚本。当然了,管理/工作节点的数字都是可以随意改动的。</p>    <p>注意:创建两个管理节点和两个工作节点,仅仅是用来作示范。在工业生产中,我们可能需要在集群里搭建 3 个管理节点和 5 个工作节点(感谢 Stefan 指出了这一点)。</p>    <pre>  # Define the number of managers/workers  MANAGER=3  WORKER=5     # Create the Docker hosts  for i in $(seq 1 $MANAGER); do docker-machinecreate --drivervirtualboxmanager$i; done  for i in $(seq 1 $WORKER); do docker-machinecreate --drivervirtualboxworker$i; done     # Init the swarm  docker-machinesshmanager1dockerswarminit --auto-acceptmanager --auto-acceptworker --listen-addr $(docker-machineipmanager1):2377     # Add additional manager(s)  for i in $(seq 2 $MANAGER); do docker-machinesshmanager$i dockerswarmjoin --manager --listen-addr $(docker-machineipmanager$i):2377 $(docker-machineipmanager1):2377; done     # Add workers  for i in $(seq 1 $WORKER); do docker-machinesshworker$i dockerswarmjoin --listen-addr $(docker-machineipworker$i):2377 $(docker-machineipmanager1):2377; done     </pre>    <p> </p>    <p><a href="/misc/goto?guid=4959675427071819280">阅读原文</a></p>    <p> </p>