2016 年 2 月下旬,Docker 发布了企业级容器管理和服务部署的整体解决方案平台-Docker Datacenter,简称 DDC。DDC 有三个组件构成:
1. Docker Universal Control Plane(Docker UCP),这是套图形化管理界面;
2. Docker Trusted Registry(DTR),授信的 Docker 镜像仓库;
3. Docker Engine 商业版,提供技术支持的 Docker 引擎。
DDC 在 Docker 官网地址是:
DDC 与 Docker 公司的另外一个在线产品 Docker Cloud 对应。不过 DDC 主要针对企业用户在内部部署。用户注册自己的 Dokcer 镜像到 DTR,UCP 管理整个 Docker 集群。并且这两个组件都提供了 web 界面。
使用 DDC 需要购买 Licence, 但是 Docker 公司提供了一个月的试用 Licence,可以在 Docker 官网注册后直接下载。
说了这么多,到底如何部署 DDC 的环境呢?有一个简单的方式,就是使用阿里云的 ROS。通过下面的链接一键部署,就可以做到分分钟创建一套 DDC。
点击一键部署后,默认会在华北 2 region 部署 DDC。 如果你需要调整 region,请点击页面右下角的【上一步】,然后重新选择 region,接着点击【下一步】,你只需要填入如下图中必填的信息或者根据你的需求调整信息后,点击【创建】按钮就可以部署一套 DDC。
当 ROS 创建 DDC 成功后,怎么登录 UCP 系统,可以进入 ROS 的栈管理页面,查看刚才创建的栈的概要信息,这里面输出了登录 UCP 和 DTR 的地址,如图:
在浏览器中输入红框中的地址就会显示 UCP 的访问页面,这时输入在安装 UCP 时创建的管理账号和密码就可以登录进去,接着会提示输入导入 Licence 文件,请把准备好的 Licence 导入,就可以进入 UCP 的控制界面了:
接下来将主要介绍如何通过阿里云的 ROS 一键部署 DDC 环境。
在上面的基础架构图里面,Controller 主要运行 UCP 组件,DTR 运行的就是 DTR 组件, Worker 主要运行客户自己的 Docker 服务。整个 DDC 环境都部署在 VPC 网络之下,所有的 ECS 加入同一个安全组。每个组件都提供了一个 SLB,供外网访问。而运维操作则是通过跳板机实现。另一方面为了提升可用性,整个 DDC 环境都是高可用部署,也就是说 Controller 至少有两台,同理 DTR 也至少有两台。
下面详细介绍如何通过 ROS 模板创建阿里云资源并通过 ROS 的 UserData 功能部署 DDC 环境。
按照上面的架构图,所有节点都在 VPC 网络中,所以首先使用 ROS 的, 资源创建 DDC 的 VPC 网络。VPC 网络和外网是相互隔离的,由于 DDC 环境的部署需要在线安装 Docker Engine,UCP,DTR,所以我们需要配置 VPC 网络环境使内部节点能够访问外网,同时运维也能访问到 VPC 中节点。VPC 网络的配置只需要用到, , 和这四个资源来搞定。并且在 VPC 网络中提供一台跳板机通过对外暴露 22 端口。详细的 VPC 网络配置大家可以参考这篇文章《》。
由于所有的节点都在一个 VPC 网络中,所以只需要创建一个安全组,把所有的机器加入,开放所需端口,在这里如规则开放了 22,80,443,2377 端口,出规则全部开放。安全组的创建以及所有的配置只需使用资源即可。
部署需要的资源
UCP 组件会在至少两台机器上运行,以便提供高可用,一台是 master 节点,一台是 slave。同时它们挂载到一个 SLB,用户通过 SLB 的公网 IP 访问 UCP Web。SLB 监听 80,443 和 2377 端口。由于 master 节点需要生成其他节点加入 DDC 时的 token,所以 ROS 会首先创建一个 master ECS 并且使用 UserData 在 master ECS 启动的时候部署安装 UCP 组件,然后生成所需 token 并记录 token 信息。接着再创建多个 slave 节点,使用 UserData 给 slave 节点部署 UCP 组件,并加入 DDC 环境,和 master 组成高可用 UCP 应用。ROS 使用了创建 master 节点;使用创建多个 slave 节点;并通过这两个和来监控 UserData 的执行情况和获取执行结果
当 UCP 节点创建完成后,都会挂载到 SLB,创建,配置 SLB 以及挂载所有的 UCP 节点使用了这三个资源:
, 创建 SLB 实例, 配置 SLB 监听那些端口,
把 UCP 节点加入到 SLB 监听列表中。
部署安装 UCP 的 UserData 脚本主要命令
首先设置 Docker 软件包秘钥
- curl -s 'https://sks-keyservers.net/pks/lookup?op=get&search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e' | apt-key add --import
添加阿里云的 Docker 源能够确保成功拉取 Docker Engine 安装包
- echo 'deb https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/apt/repo ubuntu-trusty main' | tee /etc/apt/sources.list.d/docker.list
安装 Docker
- curl -sSL https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/install.sh | sh
配置拉取 UCP 镜像的 Mirror
- echo DOCKER_OPTS='--registry-mirror https://6udu7vtl.mirror.aliyuncs.com' > /etc/default/docker
安装 UCP,这个命令只需在 master 节点执行
- docker run --rm -v /var/run/docker.sock:/var/run/docker.sock --name ucp docker/ucp install --debug --host-address $ip_addr --admin-username $ucp_admin_username --admin-password $ucp_admin_password --san $ip_addr --san $controller_slb_ip
UCP install 的参数解释:
根据生成 token,-q 参数控制生成 manager 或 worker 类型的 token
- docker swarm join-token -q manager
如果是 slave 节点,则安装 UCP 的命令只需替换成下面的命令即可
- docker swarm join --token=$token ${ucp_controller_ip}:2377
- token 就是Master节点生成的token
- ucp_controller_ip 是安装master节点是指定的 --host-address
详细 ROS 模板的 UCP 节点资源定义
- "Controller": {
- "DependsOn": "SNatEntry",
- "Properties": {
- "AllocatePublicIP": "false",
- "ImageId": {
- "Ref": "ControllerImageId"
- },
- "InstanceType": {
- "Ref": "ControllerInstanceType"
- },
- "IoOptimized": {
- "Ref": "ControllerIoOptimized"
- },
- "Password": {
- "Ref": "InstancePassword"
- },
- "SecurityGroupId": {
- "Fn::GetAtt": [
- "DefaultSecurityGroup",
- "SecurityGroupId"
- ]
- },
- "SystemDiskCategory": {
- "Ref": "ControllerSystemDiskCategory"
- },
- "UserData": {
- "Fn::Replace": [
- {
- "ros-notify": {
- "Fn::GetAtt": [
- "ControllerConditionHandle",
- "CurlCli"
- ]
- }
- },
- {
- "Fn::Join": [
- "",
- [
- "#!/bin/sh\n",
- "ucp_admin_username='",
- {
- "Ref": "UCPAdminUserName"
- },
- "'\n",
- "ucp_admin_password='",
- {
- "Ref": "UCPAdminPassword"
- },
- "'\n",
- "controller_slb_ip='",
- {
- "Fn::GetAtt": ["ControllerLoadBalancer", "IpAddress"]
- },
- "'\n",
- "ip_addr=`ifconfig eth0 | awk '/inet addr:/{print $2}' | tr -d 'addr:'`\n",
- "host_name=`hostname`\n",
- "sed -i 's/Acquire::http::Proxy/#Acquire::http::Proxy/' /etc/apt/apt.conf\n",
- "apt-get update\n",
- "apt-get install -y apt-transport-https\n",
- "apt-get install -y linux-image-extra-virtual\n",
- "apt-get install -y curl\n",
- "apt-get install -y unzip\n",
- "apt-get install -y jq\n",
- "curl -s 'https://sks-keyservers.net/pks/lookup?op=get&search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e' | apt-key add --import\n",
- "echo 'deb https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/apt/repo ubuntu-trusty main' | tee /etc/apt/sources.list.d/docker.list\n",
- "# Installing Docker\n",
- "curl -sSL https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/install.sh | sh\n",
- "echo DOCKER_OPTS=\"'--registry-mirror https://6udu7vtl.mirror.aliyuncs.com'\" > /etc/default/docker\n",
- "sudo service docker restart\n",
- "usermod -aG docker $USER\n",
- "docker run --rm -v /var/run/docker.sock:/var/run/docker.sock --name ucp docker/ucp install --debug --host-address $ip_addr --admin-username $ucp_admin_username --admin-password $ucp_admin_password --san $ip_addr --san $controller_slb_ip\n",
- "worker_token=`docker swarm join-token -q worker`\n",
- "manager_token=`docker swarm join-token -q manager`\n",
- "echo $worker_token, $manager_token > /tmp/tokens\n",
- "cmd=\"ros-notify -d '{\\\"id\\\" : \\\"tokens\\\", \\\"data\\\" : [\\\"$worker_token\\\", \\\"$manager_token\\\"]}'\"\n",
- "eval $cmd\n"
- ]
- ]
- }
- ]
- },
- "VSwitchId": {
- "Ref": "PubSubnet"
- },
- "VpcId": {
- "Ref": "Vpc"
- }
- },
- "Type": "ALIYUN::ECS::Instance"
- }
DTR 和 UCP 组件一样也是高可用部署,但是 DTR 没有 master 和 slave 节点之分,ROS 可以直接使用一次创建多台 DTR 节点,当 DTR 节点启动时,执行 UserData 脚本部署 DTR 应用。同时所有的 DTR 节点挂载自己独立的 SLB,SLB 监听 443,用户通过使用 SLB 的公网 IP 直接访问 DTR Web 页面。
DTR 的安装和 UCP 的类似,只需要把安装 UCP 的命令换成下面这两个命令即可:
首先要加入 DDC 和 UCP slave 节点的命令一样
- docker swarm join--token = $token $ {
- ucp_controller_ip
- }: 2377
安装 DTR
- docker run --rm -i docker/dtr install --debug --ucp-url https://$controller_slb_ip:443 --ucp-node $host_name --dtr-external-url https://$dtr_slb_ip:443 --ucp-username $ucp_admin_username --ucp-password $ucp_admin_password --ucp-insecure-tls | tee -a /tmp/dtr_install_log,
DTR install 的参数:
详细 ROS 模板的 DTR 资源定义
- "DTRNode": {
- "DependsOn": "Controller",
- "Properties": {
- "AllocatePublicIP": "false",
- "ImageId": {
- "Ref": "DTRImageId"
- },
- "InstanceType": {
- "Ref": "DTRInstanceType"
- },
- "IoOptimized": {
- "Ref": "DTRIoOptimized"
- },
- "MaxAmount": {
- "Ref" : "DTRMaxAmount"
- },
- "MinAmount": {
- "Ref" : "DTRMaxAmount"
- },
- "Password": {
- "Ref": "InstancePassword"
- },
- "SecurityGroupId": {
- "Fn::GetAtt": [
- "DefaultSecurityGroup",
- "SecurityGroupId"
- ]
- },
- "SystemDiskCategory": {
- "Ref": "DTRSystemDiskCategory"
- },
- "VSwitchId": {
- "Ref": "PubSubnet"
- },
- "VpcId": {
- "Ref": "Vpc"
- },
- "UserData": {
- "Fn::Replace": [
- {
- "ros-notify": {
- "Fn::GetAtt": [
- "DTRConditionHandle",
- "CurlCli"
- ]
- }
- },
- {
- "Fn::Join": [
- "",
- [
- "#!/bin/sh\n",
- "ucp_admin_username='",
- {
- "Ref": "UCPAdminUserName"
- },
- "'\n",
- "ucp_admin_password='",
- {
- "Ref": "UCPAdminPassword"
- },
- "'\n",
- "tokens='",
- {
- "Fn::GetAtt": [
- "ControllerWaitCondition",
- "Data"
- ]
- },
- "'\n",
- "ucp_controller_ip='",
- {
- "Fn::GetAtt": [
- "Controller",
- "PrivateIp"
- ]
- },
- "'\n",
- "controller_slb_ip='",
- {
- "Fn::GetAtt": ["ControllerLoadBalancer", "IpAddress"]
- },
- "'\n",
- "dtr_slb_ip='",
- {
- "Fn::GetAtt": ["DTRLoadBalancer", "IpAddress"]
- },
- "'\n",
- "ip_addr=`ifconfig eth0 | awk '/inet addr:/{print $2}' | tr -d 'addr:'`\n",
- "host_name=`hostname`\n",
- "sed -i 's/Acquire::http::Proxy/#Acquire::http::Proxy/' /etc/apt/apt.conf\n",
- "apt-get update\n",
- "apt-get install -y apt-transport-https\n",
- "apt-get install -y linux-image-extra-virtual\n",
- "apt-get install -y curl\n",
- "apt-get install -y unzip\n",
- "apt-get install -y jq\n",
- "curl -s 'https://sks-keyservers.net/pks/lookup?op=get&search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e' | apt-key add --import\n",
- "echo 'deb https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/apt/repo ubuntu-trusty main' | tee /etc/apt/sources.list.d/docker.list\n",
- "# Installing Docker\n",
- "curl -sSL https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/install.sh | sh\n",
- "echo DOCKER_OPTS=\"'--registry-mirror https://6udu7vtl.mirror.aliyuncs.com'\" > /etc/default/docker\n",
- "service docker restart\n",
- "usermod -aG docker $USER\n",
- "echo $tokens > /tmp/tokens\n",
- "token=`echo \"$tokens\" | jq '.tokens'[0] | xargs echo `\n",
- "echo $token > /tmp/worker_token \n",
- "docker swarm join --token=$token ${ucp_controller_ip}:2377\n",
- "sleep 300\n",
- "docker run --rm -i docker/dtr install --debug --ucp-url https://$controller_slb_ip:443 --ucp-node $host_name --dtr-external-url https://$dtr_slb_ip:443 --ucp-username $ucp_admin_username --ucp-password $ucp_admin_password --ucp-insecure-tls | tee -a /tmp/dtr_install_log\n",
- "echo $token > /tmp/fin_worker_token\n",
- "cmd=\"ros-notify -d '{\\\"data\\\" : \\\"$token\\\"}'\"\n",
- "eval $cmd\n"
- ]
- ]
- }
- ]
- }
- },
- "Type": "ALIYUN::ECS::InstanceGroup"
- }
Worker 节点是正真部署用户自己应用的节点,这些节点只需要安装 Docker Engine 然后加入 DDC 即可。Worker 节点也都是部署在 VPC 网络,外部访问同样也需要使用 SLB,在这里 SLB 之监听了 80 端口,大家后续部署的时候可以通过修改 ROS 模板自己添加需要监听的端口。同 DTR 一样,ROS 使用一次创建多个节点,并用 UserData 安装 Docker engine 和加入 DDC。
部署 Worker 节点使用的命令和部署 UCP 的 slave 节点一样,只不过使用的 Token 不同,Worker 节点使用的是 worker 类型的 token。
详细 ROS 模板的 Worker 资源定义
- "UCPNode": {
- "DependsOn": "Controller",
- "Properties": {
- "AllocatePublicIP": "false",
- "ImageId": {
- "Ref": "UCPImageId"
- },
- "InstanceType": {
- "Ref": "UCPInstanceType"
- },
- "IoOptimized": {
- "Ref": "UCPIoOptimized"
- },
- "MaxAmount": {
- "Ref": "UCPMaxAmount"
- },
- "MinAmount": {
- "Ref": "UCPMaxAmount"
- },
- "Password": {
- "Ref": "InstancePassword"
- },
- "SecurityGroupId": {
- "Fn::GetAtt": [
- "DefaultSecurityGroup",
- "SecurityGroupId"
- ]
- },
- "SystemDiskCategory": {
- "Ref": "UCPSystemDiskCategory"
- },
- "UserData": {
- "Fn::Replace": [
- {
- "ros-notify": {
- "Fn::GetAtt": [
- "UCPConditionHandle",
- "CurlCli"
- ]
- }
- },
- {
- "Fn::Join": [
- "",
- [
- "#!/bin/sh\n",
- "tokens='",
- {
- "Fn::GetAtt": [
- "ControllerWaitCondition",
- "Data"
- ]
- },
- "'\n",
- "ucp_controller_ip='",
- {
- "Fn::GetAtt": [
- "Controller",
- "PrivateIp"
- ]
- },
- "'\n",
- "ip_addr=`ifconfig eth0 | awk '/inet addr:/{print $2}' | tr -d 'addr:'`\n",
- "host_name=`hostname`\n",
- "sed -i 's/Acquire::http::Proxy/#Acquire::http::Proxy/' /etc/apt/apt.conf\n",
- "apt-get update\n",
- "apt-get install -y apt-transport-https\n",
- "apt-get install -y linux-image-extra-virtual\n",
- "apt-get install -y curl\n",
- "apt-get install -y unzip\n",
- "apt-get install -y jq\n",
- "curl -s 'https://sks-keyservers.net/pks/lookup?op=get&search=0xee6d536cf7dc86e2d7d56f59a178ac6c6238f52e' | apt-key add --import\n",
- "echo 'deb https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/apt/repo ubuntu-trusty main' | tee /etc/apt/sources.list.d/docker.list\n",
- "# Installing Docker\n",
- "curl -sSL https://acs-upload.oss-cn-qingdao.aliyuncs.com/1.12/install.sh | sh\n",
- "echo DOCKER_OPTS=\"'--registry-mirror https://6udu7vtl.mirror.aliyuncs.com'\" > /etc/default/docker\n",
- "service docker restart\n",
- "usermod -aG docker $USER\n",
- "echo $tokens > /tmp/tokens\n",
- "token=`echo \"$tokens\" | jq '.tokens'[0] | xargs echo `\n",
- "echo $token > /tmp/worker_token \n",
- "cmd=\"ros-notify -d '{\\\"data\\\" : \\\"$token\\\"}'\"\n",
- "eval $cmd\n",
- "docker swarm join --token=$token ${ucp_controller_ip}:2377\n",
- "echo $token > /tmp/fin_worker_token\n"
- ]
- ]
- }
- ]
- },
- "VSwitchId": {
- "Ref": "PubSubnet"
- },
- "VpcId": {
- "Ref": "Vpc"
- }
- },
- "Type": "ALIYUN::ECS::InstanceGroup"
- }
大规模手工部署一个高可用的 DDC 环境还是有一定的复杂度,利用本文中提供的 ROS 模板,可以非常方便的帮你一键部署 DDC 环境,让你把更多的精力放在自己的业务上。
来源: