docker技术剖析--docker1.12版本+swarmkit

防伪码:为目标,晚卧夜半,梦别星辰,脚踏实地,凌云舍我其谁!

1、Docker Swarm  是什么?

Docker Swarm 是一个用于创建 Docker 主机(运行 Docker 守护进程的服务器)集群的工具,

使用 Swarm 操作集群,会使用户感觉就像是在一台主机上进行操作

docker1.12 集成了 swarmkit, 使你可以不用安装额外的软件包, 使用简单的命令启动创建

docker swarm 集群。

如果你在运行 Docker 1.12 时,你就可以原生创建一个 Swarm 集群 .

集成了 swarm 集群的安全特性, 集成了 K-V 存储, 你现在不需要额外部署 etcd 或者 consul。

在 Docker1.12 版本中,一个大的功能点是 swarm 集群(基于 swarmkit 项目),通过 Docker

命令可以直接实现 docker-engine 相互发现,并组建成为一个容器集群。

SwarmKit 将节点分为两类:

工作节点(Worker ):负责通过执行容器运行任务。SwarmKit 的默认执行器为 Docker 容器执

行器(Docker Container Executor)。

(1)内建分布式存储,不要额外的数据库

(2)支持 Rolling update

(3) 容器高可用

(4)通过 TLS 保证了节点之间通讯的安全

管理节点(Manager ):负责接收和响应用户请求,将集群状态调节到最终状态。在 SwarmKit中,用户可以动态调整节点的角色,即在 Manager 和 Worker 之间转换。

如下图所示,这是一个典型的 master-slave 的架构。每个节点都是运行着 Docker Engine 的

Docker 主机。一些节点有更高的权限,被称为 Manager。下面的节点是 worker 节点,接收

来自 manager 组的任务指示。

实验目标:部署 docker1.12 Swarm

实验环境:

这里选择三台主机运行 Swarm,依次为:

node1 192.168.1.104

node2 192.168.1.105

node3 192.168.1.113

1、基本环境配置

3 台主机确保时间一致 ntp

3 台主机均关闭 selinux,开启路由转发。

3 台主机根据上面的实验环境描述修改主机名和 ip 地址

2、系统环境准备

准备系统环境, 配置 host 列表

未经允许不得转载传播--陈英宏

博客地址:hongge.blog.51cto.com

3 台主机均修改/etc/hosts 文件,添加所有主机的 ip 地址和主机名的映射记录

以 node1 为例子:

将修改好的本地的/etc/hosts文件复制给node2,node3

for ip in 105 113 ; do scp /etc/hosts [email protected]$ip:/etc/hosts ; done

开启宿主机之间的端口 :

TCP 端口 2377 集群管理端口

TCP 与 UDP 端口 7946 节点之间通讯端口

TCP 与 UDP 端口 4789 overlay 网络通讯端口

配置所有节点密钥登录:

配置所下节点密钥互信, 在 node1 可以免密码登录各节点,只在 node1 上执行:

生成 sshkey

发布 sshkey 到各个节点

命令:for i in 1 2 3 ; do ssh-copy-id node$i ; done

或者

ssh-copy-id node1

ssh-copy-id node2

ssh-copy-id node3

测试密钥登录

安装 docker 1.12(按照 docs.docker.com 官网安装)

在所有节点上安装 docker 1.12:

以下命令请在所有节点上执行.

添加 docker repo 文件

