一、企业版工具-简介

企业需要Docker能实现私有化部署。这通常意味着Docker需要一个本地化部署方案,并且由企业自己掌控和维护。这还意味着角色和安全功能需要满足企业内部的组织结构,并且在安全部门的监管之下。同时还需要一份重要的售后支持协议。

Docker EE是企业版的Docker。其内部包括了上百个引擎、操作界面以及私有安全注册。用户可以本地化部署,并且其中包括了一份支持协议。

Docker EE上层架构

二、企业版工具-详解

2.1 Docker EE引擎

Docker引擎提供Docker全部核心功能。核心功能包括镜像、容器管理、网络、卷、集群、安全等。目前包括两个版本:社区版(CE)和企业版(EE)。

2.2 Docker通用控制平面(UCP)

UCP是企业级的容器即服务平台的图形化操作界面。UCP使用Docker引擎,并添加了各种企业喜欢以及需要的功能。例如RBAC、可配置、认证、高可用控制平面以及简单界面。在UCP内部,是一个容器化的微服务应用,以多个容器的形式运行。

架构层面上讲,UCP是基于Swarm模式下的Docker EE构建的。如下图所示,UCP控制平面运行在Swarm管理节点上,应用则部署在Swarm工作节点上。

2.2.1 规划UCP安装

在规划UCP安装的时候,合理设置集群大小和规格十分重要。下面介绍该过程需要考虑的一些方面。

1、集群中全部节点的时钟需要同步(例如NTP)。如果没有同步,可能导致一些很难定位的问题。全部节点都要有自己的静态IP地址和固定的DNS名称。 2、全部节点都要有自己的静态IP地址和固定的DNS名称 3、默认情况下,UCP管理节点不运行用户工作负载。推荐使用这种最佳实践,并建议用户在生产环境中强制使用。该方式使得管理节点只需关注控制平面职责。同时也能简化问题定位。 4、用户需要保证管理节点数量为奇数。这样就能避免出现脑裂等类似场景时,会导致管理节点不可用,或者与集群割裂的现象。理想数量为3、5或者7,3或者5是较常用的。多于7的话,可能导致后台Raft算法或者集群一致性的问题。如果不能提供3个管理节点,1个要好于2个! 5、如果配置了后台计划(用户应当配置)并进行日常备份,可能需要部署5个管理节点。这是因为Swarm和UCP的备份操作需要停止Docker和UCP服务。5个管理节点可以保证在执行类似操作时集群的弹性。 6、工作节点的数量可以根据需求设置,因为它们并不会参与到集群Raft操作当中,所以就不会影响控制平面操作。 7、节点推荐配置 (1)运行DTR的UCP管理节点:8GB RAM,4核CPU,100GB磁盘。 (2)UCP工作节点:4GB RAM, 25-100GB空闲磁盘空间。

2.2.2 安装Docker UCP

下面主要介绍在新集群的第一个管理节点上安装Docker UCP的完整过程。 1、在某个Linux Docker EE节点上运行下面的命令,该节点应是计划中作为UCP集群的第一个管理节点。

$ docker container run --rm -it --name ucp -v /var/run/docker.sock:/var/run/docker.sock docker/ucp:2.2.5 install --host-address <node-ip-address> --interactive

2、配置管理员账号。安装过程会提示用户输入用户名和密码,作为UCP管理员账号。这是一个本地账号,建议遵守公司规范来创建用户名和密码。创建后千万不要忘记。 3、主体别名(Subject Alternative Name,SAN)。安装程序会提示输入能访问UCP的IP地址和名称列表。列表内容可以是私有IP地址以及DNS名称,并且会加入到账号当中。

2.2.3 UCP的访问控制

所有对UCP的访问,都经由身份管理子系统。这意味着用户在集群上执行任何操作前,首先需要通过用户名和密码进行认证。这些操作包括集群的管理,以及服务的部署和管理。

用户使用UI界面的时候已经体验过了,必须使用用户名和密码才能登录。在CLI中也是一样的,用户不能在未登录的情况下通过UCP执行命令!这是因为UCP集群中本地Docker Socket受到ucp-proxy服务的保护,不会接受未认证命令。

2.2.4 客户端绑定

每个运行Docker CLI的节点,都能部署并管理UCP集群的工作负载,只要该节点存在一个有效UCP用户认证。

本节中会创建一个新UCP用户,新建并下载该用户的绑定证书,接着创建一个Docker客户端并使用该证书。在完成上述步骤后,会解释其工作原理。 1、如果还没就绪,则以管理员身份登录UCP。 2、单击User Management>Users,创建一个新用户。因为还未讨论角色和权限相关的内容,所以将用户设置为Docker EE管理员。 3、在新用户选中状态下,单击Configure下拉框,然后选择Client Bundle 4、单击Client Bundle+链接,生成并下载该用户的客户端Bundle. 5、复制下载内容到Docker客户端,该客户端是用户配置用于管理UCP的。 6、登录客户端节点,执行下面的全部命令。 7、解压缩客户端绑定内容。 8、使用恰当的脚本配置Docker客户端。env.sh可以在Linux和Mac上使用,env.ps和env.cmd可以在Windows上使用。 9、测试权限。

2.2.5 UCP备份

一个UCP集群主要由3个部分构成,也是需要分别备份的内容:Swarm、UCP和Docker可信镜像仓库服务(DTR)。

虽然UCP位于Swarm上层,但是它们是互相独立的。Swarm维护了全部节点关系、网络以及服务定义。UCP在其上层构建,维护自己的数据库和卷存储来记录用户、组、授权、Bundle、许可证文件、认证等信息。

