docker swarm 固定ip_Docker君带你认识Docker Swarm

1、什么是Docker Swarm?

  • 概念

  Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻便,具有的功能相对kubernetes更少一些。

  • 发展

  Docker Swarm在1.12之前是一个独立的项目,需要单独下载,在1.12之后该项目就合并到了docker中,成为docker的子项目,目前docker唯一的一个原生支持docker集群的管理工具。

2、Docker Swarm的架构图

c442a986eb020c7a68ac5fc76b2e45f1.png

  这个图作为一个整体实际上都处于一个所谓的集群中,它可能对应了一到多台的实际服务器。每台服务器上都装有Docker并且开启了基于HTTP的DockerAPI。这个集群中有一个SwarmManager的管理者,用来管理集群中的容器资源。管理者的管理对象不是服务器层面而是集群层面的,也就是说通过Manager,我们只能向集群发出指令而不能具体到某台具体的服务器上要干什么(这也是Swarm的根本所在)。至于具体的管理实现方式,Manager向外暴露了一个HTTP接口,外部用户通过这个HTTP接口来实现对集群的管理。对于稍微大一点的集群,最好是拿出一台实际的服务器作为专门的管理者,作为测试学习而言,也可以把管理者和被管理者放在一台服务器上。

3、安装与简单的集群建立

  ●  开启带有HTTPAPI的Docker服务

  我的虚拟机环境是CentOS7的,Docker则是通过yum来安装的。如要使用swarm,则必须让Docker开放其HTTP的API。默认情况下这个API没有开启,而开启此API需要在启动时加入-H参数。

  网上有的人说运行/usr/bin/docker的时候直接加,有的又说修改/etc/sysconfig/docker之类的文件,都不适用于我,可能是由于系统以及docker本身的版本的缘故。而我是修改/lib/systemd/system/docker.service这个文件中的参数,并且用systemctl来管理启动docker服务。

  上面这个文件的ExecStart很明显是指出了docker的启动参数,在第一行的后面直接加上:

-H tcp://0.0.0.0:2375