rm -rf /etc/yum.repos.d/*

tee /etc/yum.repos.d/docker.repo<<-‘EOF‘

[dockerrepo]

name=Docker Repository

baseurl=https://yum.dockerproject.org/repo/main/centos/7/

enabled=1

gpgcheck=1

gpgkey=https://yum.dockerproject.org/gpg

EOF

安装 docker package

yum-y  install docker- engine

启动 docker

检查 docker 版本

docker1.12 Swarm 模式简介:

Docker Engine 1.12 集成了 Swarm 集群工具.

主要使用三个新的命令行工具创建一个 swarm 集群:

docker swarm 开启 swarm 模式; 加入 Swarm 集群; 配置集群参数

docker node 查询集群节点信息; 提升/移除一个管理节点; 管理 swarm 节点主机

docker service 创建管理 service

可以查看 docker --help

创建 Swarm 集群

在 node1 上初始化 swram 集群:

注意 你只需要在一个 node1 上初始化 swarm 集群, 其他 node 加入这个集群就行了, 所以以

下命令只需要在 node1 上运行.

--advertise-addr 参数, 后面跟你 swarm 集群的通讯地址, 也就是 node1 的地址.

查看端口号监听情况

检查 node1 docker swarm mode 信息:

#docker info

显示信息如下:

查看 swarm 集群 node 列表:

可以看到,我们的 swarm 集群中只有一个节点.现在我们把其他节点加入我们的集群中:

把其他节点加入集群中:

在 node1 通过 ssh, 在 node2-node3 上执行上面的加入集群命令:

注: 如果你不记得上面提示的加入 swarm 集群的命令和密钥可以使用如下方式查看 worker

节点和 manager 节点的加入命令

再次检查集群节点列表, 我们可以看到所有的服务器都已经加入 swarm 集群了

不过现在集群只有一个manager节点node1, 为了swarm集群的高可用,和避免单点故障. 我

们希望建立多个 manager 节点集群.

只需要通过如下命令, 提升 worker 节点成 manager 节点:

[[email protected] ~]# docker node promote node2

查看 node2 的 docker info

现在我们可以看到, 已经有2个manager节点了, 一个Leader节点, 一个Reachable节点. 现

在你也可以在 node2 上面管理整个 swarm 集群.

我们的 swarm 集群就搭建完毕了. 超级简单

习惯使用 docker 命令帮助:docker<command> --help

总结:

docker swarm:集群管理,子命令主要有下面几个。

docker swarm init 命令用于初始化一个集群

dockerswarm join 命令用于加入一个现有集群

dockerswarm leave 命令由于离开集群

附:node 下线

有些时候需要维护一个节点,此时此节点可能会网络断开或者需要关机,造成节点上服务不

可用。使用 docker node update --availability drain <NODE-ID>将节点下线,swarm 会将当前节

点上的容器关闭并在其他节点上启动。当维护完成,需要上线是,将节点状态修改为 active

状态即可,命令如下:docker node update --availability active <NODE-ID>

有了 Docker Swarm 集群我们如何把我们的应用跑在 Swarm 集群上呢?

很简单, 基本上原来我们使用 docker run 的命令创建容器, 把前面替换成 docker service

create 就行了.

建议搭建一个 registry,为所的 docker 主机提供镜像下载,否则你需要在每个 docker 主机本

地存在容器镜像。

所以搭建一个私有仓库,由私有仓库提供所需要的镜像,

本实验环境中用 node1 同时作为 registry。

拉取本地私有仓库 registry,查看 registry 镜像

开启路由转发

vi /etc/sysctl.cof

添加 net.ipv4.ip_forward=1

执行 sysctl -p 使修改生效

#docker pull registry:2

#docker images

附:registry1 是 python 语言写的,而现在 registry2 版本即 docker distribution 更加安全和快

速,并且是用 go 语言写的。

基于私有仓库镜像运行容器

默认情况下,registry2 会将仓库存放于容器的/var/lib/registry 目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器的/var/lib/registry 下,两个目录下都有!

registry 的默认存储路径是/var/lib/registry,只是个临时目录,一段时间之后就会消失

所以使用-v 参数,指定个本地持久的路径,

返回{"repositories":[]} 说明 registry 服务工作正常.

注:镜像信息存放在/var/lib/registry 目录下,因此这里将宿主机目录映射到/var/lib/registry

所有主机都指向 registry 服务器:

停止 docker 服务

#systemctl stop docker

修改/usr/lib/systemd/system/docker.service,修改后保存退出

重载 docker 服务并启动 docker 服务

#systemctl daemon-reload

#systemctl startdocker

测试本地镜像仓库

有了本地镜像仓库 registry, 现在我们推送一个测试镜像到本机镜像仓库, 测试下 registry 服

务.

测试:在 node2 主机上推送镜像到 registry

如果想把镜像推送到本地 registry.

需要先 tag 这个镜像的名字成<registry>/<image name>:<tag>

将 tag 后的镜像上传到 registry.

push 成功后, 可以调用 registry API 查看 registry 中的镜像

在 node2主机测试从 registry 下载镜像

overlay 网络

解决了镜像构建问题, 为了让应用跑在 swram集群 上,我们还需要解决容器间的网络访问问

题.

单台服务器的时候我们应用所有的容器都跑在一台主机上, 所以容器之间的网络是互通的.

现在我们的集群有 3 台主机, 所以 docker 应用的服务会分布在这 3 台主机上.

如何保证不同主机上的容器网络互通呢?

swarm 集群 已经帮我们解决了这个问题了,就是只用 overlay network .

在 docker 1.12 以前, swarm 集群需要一个额外的 key-value 存储(consul, etcd). 来同步

网络配置, 保证所有容器在同一个网段中.

在 docker 1.12 已经内置了这个存储, 集成了 overlay networks 的支持.

下面我们演示下如何创建一个 overlay network:

注:swarm 上默认已有一个名为 ingress 的 overlay 网络, 可以直接使用, 但本文会创建一个

新的

为我们的 docker 应用创建一个名为 dockercoins 的 overlay network

查询 docker network 列表

在网络列表中你可以看到 dockercoins 网络的 SCOPE 是 swarm, 表示该网络在整个 swarm 集

群生效的, 其他一些网络是 local, 表示本机网络.

你只需要在 manager 节点创建 network, swarm 集群会自动处理配置到其他的节点,这是你可

查看其他节点的 network. dockercoins 网络已经都创建了

注:一旦新的任务被指定给这个节点,Overlay 网络就会被按需创建。

在 swarm 集群上运行 docker 应用

概念解释:service

Docker1.12 swarm 引入了服务的概念,一个服务由多个任务组成,一个任务即一个运行的容器。

服务包括两种类型:

复制服务(replicated services):类似 k8s 中复制集的概念,保持一定数量的相同任务在集

群中运行;

全局服务(global services):类似 k8s 中 daemon 的概念,每个工作节点上运行一个。

发布服务:

在 manager 上执行如下命令:

下面我们可以使用之前 push 到本地镜像仓库的镜像启动服务, 以 centos:http 为例:

以复制服务类型运行服务

在 manager 上执行如下命令:

docker service create 命令创建一个 service.

--name 标签命名 service 为 web1.

--replicas 标签来声明 1 个运行实体(即容器副本数)

注意, 我们启动的镜像名字 192.168.1.104:5000/centos:http 使用我们本地镜像仓库的镜像名

称, 这样当主机上没有这个镜像时, 会自动到本地镜像仓库拉取镜像.

使用 docker service ls 查看服务

dockerservice inspect 命令用户查看 service 详细信息

使用 docker serviceps<SERVICE-ID/NAME>查看服务运行在哪个节点上

现在你可以用浏览器访问 http://192.168.1.104:8000 就能访问测试页

事实上, 你可以访问swarm集群中的所有节点 192.168.1.105、192.168.1.113的8000端口, 都

可以访问测试页。(注:将 firewall 防火墙默认区域设置为 trusted)

在 manager 上执行如下命令:

--replicas 标签来声明 2 个运行实体

查看服务:

从上图可以看到 web2 名称的 service 有 2 个副本分别运行在 node1和 node3 节点上。

以全局服务类型运行服务

从下图可以看到服务 web4 在每个节点上都运行一个

下面我们扩展旧的服务,从下图可以看到 web1 service 目前只有一个副本

扩展已有的服务的副本数,这里将 web1 服务扩展到 3 个副本

缩减已有的服务的副本数,这里将 web1 服务缩减到 2 个副本

Swarm 节点是自组织(self-organizing)和自修复(self-healing)的,什么意思?只要有节

点或容器宕掉,swarm engine 就会尝试修复,下面我们来具体看一下

自修复(self-healing)

经过上面的操作之后,我们有以下 3 个节点:

运行着 3个服务共 7 个任务(容器)

Node1 节点上运行着容器 2个容器还有一个私有仓库注册服务器容器

Node2 节点上运行着容器 2 个容器

Node3 节点上运行着容器 3个容器

现在我们让 node3 上的容器都宕掉或部分宕掉

一旦 node3 上所有容器停止,Docker 就会试图在相同的节点上启动 2 个不同 ID 的容器。

这就是 Docker Swarm Engine 的 self-healing 功能。

在 node3 节点上执行 dockerps 查看

Self-Organizing

现在我们让 node3 整个宕掉,node3 上的容器会自动在其它节点上启动。

在 manager 节点上执行 docker server ps 服务名

谢谢观看,真心的希望能帮到您!

时间: 2024-10-20 00:46:16

docker技术剖析--docker1.12版本+swarmkit的相关文章

docker技术剖析--镜像、容器管理

防伪码:博观而约取,厚积而薄发                                 docker技术剖析--镜像.容器管理 一.Docker简介 Docker是什么? Docker的英文本意是"搬运工",在程序员的世界里,Docker搬运的是集装箱(Container),集装箱里装的是任意类型的App,开发者通过Docker可以将App变成一种标准化的.可移植的.自管理的组件,可以在任何主流系统中开发.调试和运行. 说白了,docker是一种用了新颖方式实现的轻量级虚拟机,

docker技术剖析--dockerfile and registry(构建容器和私有仓库)

防伪码:梅须逊雪三分白,雪却输梅一段香 docker技术剖析--dockerfile and registry(构建容器和私有仓库) 一.根据Dockerfile构建出一个容器 1.Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfile指令翻译真正的Linux命令.Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile.

docker技术剖析--docker网络

防伪码:不经一番寒彻骨,怎得梅花扑鼻香.                 docker技术剖析--docker网络 一. Docker 中的网络功能介绍 默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器. Docker 允许通过外部访问容器或容器互联的方式来提供网络服务 外部访问容器: 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过  -P  或  -p  参数来指定端口映射. 练习环境:运行一个容器,提供web服务和ssh服务 宿主机启用路由转发(net.

docker技术剖析--docker资源限制及应用总结

防伪码:有花堪折直须折,莫待无花空折枝. 一.本文将介绍 cgroup 如何做到内存,cpu 和 io 速率的隔离 本文用脚本运行示例进程,来验证 Cgroups 关于 cpu.内存.io 这三部分的隔离效果. 测试机器环境(docker 1.12版本) 启动 Cgroups systemctl enable cgconfig.service systemctl start cgconfig.service 执行 mount 命令查看 cgroup 的挂载点 从上图可以看到 cgroup 挂载在

docker技术剖析--docker资源限制及应用总结 for centos7.2

http://hongge.blog.51cto.com/ Docker(linux container)所依赖的底层技术 1 Namespace 用来做容器的隔离,有了namespace,在docker container里头看来,就是一个完整的linux的世界.在host看来,container里的进程,就是一个普通的host进程,namespace提供这种pid的映射和隔离效果,host承载着container,就好比一个世外桃源. namespace包括:pid namespace.pi

docker技术剖析--中小企业可以用docker来标准化开发、测试、生产环境

一.使用 Docker 搭建 Tomcat 运行环境 1 Docker与虚拟机 2 搭建过程 2.1 准备宿主系统 准备一个 CentOS 7操作系统,具体要求如下: 必须是 64 位操作系统 建议内核在 3.8 以上 通过以下命令查看您的 CentOS 内核:   # uname -r 2.2 安装Docker   # yum install docker 可使用以下命令,查看 Docker 是否安装成功:   # docker version 若输出了 Docker 的版本号,则说明安装成功

docker技术剖析--数据卷

防伪码:宁可枝头抱香死,何曾吹落北风中. 前言: 1.想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的.Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(即镜像栈顶部)添加一个读写层.如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏.当删除Docker容器,并通过该镜像重新启动时,之前的

docker技术剖析--docker supervisor、compose

防伪码:有志不在年高,无志空活百岁. 一.使用 Supervisor 来管理进程 Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务.但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个启动脚本里面,启动的时候直接启动这个脚本. 例如:docker  run  –d  镜像  /run.sh 另外就是安装进程管理工具. 本节将使用进程管理工具 supervisor 来管理容器中的多个进程.使用 Sup

docker技术剖析--数据卷 for centos7.2

想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的.Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(即镜像栈顶部)添加一个读写层.如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏.当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失.在Docker中,只读层及在顶部的读写层