如何负载均衡

使用 HAProxy 智能负载均衡

我们使用 dockercloud-haproxy 配合 DaoCloud 的应用管理来实现负载均衡。

dockercloud-haproxy 对 HAProxy 进行了包装,增加了在 docker 环境下自动配置的功能

部署 dockercloud-haproxy

按照如下 compose 配置

lb 服务监听机器的 80 端口,并把 docker.sock 映射到容器中,HAProxy 容器会检查 links 的服务的变化并更新负载均衡配置。

在 web 中使用 VIRTUAL_HOST 配置服务的访问地址。

version: '2'
services:
  web:
    image: daocloud.io/daocloud/dao-2048
    environment:
    - VIRTUAL_HOST=hello.example
  lb:
    image: daocloud.io/daocloud/dockercloud-haproxy
    links:
    - web
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    ports:
    - 80:80
 

启动后自动完成配置,

可以在机器上执行命令 curl -H 'Host: hello.example' xxx.xxx.xxx.xxx 来测试配置,如返回 2048 的HTML内容则代表配置成功。

在应用页面增加容器的数量,HAProxy 会自动把流量负载均衡到这些容器上。

负载均衡的架构如下所示:

                                                           |---- container_a1
                                    |----- service_a ----- |---- container_a2
                                    |   (virtual host a)   |---- container_a3
internet --- dockercloud/haproxy--- |
                                    |                      |---- container_b1
                                    |----- service_b ----- |---- container_b2
                                        (virtual host b)   |---- container_b3
 

这里只介绍了简单的使用方式

更高级的用法请查看镜像页面 HAProxy

或者原文文档(英文)  

使用 Nginx 智能负载均衡

我们来使用 nginx-proxy 配合 DaoCloud 的应用管理来实现负载均衡。

部署 nginx-proxy

监听机器的 80、443 端口,这样端口上的流量由 nginx-proxy 来负载分配。

 把 docker.sock 映射到 nginx-proxy 容器中,这样容器变动时需要映射的路径会被自动检测到。

部署 nginx-proxy 的 compose 文件如下:

proxy:  
  image: daocloud.io/daocloud/nginx-proxy:0.3.6    
  ports: 
    - 443:443  
    - 80:80  
  volumes: 
    - /var/run/docker.sock:/tmp/docker.sock:ro
  restart: always
 

对于配置好 proxy 的主机,每当在主机上启动一个容器的时候,nignx-proxy 都会自动检查该容器是否含有 VIRTUAL_HOST 这个环境变量,当检查到某个刚启动的容器含有这个环境变量时,便会自动修改 nginx,负载这个域名的流量到容器。

我们试着部署一个博客,并且利用 nginx-proxy 负载均衡我们的服务,请看以下 compose 示例:

blog:
  image: daocloud.io/cmss/hypo-blog:master-796038f
  ports:
    - '4000'
  environment:
    - VIRTUAL_HOST=blog.ihypo.net
  restart: always
 

我们在应用页面增加容器的数量,nginx-proxy 会自动把流量负载均衡到这些容器上。