(CentOS6还需要加上-H unix:///var/run/docker.sock)

修改完成之后别忘了运行一下systemctl daemon-reload刷新配置

  然后再重启/启动Docker服务,此时通过netstat -ntlp可以看到一个新开的2375端口,此乃默认的DockerHTTPAPI的端口。如果是一个集群则需要注意集群中所有相关的主机都记得要启动带这个端口的Docker服务。

  ●  没有正确退出swarm集群时引发的问题

  退出swarm集群用的命令是docker swarm leave,然而存在这样一种情况:没有完全退出swarm集群时就关掉了Docker服务。随后网络环境变化了(主机的IP变了)。此时若再systemctl start docker将会报错,通过systemctl status docker -l可以查看完整的报错信息,提示找不到老IP地址云云。其实这是启动swarm时报的错误。

  google了一下之后,发现比较方便的解决办法是手动修改/var/lib/docker/swarm下面的docker-state.json和state.json两个文件。把这两个json文件中原来的老地址都改成现在的新地址。应该就可以顺利启动了。

  ●  创建小集群

  前面提到的Swarm Manager,其本身其实是一个容器,其他一些swarm的角色基本上也通过容器的方式来实现。Swarm源于Docker而基于Docker。但是Docker在刚安装的时候是没有swarm支持的,需要我们docker pull swarm去DockerHub里下载swarm的镜像。这个镜像本身不大,最新版的大概15MB左右,一会儿就下载完了。

  当然,如果是集群的话那么需要在所有相关的主机上都pull到这个镜像。

  第一步,建立一个集群并且取得集群标志。Swarm支持自动发现功能,如果在一个网络中存在多个集群,那么就需要每个集群都有一个区别于其他集群的标志来防止混淆。这个标志就是所谓的集群token,在集群创立之初就被指定且无法更改。在被选为管理者角色的服务器上运行命令:

docker run --rm swarm create

   这个命令返回中带有一串token字符串(以dfb4fb3a8767835d799ce429fb4d7c4d为例),这个信息需要记录下来,之后所有操作中都需要用到它来指出我们对哪个集群操作。而且目前还没找到如何查看一个既存集群的token,所以一定要记录一下。。

  创建集群过后实际上并没有真的增加什么Docker资源,仍然是一个空的集群。

  第二步,创建集群获取到集群token之后,目前我们手上拿着的还是一个空集群,接下来就往里面加入节点主机吧。加入节点主机的方法是再各个节点主机上运行这条命令:

docker run -d swarm join --addr=192.168.1.102:2375 token://dfb4fb3a8767835d799ce429fb4d7c4d

  其中--addr参数指出的是本主机的Docker服务的socket,自然,IP要和各个主机自身的IP一致。另外我尝试了一下,若在本机指定addr为localhost或者0.0.0.0之类的IP,最终是无法正常工作的。所以即便是在管理者本机,也要老老实实写出IP。完成后可以在当前主机上docker ps看一下,应该可以看到一个在运行中的swarm容器。这个容器扮演的角色就是向上和管理者容器通信,向下管理所在本机的docker资源,所谓被管理主机的代理。

  创建完后,可以通过

docker run -d swarm list token://dfb4fb3a8767835d799ce429fb4d7c4d

  来查看这个指定的集群(由token指出)中存在哪些join进来的节点。需要注意的是,swarm join命令只是简单的加入集群的声明,swarm并不会去验证给出的地址和端口是否真的可以访问到一个Docker服务。对于没有发现正常Docker服务的节点,将置状态为Pending而不是Healthy,这个状态以及其他节点相关信息怎么看下面会说。

   第三步,开启管理者容器。上面建立了集群框架,并且往集群中加入了join节点(即被管理主机的代理),但是还没有出现管理者容器(管理主机的代理)。创建管理者容器的方法是在管理者主机上:

docker run -d -p 8888:2375 swarm manage token://dfb4fb3a8767835d799ce429fb4d7c4d

  同样,docker ps之后可以看到管理容器。-p表名管理者容器做了一个端口映射。因为2375端口在本机上已经被Docker进程占用(当然启动时指定的端口不是默认的2375就另当别论了),而管理容器暴露的这个端口要提供出来,实现外界对集群的管理,所以做了一个端口映射。这个8888,也可以换成其他任何合理的端口号。

  有了管理容器,并且管理容器给出了8888端口作为管理的入口,我们就可以运行以下这些命令了:

docker -H 192.168.1.101:8888 info
docker -H 127.0.0.1:8888 ps
docker -H 192.168.1.101:8888 images

  由于这个8888端口就可以看做是一个网络中的普通端口,在本机上访问的话自然IP写127.0.0.1也是可以的。但是注意不能写成localhost,不然会报错。。

  这三条命令,去掉-H参数的话就是一般的docker用来查看信息的命令。加上-H之后,比如-H 192.168.1.101:8888之后,其意义就变成了,查看一个集群的相关信息。这个集群是192.168.1.101的8888端口对应的管理容器所对应的那个集群。

  通过这几条命令呈现出来的docker资源如容器和镜像是不强调具体处于那台主机上的,这就使得集群的概念得以发扬光大。另外通过这个socket得到的集群的信息会把swarm本身除外。比如目前这个状态通过-H xxx ps看到的容器列表应该是空的。因为我们还没有让集群运行任何容器。但是docker ps会有swarm的容器显示出来。如果想在-H的时候(所谓集群视图)也看到swarm容器信息可以用ps -a。

  最后,info命令的结果和普通的docker info命令结果不太一样,最主要的是有了nodes这个字段。这个字段包含了各个节点的信息,包括前面提到的节点状态等信息。

往期精彩

《Docker是什么?》

《Kubernetes是什么?》

《Kubernetes和Docker到底有啥关系?》

《Docker镜像进阶:了解其背后的技术原理》

《Docker 基础用法和命令帮助》

5db19d8f22785edcff75a509113de4ba.png 872d0d1a512ca8fdbf0ecb0807d47168.gif 0934fb9c704f2e4f5f5f2f356b7bc7bd.png

dockerchina

c015bf79c12d3e942b283718c9373833.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值