前情提要
在基础篇 和进阶篇 中,我们先介绍了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
为了保证系统安全,请单独再创建一个用户来运行docker,在这里我们把这个用户称为docker_user
# apt-get -y install curl
# curl -sSL https://get.docker.com/ubuntu/ | sh# 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
在ecs中shell中提交这个container以保存当前的docker image.
# 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$ docker ps #查看container id
然后我们就可以退出docker shell了。回到ecs shell,这时,docker ps发现刚才的那个docker已经不见了。那是因为它是用interactive mode启动的,shell退出后,它就stop了。可以用docker ps -a命令找出它的container id, 然后docker rm <container id>删除之。接下来,我们利用刚刚保存的image启动一个可以ssh接入的docker:
$ docker commit <container id> my_centosdocker 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]
说明如下:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。