Docker容器统一编排部署
知识点
容器编排服务是指用于管理和协调容器集群的工具或平台,它的主要用途是简化和自动化容器化应用的部署、管理和扩展。通过容器编排服务,可以实现应用程序的快速部署、水平扩展和高可用性,提供更高的开发和运维效率。
容器编排服务的方法通常包括以下几个方面:
定义应用程序:首先需要定义应用程序的拓扑结构,即确定应用程序的组件和服务如何运行并相互关联。可以使用类似于Docker Compose或Kubernetes的声明性语法来描述应用程序的部署需求。
容器编排:容器编排服务负责根据定义的应用程序拓扑结构,在容器集群中进行容器的动态编排和管理。它会根据需要自动进行容器的创建、销毁和调度,并确保应用程序组件之间的通信和依赖关系正确建立。
服务发现和负载均衡:容器编排服务通常包含服务发现和负载均衡的功能,以实现应用程序组件之间的通信和资源的动态分配。它可以根据需求自动配置和管理负载均衡器,并提供服务发现机制,使应用程序可以通过统一的入口点进行访问。
自动伸缩:容器编排服务也支持自动伸缩功能,根据指定的策略监测应用程序的负载情况,并自动进行容器的扩容或缩容。通过自动伸缩,可以根据实际需求动态调整容器集群的规模,以提供更好的性能和资源利用率。
高可用性和容错性:容器编排服务提供了容器集群的高可用性和容错性。它会监控容器的健康状态,并在容器异常或故障时进行自动修复或迁移。通过容错机制,保证应用程序的稳定运行和可靠性。
常用的容器编排工具和平台包括Docker Swarm、Kubernetes、Apache Mesos等。它们提供了丰富的功能和API,支持跨多个主机或云平台进行容器集群的编排和管理,简化了容器化应用的部署和运维过程。
环境准备
使用Linux系统,centos7或者ubuntu18,这里我使用的是centos7
桥接网络,配置静态ip,保证能够上网
master结点ip为192.168.43.27
node结点的ip为192.168.43.28
CentOS7安装Docker
企业部署一般都是采用Linux操作系统,而其中又数CentOS发行版占比最多,所以在CentOS下安装Docker。
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 分为 stable test 和 nightly 三个更新频道。
这里主要介绍 Docker CE 在 CentOS上的安装。
Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以在CentOS 7安装Docker。
卸载(可选)
如果之前安装过旧版本的Docker,可以使用下面命令卸载:
安装docker
安装yum工具


配置yum的镜像源,下载包速度更快
这里用的方法是直接下载官方的yum配置文件替换到本地
查看自己的系统版本
将原yum配置文件移动到自定义的目录下进行一个简单的备份,如果出现意外后也可以及时回滚
下载镜像文件
清除yum缓存并刷新yum缓存
更新yum关于docker的本地镜像源


输入命令:


docker-ce为社区免费版本。稍等片刻,docker即可安装成功。
启动docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,直接关闭防火墙!
启动docker前,关闭防火墙
通过命令启动docker:
输入命令,可以查看docker版本:
如图:

配置docker镜像加速
docker官方镜像仓库网速较差,需要设置国内镜像服务:
这里使用的是阿里云的镜像加速:
配置主机和IP地址映射
配置主机名与IP地址映射后,访问服务器上部署的服务就不用在记住IP地址,只需要输入服务器名称即可访问服务,相比记住IP地址访问应用要方便。
修改主机名
查看主机名

修改主机名

node的主机名修改方法同上
修改主机映射
所有节点修改/etc/hosts文件配置主机映射,这里要根据自己的节点ip配置

配置结果
修改完成重启测试主机,ping master和node


配置时间同步
在Docker Swarm集群中,节点之间的时间同步非常重要。一致性和可靠性是关键原因之一。作为一个分布式的容器编排平台,Docker Swarm需要确保集群中的所有节点具有相同的时间标记,以便保证任务调度、容器通信以及日志和监控等方面的一致性和可靠性。此外,时间同步还对资源调度、容器健康检查和容器网络等方面有重要影响。
在资源调度方面,节点间的时间同步可以帮助Docker Swarm了解彼此的负载情况和容器状态,从而更好地分配资源和协调任务。对于容器健康检查,时间同步确保了检查发生在同一时间段内,从而准确判断容器是否正常运行。而在容器网络方面,时间同步可以保证容器间通信的顺序和一致性,避免由时钟漂移引起的通信问题。

发现centos7已经安装了chrony
Master节点
Master节点修改/etc/chrony.conf文件,注释默认NTP服务器,指定上游公共NTP服务器,并允许其他节点同步时间。
Master节点重启chronyd服务并设为开机启动
开启网络时间同步功能

Node节点
Node节点修改/etc/chrony.conf文件,指定内网 Master节点为上游NTP服务器,重启服务并设为开机启动
IP为master节点地址
Node节点重启chronyd服务并设为开机启动
配置结果
所有节点执行chronyc sources命令,查询结果中如果存在以“^*”开头的行,即说明已经同步成功。


配置Docker API
所有节点开启Docker API
将
修改为

修改完成
配置再加载
下载一些镜像,使用pull命令
默认下载的镜像是最新的:swarm:latest,httpd:latest,nginx:latest
Master结点初始化集群
在Master节点创建Swarm集群
初始化命令中“--advertise-addr”选项表示管理节点公布它的IP是多少。其它节点必须能通过这个IP找到管理节点

