您的位置:首页 > 运维架构 > Docker

【Docker入门】使用Nginx反向代理最前端,多个Docker容器做后端。将多台服务器整合到一台服务器上

2015-10-27 20:39 393 查看
本博客源地址:http://www.cenyol.com/?p=376

事情是这样子的:

之前做一个项目,手上有2台服务器。一台运行着内测版的系统,供开发人员开发和测试使用,里面的数据均是无意义的测试数据;另一台则是运行着正式版的系统,供用户使用,里面的数据均是真实用户发布的一些真实数据,不应该也不允许和测试数据混在一块。第一台服务器由于是开发测试使用,本身就平均只有不到5个在线用户,所以弄一台服务器来专门使用确实有点浪费。第二台服务器由于正式版系统没怎么推广起来,用户量也不大,所以每天CPU和内存也都是空闲着,着实浪费。

本着节约和学习的态度,前段时间学习了Docker,然后把这两台服务器整合到了一台服务器上了,原理正如标题所说那样,前端使用Nginx做代理转发流量,然后后端的多个Docker容器服务器来接收请求,处理并返回处理结果。下面说说大概做了什么工作:

1、去阿里云租了个CentOS 7,基础镜像,里面除了CentOS自带的服务,没其他多余的程序。所以首先安装了Docker,具体看这里http://www.cenyol.com/?p=328,里面介绍了如何安装Docker,以及如何制作第一个镜像。这么一来,就有了我们自己定制的Docker镜像了,比如我制作了一个要用的是lnmp镜像,软件配置:CentOS 7+Nginx+MySQL 5.6+PHP 7,外加一个ssh服务,用于之后使用ssh客户端登录容器进行远程操作。我们叫它lnmp:v1.0,v1.0是标签,可自定义,这里用个版本号来表示。

2、经过这段时间的实践,我知道了这样做更好:docker run -d –name server_debug -p 50080:80 -p 50081:81 -p 50306:3306 -p 50022:22 cenyol/lnmp:v1.0 /usr/sbin/sshd -D ,说明:–name参数表明将该容器的名称设置为其之后的字符串,即该容器叫做server_debug;-p是端口映射的参数配置,大概就是宿主机的50080端口映射到容器的80端口,之后三个-p都是类似。运行完这个命令,系统的Docker服务就创建了一个Docker容器,并且在后台启动了它。我们可以通过ssh客户端来登录,进入里面做该做的事情,这里简单说:我进去之后,使用git将前面说的测试版本系统拉下来,进行了部署,在里面启动Nginx,php-fpm,和mysql服务。并将之前测试服务器上的数据库也搬了过来,这样这个server_debug的容器就拥有了和之前的测试服务器一摸一样的功能了,其实,它就是用来替代测试服务器的作用,因为为了省钱,我们以后一会在租用测试服务器的,而是使用server_debug来做开发测试,嗯,还不错。

设:

宿主机的IP=1.1.1.1,则当我们要访问server_debug的80端口,则,访问地址为:1.1.1.1:50080,其他三个类似。

3、我们在宿主机上的架构是利用Nginx反向代理做前端的“流量转发角色”,将来自不同域名请求的流量转到不同的容器服务器中去处理。不过,目前为止,我们只有测试服务器server_debug,正式版的服务器还没建起来。按照上面的规则,把命令端口改一下,服务器名改一下,用这个命令吧:docker run -d –name server_release -p 51080:80 -p 51081:81 -p 51306:3306 -p 51022:22 cenyol/lnmp:v1.0 /usr/sbin/sshd -D。可以看到,正式版的容器名称叫做server_release,宿主机方面的映射端口是以51开头的前缀。然后也是通过ssh登录进去,用git拉一下源码,把数据库也迁移一下,把整个项目部署起来。这样我们就可以通过1.1.1.1:51080来访问正式版系统了。

4、到目前为止,宿主机上的两个小Docker群搞好了,虽然只有两个,但也是复数,称它们为Docker集群应该可以的。我们之后,域名解析设置只能做到域名-ip的级别,并不能做到域名-ip:port的映射,好在无论是Apache还是Nginx之类的web服务器都是可以通过不同域名,将流量转发到不同的web系统的,而且Nginx还能做反向代理,这个原理自己去谷歌。咱们这里用一用就好了。要实现的功能大概是这样:

设:

我有一个域名是cenyol.com。现在做如下的对应:

www.cenyol.com->1.1.1.1:51080

admin.cenyol.com->1.1.1.1:51081

www-dev.cenyol.com->1.1.1.1:50080

admin-dev.cenyol.com->1.1.1.1:50081

从以上的域名设置和端口对应分配大概可以看出,-dev后缀的是测试系统,而且它对应的宿主机端口确实就是50开头的两个端口,在前面可以看到50开头的端口都是属于server_debug容器的,嗯,这样子就没错啦。如果可以在dns那边做这样的解析,辣么,到这里应该算是把服务器整合完毕,没有宿主机上的Nginx什么事儿了,也没必要在宿主机上安装Nginx了。正如前面所说的dns的域名解析设置只能做到域名-ip的级别。所以我们只能在我们的域名解析设置页面做这样的设置:

www.cenyol.com->1.1.1.1

admin.cenyol.com->1.1.1.1

www-dev.cenyol.com->1.1.1.1

admin-dev.cenyol.com->1.1.1.1

没错,四个域名都是指向同一个ip,即我们的宿主机ip。我们知道,Nginx可以根据不同的域名进行不同的转发。大概的原理就是,我们可以在Nginx里面设置,使得来自www.cenyol.com的流量,被Nginx转发到了127.0.0.1:51080。嗯,既然后端的Docker们都搞好了,现在就剩下前端安装一下Nginx,然后配置一下反向代理了,具体看这里:http://www.ttlsa.com/nginx/use-nginx-proxy

5、在浏览器访问上面配置的四个域名,嗯,没错的话应该是可以了的。

推荐阅读:

搭建nginx反向代理用做内网域名转发

CentOS命令学习之scp复制

【实战】Docker容器资源管理

灵雀云,一个不错的Docker学习的地方
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  docker nginx 集群