Swarm配置和状态保存在/var/lib/docker/swarm中,其中包含了Raft日志密钥,并且会复制到每个管理节点。Swarm备份就是复制该目录下的所有文件。

因为该信息会复制到每个管理节点,所以用户可以在任何管理节点上进行备份。

执行备份时最好选择在业务的低峰期进行,虽然对于拥有多管理节点的Swarm来说,停止某个管理节点并不会出现问题,但这种操作还是会增加集群在另一管理节点宕机时出现高可用有效节点数不足的情况。 2.2.5.1 Swarm备份

1、停止待备份Swarm管理节点上的Docker。这样会停止该节点上的全部UCP容器。如果UCP配置了HA,则其他管理节点会保证控制平面处于可用状态。

$ service docker stop

2、备份Swarm配置。示例使用Linux tar工具来执行文件复制。可随意选择其他工具。

$ tar -czvf swarm. bkp /var/lib/docker/swarm/

3、确认备份文件存在。其中备份文件的保存周期需要视公司具体的备份策略而定。

$ls -l 
-rw-r--r--  1 root root 450727 Jan 29 14:06 swarm. bkp

4、重启Docker.

$ service docker restart

2.2.5.2 UCP备份 因为UCP备份任务以容器方式运行,所以如果想进行备份,需要Docker保持运行状态。

对UCP进行备份会停止所在管理节点上的全部UCP容器。在该前提下,备份操作需要运行在一个高可用UCP集群上,并且最好是在业务低峰期运行。 1、在某个UCP管理节点上执行下面的命令

$ docker container run --log-driver none --rm -it --name ucp \
-v /var/run/docker.sock:/var/run/docker.sock \
docker/ucp:2.2.5 backup --interactive   \   
 --passphrase "Password123"> ucp.bkp

针对上面命令描述如下: (1)docker container run --log-driver none --rm -i --name ucp 表示docker启动容器,运行时不开启日志,在运行时不开启日志,在运行结束后进行删除,同时调用ucp (2)-v /var/run/docker.sock:/var/run/docker.sock表示docker.socket挂载到容器中,这样容器可以通过访问Docker API来停止运行 (3)docker/ucp:2.2.5 backup --interactive表示告诉Docker在容器内基于docker/ucp:2.2.5镜像运行backup --interactive命令 (4) --passphrase "Password123"> ucp.bkp表示创建了名为ucp.bkp的加密文件,并且用密码进行安全保护。

2.2.6 恢复UCP

在介绍恢复UCP之前,有句话不得不提前说明:从备份进行恢复是最后的手段,只能在整个集群都宕机或者全部管理节点都丢失的情况下使用!

如果HA集群下仅丢失某个管理节点,并不需要从备份进行恢复。该情况下,很容易就能创建新管理节点并加入集群。

下面会先介绍如何从备份恢复Swarm,然后是UCP。 2.2.6.1 恢复Swarm 在欲恢复的Swarm管理节点上执行下面的任务。 1、停止docker

$ service docker stop

2、删除全部已存在的Swarm配置。

$ rm -r /var/lib/docker/swarm

3、从Swarm备份中恢复配置信息。 示例中使用了名为swarm.bkp的压缩文件,格式为tar。该命令需要指定恢复到根目录下,因为备份文件解压为原始文件的操作中会包含全路径信息。

$ tar -zxvf swarm.bkp -C /

4、初始化新的Swarm集群。 切记,当前执行的操作并不是恢复某个节点然后重新加入集群。该操作是恢复一个不可用的Swarm集群,其中不包含任何存活的管理节点。--force-new-cluster参数告诉Docker创建新集群,使用的配置保存在当前节点/var/lib/docker/swarm目录下。

$ docker swarm init --force-new-cluster

5、检查网络和服务

#检查网络
$ docker network ls

#检查服务
$ docker service ls

6、为Swarm集群增加新的管理节点和工作节点,并刷新备份。

2.2.6.2 恢复UCP 1、删除已经存在并且可能崩溃的UCP安装。

$ docker container run --log-driver none --rm -it --name ucp \
-v /var/run/docker.sock:/var/run/docker.sock \
docker/ucp:2.2.5 uninstal1-ucp --interactive

2、从备份中恢复UCP

$ docker container run --rm -i --name ucp \
-v /var/run/docker.sock:/var/run/docker.sock \
docker/ucp:2.2.5 restore --passphrase "Password123" < ucp.bkp

3、登录UCP Web界面,确认之前创建的用户还存在(或者是任何之前环境中存在的UCP对象)。

2.3 Docker可信镜像仓库服务(DTR)

Docker可信镜像仓库服务,是安全、高可用并且支持本地部署的Docker服务,通常使用DTR代指。如果知道Docker Hub是什么,可以将DTR理解为私有的Docker Hub,可以在本地部署,并且自行管理。

2.3.1 安装DTR

为了完成下面步骤,需要一个用于安装DTR的UCP节点和一个监听443端口的负载均衡,并处于TCP透传模式,同时在443端口开启了7health健康检查。下图展示了完整架构图。 1、登录UCP Web界面,单击Admin>Admin Settings>Docker Trusted Registry。 2、填写DTR配置表 (1)DTR外部URL(DTR EXTERNAL URL):设置外部负载均衡器的URL. (2)UCP节点(UCPNODE):选择希望安装DTR的节点名称。 (3)禁用UCP的TLS认证(Disable TLS Verification For UCP):如果使用自签名证书,勾选该复选框。 3、复制表格底部的长命令。 4、将命令粘贴到UCP管理节点。命令中包含--ucp-node,告诉UCP需要执行该命令的具体节点。