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,可以使用下面命令卸载:

yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce


安装docker


安装yum工具

yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken

配置yum的镜像源,下载包速度更快

这里用的方法是直接下载官方的yum配置文件替换到本地

查看自己的系统版本

cat /etc/system-release

将原yum配置文件移动到自定义的目录下进行一个简单的备份,如果出现意外后也可以及时回滚

mv /etc/yum.repos.d/CentOS-Base.repo /home/chihai/backup/yum/

下载镜像文件

wget http://mirrors.aliyun.com/repo/Centos-7.repo

清除yum缓存并刷新yum缓存

yum clean all
yum makecache

更新yum关于docker的本地镜像源

# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast

输入命令:

yum install -y docker-ce

docker-ce为社区免费版本。稍等片刻,docker即可安装成功。


启动docker


Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,直接关闭防火墙!

启动docker前,关闭防火墙

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
#查看防火墙状态
systemctl status firewalld

通过命令启动docker:

systemctl start docker # 启动docker服务

systemctl enable docker # 开机自启动docker服务

systemctl stop docker # 停止docker服务

systemctl restart docker # 重启docker服务

systemctl status docker #查看docker服务状态

输入命令,可以查看docker版本:

docker -v

如图:

配置docker镜像加速


docker官方镜像仓库网速较差,需要设置国内镜像服务:

这里使用的是阿里云的镜像加速:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://u6k8tyvq.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker


配置主机和IP地址映射


配置主机名与IP地址映射后,访问服务器上部署的服务就不用在记住IP地址,只需要输入服务器名称即可访问服务,相比记住IP地址访问应用要方便。


修改主机名


查看主机名

uname -n

修改主机名

vim /etc/hostname

node的主机名修改方法同上


修改主机映射


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

vim /etc/hosts

配置结果


修改完成重启测试主机,ping master和node

ping master

ping node


配置时间同步


在Docker Swarm集群中,节点之间的时间同步非常重要。一致性和可靠性是关键原因之一。作为一个分布式的容器编排平台,Docker Swarm需要确保集群中的所有节点具有相同的时间标记,以便保证任务调度、容器通信以及日志和监控等方面的一致性和可靠性。此外,时间同步还对资源调度、容器健康检查和容器网络等方面有重要影响。

在资源调度方面,节点间的时间同步可以帮助Docker Swarm了解彼此的负载情况和容器状态,从而更好地分配资源和协调任务。对于容器健康检查,时间同步确保了检查发生在同一时间段内,从而准确判断容器是否正常运行。而在容器网络方面,时间同步可以保证容器间通信的顺序和一致性,避免由时钟漂移引起的通信问题。

yum install -y chrony

发现centos7已经安装了chrony


Master节点


Master节点修改/etc/chrony.conf文件,注释默认NTP服务器,指定上游公共NTP服务器,并允许其他节点同步时间。

sed -i 's/^server/#&/' /etc/chrony.conf
cat >> /etc/chrony.conf << EOF
local stratum 10
server master iburst
allow all
EOF

Master节点重启chronyd服务并设为开机启动

systemctl enable chronyd && systemctl restart chronyd

开启网络时间同步功能

timedatectl set-ntp true

Node节点


Node节点修改/etc/chrony.conf文件,指定内网 Master节点为上游NTP服务器,重启服务并设为开机启动

sed -i 's/^server/#&/' /etc/chrony.conf

IP为master节点地址

echo server 192.168.43.27 iburst >> /etc/chrony.conf

Node节点重启chronyd服务并设为开机启动

systemctl enable chronyd && systemctl restart chronyd


配置结果


所有节点执行chronyc sources命令,查询结果中如果存在以“^*”开头的行,即说明已经同步成功。

chronyc sources

配置Docker API


所有节点开启Docker API

vim /lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

修改为

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

修改完成

配置再加载

systemctl daemon-reload
systemctl restart docker

下载一些镜像,使用pull命令

docker pull swarm
docker pull httpd
docker pull nginx

默认下载的镜像是最新的:swarm:latest,httpd:latest,nginx:latest


Master结点初始化集群


在Master节点创建Swarm集群

docker swarm init --advertise-addr 192.168.43.27

初始化命令中“--advertise-addr”选项表示管理节点公布它的IP是多少。其它节点必须能通过这个IP找到管理节点

输出结果中包含3个步骤:

  1. Swarm创建成功,swarm-manager成为manager node。
  2. 添加worker node需要执行的命令
  3. 添加manager node需要执行的命令


Node节点加入集群


如果初始化时没有记录下docker swarm init提示的添加worker的完整命令,可以通过命令查看

Master节点执行命令查看

docker swarm join-token worker

在Node节点添加worker node

docker swarm join --token SWMTKN-1-2631moenpx5vwc8qqoksql4axq75z7a9bmexpdt4gecz1cmanj-95ckpxonu5orbk5fddizcspx2 192.168.43.27:2377

添加manger node

docker swarm join --token SWMTKN-1-2631moenpx5vwc8qqoksql4axq75z7a9bmexpdt4gecz1cmanj-4inpqzid9any7ox087obfoys6 192.168.43.27:2377


