应该如何使用阿里云?高级篇-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

应该如何使用阿里云?高级篇

rippletek 2014-11-11 22:09:51 22747

前情提要
基础篇进阶篇 中,我们先介绍了ECS, SLB, RDS, OCS等基础云计算工具,并给出了一个简单的高可用的业务网站的系统模型,然后我们通过分析几个具体的更复杂的多业务系统架构,总结了一些使用阿里云计算平台的一些基本原则。
概述
在本篇中,我们将讨论在保证系统可用性的基础上,如何快速扩容,如何提升计算资源的利用率的高级技巧。
这些技巧主要是依靠一种名为Docker的服务容器实现的。RippleTek的大部分线上业务,也是运行于Docker之中。Docker将是我们讨论的一大重点。
再探ECS

经测试,Ubuntu 14.04 64-bit可以稳定运行docker v1.3。CentOS 6.5 64-bit只能运行docker v1.1并且内核会报aufs相关的很多错误信息,无法正常使用。虽然没有逐个测试所有的Linux Distribution, 但我们推荐在Ubuntu 14.04 64-bit上使用docker. 对于一个全新的ubuntu 64-bit系统,用下面几行命令就可以安装好docker:
# apt-get update
# apt-get -y install curl
# curl -sSL https://get.docker.com/ubuntu/ | sh
为了保证系统安全,请单独再创建一个用户来运行docker,在这里我们把这个用户称为docker_user
# adduser docker_user
# passwd -d docker_user #use authorized_key only
# usermod -a -G docker docker_user #add docker_user to docker group

下面以一个运行于CentOS系统上的网站为例,描述它的docker化过程:
docker安装完毕后,就切换到docker_user用户,pull一个Cent OS的image下来
$ docker pull registry.mirrors.aliyuncs.com/library/centos
运行这个docker image就相当于启动了一个CentOS的虚拟机:
$ docker run -t -i registry.mirrors.aliyuncs.com/library/centos /bin/bash
下面我们利用新开的这个docker的root shell打通ssh接入:

# /usr/sbin/sshd-keygen
# vi /bin/init_docker.sh
init_docker.sh的内容:
#!/bin/sh
/usr/sbin/sshd -D
# chmod +x /bin/init_docker.sh
# adduser docker_user  #增加一个同名user,同时,要注意它的uid也需与前面在ecs shell中创建的docker_user一致 (使用id命令确认)
# #切换至docker_user, 并加入你的key至~/.ssh/authorized_keys以完成ssh认证
# #为了便于后面安装环境,在/etc/sudoer文件中将docker_user配置为无密码sudo
在ecs中shell中提交这个container以保存当前的docker image.
$ docker ps #查看container id
$ docker commit <container id> my_centos
然后我们就可以退出docker shell了。回到ecs shell,这时,docker ps发现刚才的那个docker已经不见了。那是因为它是用interactive mode启动的,shell退出后,它就stop了。可以用docker ps -a命令找出它的container id, 然后docker rm <container id>删除之。接下来,我们利用刚刚保存的image启动一个可以ssh接入的docker:
docker run -p 20022:22 -d -u root my_centos /bin/init_docker.sh由于在启动命令行里指定一个host:20022 -> docker:22的端口映射,我们用ssh连接ECS的20022端口就能登陆进入docker了:
ssh -p20022 docker_user@ecs登入后下载并运行阿里云的LAMP一键安装脚本,搭建好网站的运行环境。通过scp部署网站代码。于是,我们的网站就在docker里运行起来了。下面问题来了:
1)docker是一个在192.168网段的内网VM,我们怎么把服务开出去?
2)折腾了这么半天,这个docker做的事情和我们没有用docker之前的ecs完全一样,都是提供一个网站服务,这到底有什么意义?

三探SLB
要解决问题1), 我们需要我们的老朋友SLB, SLB除了能负载均衡外,还有个很重要的功能 - 端口映射 (SLB前后端的端口号可以是不一样的!)。docker自身带端口映射,可以把docker中的服务端口映射到ecs的端口上,再通过SLB的端口二次映射就把服务开出去了。图示如下:
[attachment=65398]

说明如下:

  1. 由于我们的docker_user不具有root权限,所以只能映射在ecs的高端口上,上图给出的例子中使用的是20080端口
  2. SLB转发只使用内网IP,所以我们在启动docker就只把docker的服务端口(例子中为http端口80)映射在内网IP(docker run -p参数中指定)
  3. SLB配置为80->20080的映射。这样,最终向42.x.x.x这个公网SLB发起的http请求经SLB转发至10.169.1.100的20080端口,再经docker进程的端口映射来到docker1的web服务器中


计算节点
前面我们介绍的计算模型中,都是将ecs作为单个计算节点来使用的。把服务docker化的意义在于可以快速方便的在一个ecs节点上运行多个服务,即将以前的单个计算节点拓展为多个计算节点。这是 快速扩容和提升计算资源利用率的关键所在。docker化的服务资源前后对比图示:
docker化前:
[attachment=65485]






docker化后:

[attachment=65486]

将服务docker化后,我们可以很容易的在一个ecs节点上运行多个docker节点,于是,可以使用较少的ecs承载同等数量的业务并且消除单点。

节点复制

docker化前: 通过自定义磁盘镜像将一个ECS的系统盘快速复制到一个新的ECS上,需要重启ECS才能使用
docker化后: 从自己的private docker images repo中pull一个线上服务的镜像然后跑起来即可。可以通过一个自己编写的脚本一键秒起。
结语
我们在阿里云平台的使用经验分享至此就告一段落了。感谢大家这两个多月的持续关注和支持。这个系列帖子今后还会不断更新,结合阿里云的最新动态把我们总结出的best practice分享出来。同时,也希望各位如果发现帖子中有任何bug,能通过回复给我们提出来,让我们一起持续改进这个系列吧。
这一年多以来,我感到基于云计算平台的服务架构和以往传统的IDC托管服务相比,是两个完完全全不同的游戏。有很多以前很多不能想象或是不可能实现的事,现在都能轻松愉快的以很低的成本实现。云计算使得硬件和软件之间的界限,从来没有像今天这么模糊过,计算资源获取的便捷和计算的自由度亦到达了一个前所未有的高度。


弹性计算 Ubuntu 关系型数据库 Linux Shell 网络安全 云计算 Docker 容器 RDS
分享到
取消 提交回答
全部回答(18)
  • 博華电脑
    2015-04-19 23:06:47
    Re应该如何使用阿里云?高级篇
    看不懂了。,mark
    0 0
  • hongboict
    2015-04-07 17:10:07
    Re应该如何使用阿里云?高级篇
    学习了...
    0 0
  • RitterL
    2015-04-06 16:26:55
    Re应该如何使用阿里云?高级篇
    好文要顶啊。。。
    0 0
  • 高健
    2015-03-05 12:19:44
    回楼主rippletek的帖子
    只喜欢win2003系统
    0 0
  • 剧本小孩
    2015-02-28 11:26:55
    Re应该如何使用阿里云?高级篇
    0 0
滑动查看更多
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题