(1)了解Docker容器主流的编排技术。
(2)掌握Docker Swarm的部署和基本使用。
(3)掌握Docker Compose的部署和基本使用。
所有节点已配置好主机名和网卡,并安装好docker-ce。
1.部署Swarm集群
(1)配置主机映射
所有节点修改/etc/hosts文件配置主机映射。
[root@master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.51.35master
172.16.51.36 node
(2)配置时间同步
所有节点安装chrony服务。
# yum install -y chrony
Master节点修改/etc/chrony.conf文件,注释默认NTP服务器,指定上游公共NTP服务器,并允许其他节点同步时间。
[root@master ~]# sed -i 's/^server/#&/' /etc/chrony.conf
[root@master ~]# cat >> /etc/chrony.conf << EOF
local stratum 10
server master iburst
allow all
EOF
Master节点重启chronyd服务并设为开机启动,开启网络时间同步功能。
[root@master ~]# systemctl enable chronyd && systemctl restart chronyd
[root@master ~]# timedatectl set-ntp true
Node节点修改/etc/chrony.conf文件,指定内网 Master节点为上游NTP服务器,重启服务并设为开机启动。
[root@node ~]# sed -i 's/^server/#&/' /etc/chrony.conf
[root@node ~]# echo server 172.16.51.35 iburst >> /etc/chrony.conf
//IP为master节点地址
[root@node ~]# systemctl enable chronyd && systemctl restart chronyd
所有节点执行chronyc sources命令,查询结果中如果存在以“^*”开头的行,即说明已经同步成功。
# chronyc sources
(3)配置Docker API
所有节点开启Docker API。
# vi /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
(4)初始化集群
在Master节点创建Swarm集群
初始化命令中“--advertise-addr”选项表示管理节点公布它的IP是多少。其它节点必须能通过这个IP找到管理节点。
输出结果中包含3个步骤:
①Swarm创建成功,swarm-manager成为manager node。
②添加worker node需要执行的命令。
③添加manager node需要执行的命令。
(5)Node节点加入集群
复制前面的docker swarm join命令,在Node节点执行以加入Swarm集群
如果初始化时没有记录下docker swarm init提示的添加worker的完整命令,可以通过docker swarm join-token worker命令查看。
[root@master ~]# docker swarm join-token worker
如果初始化时没有记录下docker swarm init提示的添加worker的完整命令,可以通过docker swarm join-token worker命令查看
(6)验证集群
登录Master节点,查看各节点状态
(7)安装Portainer
Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传和下载镜像、创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型企业对容器管理的全部需求。
登录Master节点,安装Portainer
遇到问题以及解决办法
docker service rm portainer将之前运行的service删除
重新运行service
(8)登录Portainer
打开浏览器,输入地址http://172.16.51.35:9000访问Portainer主页
首次登录时需设置用户名和密码,然后输入设置的用户名和密码进行登录,进入Swarm控制台
2.运行Service
(1)运行Service
部署一个运行httpd镜像的Service
部署Service的命令形式与运行容器的docker run很相似,--name为Service命名,httpd为镜像的名字。
docker service ls命令可以查看当前Swarm中的Service
REPLICAS显示当前副本信息,1/1意思是web_server这个Service期望的容器副本数量为1,目前已经启动的副本数量为1,即当前Service已经部署完成。命令docker service ps可以查看Service每个副本的状态
可以查看到Service唯一的副本被分派到node,当前的状态是Running。
(2)Service伸缩
刚刚部署了只有一个副本的Service,不过对于Web服务,通常会运行多个实例。这样可以负载均衡,同时也能提供高可用。
Swarm要实现这个目标非常简单,增加Service的副本数
副本数增加到5,通过docker service ls和docker service ps命令查看副本的详细信息
5个副本已经分布在Swarm的所有节点上。
可以通过scale up扩容服务,也可以通过scale down减少副本数
(3)访问Service
要访问http服务,首先得保证网络通畅,其次需要知道服务的IP。查看容器的网络配置。
在Master上运行了一个容器,是web_server的一个副本,容器监听了80端口,但并没有映射到Docker Host,所以只能通过容器的IP访问。但是服务并没有暴露给外部网络,只能在Docker主机上访问,外部无法访问。要将Service暴露到外部
--publish-add 8080:80将容器的80映射到主机的8080端口,这样外部网络就能访问到Service了。通过http://172.16.51.35P:8080即可访问Service
(4)Service存储数据
Service的容器副本可能会伸缩,甚至失败,会在不同的主机上创建和销毁,这就引出一个问题,如果Service有需要管理的数据,那么这些数据应该如何存放呢?如果把数据打包在容器里,这显然不行,除非数据不会发生变化,否则,如何在多个副本之间保持同步呢?volume是将宿主级的目录映射到容器中,以实现数据持久化。可以用两种方式来实现:
l volume默认模式:工作节点宿主机数据同步到容器内。
l volume NFS共享存储模式:管理节点宿主同步到工作节点宿主,工作节点宿主同步到容器。
生产环境中一般推荐使用volume NFS共享存储模式。
登录Master节点,安装NFS服务端、配置NFS主配置文件、添加权限并启动
[root@master ~]# yum install nfs-utils -y
添加目录让相应网段可以访问并添加读写权限。
[root@master ~]# vi /etc/exports
/root/share 172.16.51.35/24(rw,async,insecure,anonuid=1000,anongid=1000,no_root_squash)
创建共享目录,添加权限。
/root/share为共享目录,生效配置
开启RPC服务并设置开机自启。
启动NFS服务并设置开机自启
查看NFS是否挂载成功。
登录Node节点,安装NFS客户端并启动服务。
[root@node ~]# yum install nfs-utils -y
[root@node ~]# systemctl start rpcbind
[root@node ~]# systemctl enable rpcbind
[root@node ~]# systemctl start nfs
[root@node ~]# systemctl enable nfs
部署的服务可能分不到各个节点上,在所有节点创建docker volume
[root@master ~]#docker volume create --driver local --opt type=nfs --opt o=addr=172.16.51.35
,rw --opt device=:/root/share foo33
--opt device=:/root/share用于指向共享目录,也可以是共享目录下的子目录。
查看volume。
可以查看到docker volume列表中有foo33,查看volume详细信息
可以看出NFS的/root/share被挂载到了/var/lib/docker/volumes/foo33/_data目录。
创建并发布服务
查看服务分布的节点。
在Master节点/root/share目录中生成一个index.html文件。
查看宿主机目录挂载情况。
查看容器目录。
(5)调度节点
默认配置下Master也是worker node,所以Master上也运行了副本。如果不希望在Master上运行Service,可以执行如下命令
通过 docker node ls 命令查看各节点现在的状态。
使用docker service ps命令来查看