输出结果中包含3个步骤:
- Swarm创建成功,swarm-manager成为manager node。
- 添加worker node需要执行的命令
- 添加manager node需要执行的命令
Node节点加入集群
如果初始化时没有记录下docker swarm init提示的添加worker的完整命令,可以通过命令查看
Master节点执行命令查看

在Node节点添加worker node

添加manger node
验证集群
登录Master节点,查看各节点状态

安装Portainer
Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传和下载镜像、创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型企业对容器管理的全部需求。
登录Master节点,安装Portainer
通过命令安装 Portainer

可能出现的问题

将之前运行的删除
打开浏览器,输入地址http://192.168.43.27:9000访问Portainer主页

首次登录时需设置用户名和密码,然后输入设置的用户名和密码进行登录

进入控制台

接下来要部署服务,Service的容器副本可能会伸缩,甚至失败,会在不同的主机上创建和销毁,这就引出一个问题,如果Service有需要管理的数据,那么这些数据应该如何存放呢?如果把数据打包在容器里,这显然不行,除非数据不会发生变化,否则,如何在多个副本之间保持同步呢?volume是将宿主级的目录映射到容器中,以实现数据持久化。可以用两种方式来实现:
挂载目录
- volume默认模式:工作节点宿主机数据同步到容器内。
- volume NFS共享存储模式:管理节点宿主同步到工作节点宿主,工作节点宿主同步到容器。
生产环境中一般推荐使用volume NFS共享存储模式。
Master节点
登录Master节点,安装NFS服务端、配置NFS主配置文件、添加权限并启动
添加目录让相应网段可以访问并添加读写权限

/root/nginx: 这是要共享的目录路径。在这个例子中,/root/nginx是服务器上待共享的目录。
192.168.43.27/24: 这是允许访问该共享目录的客户端IP网段。在这个例子中,允许访问的客户端IP范围是192.168.43.1到192.168.43.254。
rw: 这是共享目录的访问权限选项。rw表示可读可写,这意味着客户端可以对共享目录中的文件进行读写操作。
async: 这是NFS服务器的异步写入选项。当设置为async时,写入操作可以异步地将数据写入到磁盘,从而提高性能。但是这也带来了一定的风险,因为数据可能会在尚未写入磁盘时丢失。
insecure: 这是一个安全性选项。当设置为insecure时,允许不受信任的客户端访问共享目录。这在某些特定的情况下可能是必要的,但通常不建议使用,因为它可能导致潜在的安全风险。
anonuid=1000和anongid=1000: 这是指匿名用户(没有认证的用户)在共享目录上的的用户ID和组ID。在这个例子中,匿名用户的用户ID和组ID都设置为1000。这允许匿名用户以ID为1000的用户的身份进行文件操作。
no_root_squash: 这是一个权限选项,它指定在共享目录中以root用户身份进行文件操作时不进行身份映射。换句话说,当设置为no_root_squash时,root用户在客户端上将拥有与NFS服务器上的root用户相同的权限。
创建共享目录
添加权限


开启RPC服务并设置开机自启

启动NFS服务并设置开机自启

查看NFS是否挂载成功

Node节点
安装NFS客户端并启动服务

添加目录让相应网段可以访问并添加读写权限

创建共享目录

添加权限


启动NFS服务并设置开机自启

部署的服务可能分不到各个节点上,在所有节点创建docker volume
--opt device=:/root/nginx用于指向共享目录,也可以是共享目录下的子目录
--opt device=:/root/httpd用于指向共享目录,也可以是共享目录下的子目录

配置结果
查看volume


查看详细信息


可以看出NFS的/root/nginx被挂载到了/var/lib/docker/volumes/nginx_zjq/_data目录


可以看出NFS的/root/httpd被挂载到了/var/lib/docker/volumes/httpd_zjq/_data目录
创建并发布httpd服务
部署一个运行httpd镜像的Service

部署Service的命令形式与运行容器的docker run很相似,--name为Service命名,httpd为镜像的名字
查看当前Swarm中的Service

REPLICAS显示当前副本信息,2/2意思是web_server这个Service期望的容器副本数量为2,目前已经启动的副本数量为2,即当前Service已经部署完成。
查看Service每个副本的状态

可以查看到Service一个副本被分到master,另一个副本被分派到node,当前的状态是Running
使用Winscp将物理机的index.html文件上传到/root/httpd

进入/root/httpd目录
查看文件

创建并发布nginx服务

查看当前Swarm中的Service

REPLICAS显示当前副本信息,2/2意思是nginx_web_server这个Service期望的容器副本数量为2,目前已经启动的副本数量为2,即当前Service已经部署完成。命令docker service ps可以查看Service每个副本的状态
查看Service每个副本的状态

可以查看到Service一个副本被分到master,另一个副本被分派到node,当前的状态是Running
使用Winscp将物理机的index.html文件上传到/root/nginx

进入/root/nginx目录录
查看文件

调度节点
默认配置下Master也是worker node,所以Master上也运行了副本。如果不希望在Master上运行Service,可以执行如下命令
Service伸缩
对于Web服务,通常会运行多个实例。这样可以负载均衡,同时也能提供高可用。
增加Service的副本数

副本数增加到5,查看副本的详细信息


5个副本已经分布在Swarm的所有节点上。
也可以减少副本数

副本数减少到2,查看副本的详细信息


2个副本已经分布在Swarm的所有节点上。

