docker入门3-docker swarm
swarm介绍
想要将应用部署在一个集群并运行在多台机器上?
通过将多台机器链接到“Dockerized"集群以实现应用程序运行在多容器,多机器的技术被称为swarm。
一个swarm是一组运行docker的机器,它们加入同一个集群,加入swarm的都被当做一个节点。在集群下,需要一个swarm manager管理所有机器,执行docker命令和同意其他节点加入swarm就是通过这个manager。其余都是workers,它们只提供劳动力,无权告知其他节点该做什么或者不能做什么。
之前的docker使用都是单主机,这里将使用虚拟机,尝试多机器下的swarm模式。
swarm创建
一个swarm由一群节点构成。它的基本思想很简单: 运行docker swarm init
开启swarm模式并让当前机器成为manager,其他机器再通过docker swarm join
加入这个swarm当苦力。
这里使用virtualbox创建虚拟机。系统是Mac os X。
安装virtualbox虚拟机
安装教程地址:
使用docker-machine创建VMs
使用docker桌面版,docker-machine默认安装。docker-machine不止是方便我们使用部署虚拟机,也能用于部署对物理机的部署,阿里云也有相关的驱动,方便在阿里云上高效部署机器。
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
创建两个虚拟机。这里`--driver``指定使用virtualbox创建虚拟机,docker-machine会自动使用名为boot2docker.iso的精简版Linux镜像,里面自带docker。
docker-machine查看虚拟机
docker-machine ls
查看运行的虚拟机。active带*的代表是当前进入的机器。
docker-machine连接虚拟机
直接的方式
docker-machine ssh <vmname> "<Command>"
配置env环境
eval $(docker-machine env <vmname>)
。
docker-machine env myvm1
输出如下:
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/cheny/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
这些都是导入环境变量的语句,eval执行这个设置环境变量的语句,docker运行时会读取这些环境变量,之后就会自动将语句发送到相应的机器上执行。
简而言之就是配置好指向myvm1的环境变量之后,本地执行docker stack deploy -c docker-compose.yml getstartedlab
,其实就是在myvm1中执行,而且docker会自动将本地的docker-compose.yml文件应用到myvm1这个机器上,省掉了分发配置文件的步骤。
退出myvm1的方式是eval $(docker-machine env -u)
。-u
就是unset的意思。
虚拟机上创建swram并加入swarm
我选择使用env的方式,在myvm1上创建节点。不使用env的方式,可以使用命令docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>
创建。
返回结果是:
Swarm initialized: current node (jbgyylqqg2bxyd2gkml66nqmt) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4m109aavz9wjhqc2rx7qkqyux3cnlvcyhnokhew31jipneer6n-191ckpl6qfq7alp2ggihgvmhs 192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
上面明确说明,进入其他机器,执行docker swarm join --token SWMTKN-1-4m109aavz9wjhqc2rx7qkqyux3cnlvcyhnokhew31jipneer6n-191ckpl6qfq7alp2ggihgvmhs 192.168.99.100:2377
加入swarm。通过env的方式进入其他机器照着做就是。
查看swarm node
进入manager,也就是这里的myvm1中,执行docker node ls
,就可以看到两台机器和它们的状态。
在swarm中部署app
通过docker-compose.yml文件可以看到,当前的services只有一个,名字叫web。其实我们还有redis这个service没有部署,会在stack章节中补上。
在myvm1这个manager上使用docker stack deploy -c docker-compose.yml getstartedlab
部署一个名为getstartedlab的stack。一个stack下可以有多个service,但我们只有一个名为web的service,它下面有5份container,按照默认的负载均衡策略,这个名为web的service下面的container可能会分布在myvm1和myvm2两台机器上。
以后所有的部署任务都在myvm1这个manager上执行,它会根据当前swarm下有多少机器自动对部署进行调整,其他的worker当个苦力就好,执行命令跟worker没有关系。
要伸缩处理能力,只需要增加或减少swarm中的机器和修改yml文件中replicas的数量并重新执行部署命令,整个过程服务依然正常,不会中断。
查看stack下的service情况
docker层次理解
一个swarm下可以有多个stack,每个stack都是一个完整的服务,每个服务都是由一个或多个service构成。这些service可能是数据库,也可能是web应用,它们协力合作组成用户使用的一个完整服务。而每个service由一到多个container组成,这些container可能分布在多个机器上,每个container就是这个分布式系统上实际的工作单位。这是我对docker层次的理解。
docker stack ps getstartedlab
在对docker层次有理解之后,这个查看命令的就明了了。它就是查看名为getstartedlab的stack的详细情况。
同理:
docker stack ls
就是查看有哪些stack在当前swarm中。docker service ls
就是查看有哪些service在当前swarm中。docker service ps getstartedlab_web
就是指定查看当前swarm中名为getstartedlab_web的service。这个名称是自动生成的,代表它是名为getstartedlab的stack下叫web的service。
清除swarm和stack
执行命令docker stack rm getstartedlab
移除当前stack。
在worker机器,执行docker swarm leave
退出swarm,manager节点只能强制退出docker swarm leave --force
,manager退出后意味着整个swarm不复存在。
docker-machine重启
docker-machine restart <vmname>
重启机器,通过docker-machine --help
,得知还有命令docker-machine start <vmname>
启动机器,docker-machine stop <vmname>
,不过它们更适用于本机的虚拟机。
系列导航
docker入门1-docker container
docker入门2-docker service
docker入门4-docker stack
docker入门3-docker swarm的更多相关文章
- Docker入门 - 006 Docker 多种数据库的安装
Docker 安装 MySQL 查找Docker Hub上的mysql镜像 root@VM_16_14_centos ~# docker search mysql INDEX NAME DESCRIP ...
- Docker入门 - 004 Docker 容器使用
Docker 客户端 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项. docker 可以通过命令 docker command -- ...
- Docker入门 - 003 Docker 实例
Docker Hello World Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序. 输出Hello world runoob@runoob: ...
- Docker入门之一Docker在Window下安装
最近这几年,各个大公司都在打造自己的云平台,什么阿里云,华为云,腾讯云等等云,以及各种的微服务架构,其实在这当中Docker容器技术算是一个很重要的角色. 一.下载 在下载之前首先检查一下自己的电脑是 ...
- Docker入门-搭建docker私有仓库
Docker Hub 目前Docker官方维护了一个公共仓库Docker Hub,其中已经包括了数量超过15000个镜像.大部分需求都可以通过在Docker Hub中直接下载镜像来使用. 注册登录 可 ...
- Docker入门——理解Docker的核心概念
1 前言 相信不少人听过这么一句话: 人类的本质是复读机. 在软件开发领域也一样,我们总是想寻找更好地方式复制优秀的逻辑或系统.最核心的方法是抽取通用逻辑和组件,把差异化的东西接口化或配置化,达到复用 ...
- 【Docker入门】Docker的常用命令
了解和安装完docker之后,我们学习一下docker的常用命令就和当初学linux命令一样,放心命令其实大致相同只不过细节不同. 一.Docker启动类命令 1.启动docker:syste ...
- Docker入门 - 005 Docker 容器连接
Docker 容器连接 前面我们实现了通过网络端口来访问运行在docker容器内的服务.下面我们来实现通过端口连接到一个docker容器 网络端口映射 我们创建了一个 python 应用的容器. do ...
- Docker入门 - 002 Docker 的简单操作
系统要求:CentOS 7.2 64 位操作系统. Docker 的简单操作 下载镜像 下载一个官方的 CentOS 镜像到本地 docker pull centos 下载好的镜像就会出现在镜像列表里 ...
- Docker 入门之docker容器创建
使用docker容器的大多数人都是因为想要隔离不同运行环境的差异,使得自己的应用能更好的移植和部署.那么我们来看看掌握docker需要掌握哪些方面. 1,搭建docker环境 2,编译镜像并将其运行成 ...
随机推荐
- MySQL组复制MGR(二)-- 组复制搭建
(一)主机操作 (1)路由信息vmnet5 192.168.10.0 (2)主机信息 主机名称 IP地址 操作系统版本 数据库版本 mgr-node1 192.168.10.11 centos 7.4 ...
- Csrf+Xss组合拳
本文首发于“合天智汇”公众号,作者: 影子 各位大师傅,第一次在合天发文章,请多多关照 今年年初的疫情确实有点突然,打乱了上半年的所有计划(本来是校内大佬带我拿奖的时刻,没了 ,学长毕业了,就剩下我这 ...
- jmeter正则表达式,萌新入门篇
@@@@@@@@@@@@ 透过现象看本质 jmeter中正则表达式对我们来说,就是一个工具,他可以帮助我们做的事就是从一堆数据中截取出我们想要的字段,比如从setcookie:DERF12456DAS ...
- LQB20180航班时间(sscanf)
首先找找规律,两者相加除以二. 按格式读入sscanf 按格式输出printf("02d%",m);前导0 #include <iostream> #include & ...
- 02_HTML02
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"软件测试"获取视频和教程资料! b站在线视频 HTML ...
- Day01_虚拟化架构与系统部署
学于千峰教育开源课程 感恩 千峰教育官网 b站在线视频 前言:本人所使用的操作系统是MacOS 使用的虚拟机软件为parallels desktop 本章结构 构建桌面端虚拟环境 虚拟机的概述 VMa ...
- PHP usort() 函数
------------恢复内容开始------------ 实例 使用用户自定义的比较函数对数组 $a 中的元素进行排序:Sort the elements of the $a array usin ...
- PHP xml_get_current_line_number() 函数
定义和用法 xml_get_current_line_number() 函数获取 XML 解析器的当前行号.高佣联盟 www.cgewang.com 如果成功,该函数则返回当前行号.如果失败,则返回 ...
- 从jdbc到spring-boot-starter-jdbc
从jdbc到spring-boot-starter-jdbc jdbc 是什么 JDBC是一种用于执行SQL语句的API,可以为多种关系数据库提供统一访问,它是由一组用Java语言编写的类和接口.是J ...
- 动态生成HTML元素-模拟在线考试功能
前言 我们在项目开发过程中,经常会遇到页面html元素无法提前预设,而是通过某一些条件动态生成的情况,这里我们需要考虑如下几个因素: 1.需要动态创建的元素类型,比如TextBox, Radio, C ...