验证集群


登录Master节点,查看各节点状态

docker node ls


安装Portainer


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


登录Master节点,安装Portainer


通过命令安装 Portainer

docker service create --name portainer --publish published=9000,target=9000 --replicas=1 --constraint 'node.role == manager' --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=volume,src=portainer_data,dst=/data portainer/portainer -H unix:///var/run/docker.sock

可能出现的问题

将之前运行的删除

docker service rm portainer

打开浏览器,输入地址http://192.168.43.27:9000访问Portainer主页

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

进入控制台

接下来要部署服务,Service的容器副本可能会伸缩,甚至失败,会在不同的主机上创建和销毁,这就引出一个问题,如果Service有需要管理的数据,那么这些数据应该如何存放呢?如果把数据打包在容器里,这显然不行,除非数据不会发生变化,否则,如何在多个副本之间保持同步呢?volume是将宿主级的目录映射到容器中,以实现数据持久化。可以用两种方式来实现:


挂载目录


  1. volume默认模式:工作节点宿主机数据同步到容器内。
  2. volume NFS共享存储模式:管理节点宿主同步到工作节点宿主,工作节点宿主同步到容器。

生产环境中一般推荐使用volume NFS共享存储模式。


Master节点


登录Master节点,安装NFS服务端、配置NFS主配置文件、添加权限并启动

yum install nfs-utils -y

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

vim /etc/exports
/root/nginx 192.168.43.27/24(rw,async,insecure,anonuid=1000,anongid=1000,no_root_squash)
/root/httpd 192.168.43.27/24(rw,async,insecure,anonuid=1000,anongid=1000,no_root_squash)

/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用户相同的权限。


创建共享目录

mkdir -p /root/nginx
mkdir -p /root/httpd

添加权限

chmod 777 /root/nginx
chmod 777 /root/httpd

exportfs -rv

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

systemctl start rpcbind
systemctl enable rpcbind

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

systemctl start nfs
systemctl enable nfs

查看NFS是否挂载成功

cat /var/lib/nfs/etab

Node节点


安装NFS客户端并启动服务

yum install nfs-utils -y

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

vim /etc/exports
/root/nginx 192.168.43.27/24(rw,async,insecure,anonuid=1000,anongid=1000,no_root_squash)
/root/httpd 192.168.43.27/24(rw,async,insecure,anonuid=1000,anongid=1000,no_root_squash)

创建共享目录


mkdir -p /root/nginx
mkdir -p /root/httpd

添加权限

chmod 777 /root/nginx
chmod 777 /root/httpd

exportfs -rv

systemctl start rpcbind
systemctl enable rpcbind

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

systemctl start nfs
systemctl enable nfs

部署的服务可能分不到各个节点上,在所有节点创建docker volume

docker volume create --driver local --opt type=nfs --opt o=addr=192.168.43.27,rw --opt device=:/root/nginx nginx_zjq

--opt device=:/root/nginx用于指向共享目录,也可以是共享目录下的子目录

docker volume create --driver local --opt type=nfs --opt o=addr=192.168.43.27,rw --opt device=:/root/httpd httpd_zjq

--opt device=:/root/httpd用于指向共享目录,也可以是共享目录下的子目录

配置结果


查看volume

docker volume ls


查看详细信息

docker volume inspect nginx_zjq

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

docker volume inspect httpd_zjq

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


创建并发布httpd服务


部署一个运行httpd镜像的Service

docker service create --name httpd_web_server --publish 80:80 --mount type=volume,source=httpd_zjq,destination=/usr/local/apache2/htdocs --replicas 2 httpd

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

查看当前Swarm中的Service

docker service ls

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

查看Service每个副本的状态

docker service ps httpd_web_server

可以查看到Service一个副本被分到master,另一个副本被分派到node,当前的状态是Running

使用Winscp将物理机的index.html文件上传到/root/httpd

进入/root/httpd目录

cd /root/httpd

查看文件

ls


创建并发布nginx服务


docker service create --name nginx_web_server --publish 8090:80 --mount type=volume,source=nginx_zjq,destination=/usr/share/nginx/html --replicas 2 nginx

查看当前Swarm中的Service

docker service ls

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

查看Service每个副本的状态

docker service ps nginx_web_server

可以查看到Service一个副本被分到master,另一个副本被分派到node,当前的状态是Running

使用Winscp将物理机的index.html文件上传到/root/nginx

进入/root/nginx目录录

cd /root/nginx

查看文件

ls

调度节点


默认配置下Master也是worker node,所以Master上也运行了副本。如果不希望在Master上运行Service,可以执行如下命令

docker node update --availability drain master


Service伸缩


对于Web服务,通常会运行多个实例。这样可以负载均衡,同时也能提供高可用。

增加Service的副本数

docker service scale nginx_web_server=5

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

docker service ls

docker service ps nginx_web_server

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



也可以减少副本数

docker service scale nginx_web_server=2

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

docker service ls

docker service ps nginx_web_server

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


0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP