全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
容器服务

自定义路由-使用手册

更新时间:2017-06-28 18:07:16

acs/proxy

自定义代理镜像,通过 FROM dockercloud/haproxy 的方式继承自镜像 dockercloud/haproxy,动态感知容器的状态,做到后端容器负载均衡代理和服务发现。特点是将 HAProxy 负载均衡软件的所有配置都参数化了,方便您自定义自己的需求和配置。

该镜像主要用于 Alibaba Cloud 容器服务的默认路由服务不能满足您需求的场景,方便您对 HAProxy 进行自定义配置。

文档中会提到 acs/proxy 和 HAProxy,均指代该镜像或者镜像中的软件 HAProxy。

动态负载均衡代理和服务发现的原理

  • 镜像 acs/proxy 通过容器自身环境变量确定负载均衡的全局(GLOBAL)和默认(DEFAULT)配置。

  • 镜像 acs/proxy 侦听集群中的事件,例如容器状态的变化,发生变化后重新获取集群中相关容器的信息,确定最新的负载均衡配置。

  • 镜像 acs/proxy 根据最新的负载均衡配置去重新加载(reload)该配置,使得该配置生效。

如何确定负载均衡的后端容器

  • 根据 acs/proxy 的环境变量 ADDITIONAL_SERVICES 来确定范围。

    • ADDITIONAL_SERVICES: "*" 表示范围为整个集群。
    • ADDITIONAL_SERVICES: "project_name1:service_name1,project_name2:service_name2" 表示范围为当前应用和指定应用的指定服务。
    • ADDITIONAL_SERVICES 不设置或者为空表示范围为当前应用的容器。
  • 根据每个容器的标签来确定是否加入 acs/proxy 的后端。

    • aliyun.proxy.VIRTUAL_HOST: "www.toolchainx.com" 表示加入后端,且域名为 www.toolchainx.com
    • aliyun.proxy.required: "true" 表示加入后端,且作为默认的后端。

如何在前端绑定负载均衡

使用自定义负载均衡标签,例如 aliyun.lb.port_80: 'tcp://proxy:80'

注意:

  • 请不要将集群的负载均衡实例(即简单路由的负载均衡)用来做自定义负载均衡。
  • 任何两个不同的服务均不能共享使用同一个负载均衡,否则会导致负载均衡后端机器被删除,服务不可用。

关于自定义负载均衡标签的使用方法,参见 lb 标签。

示例模板

  1. lb:
  2. image: registry.aliyuncs.com/acs/proxy:0.5
  3. ports:
  4. - '80:80'
  5. restart: always
  6. labels:
  7. # addon 使得 proxy 镜像有订阅注册中心的能力,动态加载服务的路由
  8. aliyun.custom_addon: "proxy"
  9. # 每台 vm 部署一个该镜像的容器
  10. aliyun.global: "true"
  11. # 使用自定义负载均衡,前端绑定负载均衡
  12. aliyun.lb.port_80: tcp://proxy_test:80
  13. environment:
  14. # 支持加载路由的后端容器的范围,"*"表示整个集群,默认为应用内的服务
  15. ADDITIONAL_SERVICES: "*"
  16. appone:
  17. expose: # 被代理的服务一定要使用 expose 或者 ports 告诉 proxy 容器暴露哪个端口
  18. - 80/tcp
  19. image: 'nginx:latest'
  20. labels:
  21. # 此处支持 http/https/ws/wss 协议
  22. # 必须使用您自己的域名而不是容器服务提供的测试域名
  23. aliyun.proxy.VIRTUAL_HOST: "http://appone.example.com"
  24. restart: always

配置说明

通过 acs/proxy 镜像的环境变量设置全局(GLOBAL)和默认(DEFAULT)配置

注意:您需要重新部署 HAProxy 服务才能使此处的配置变更生效。该部分的配置针对的是镜像 acs/proxy 所在服务的环境变量配置。

环境变量 默认值 描述
ADDITIONAL_SERVICES 需要进行负载均衡的附加服务列表 (比如:prj1:web,prj2:sql)。
服务发现将基于 com.docker.compose.[project|service] 容器标签。
该环境变量仅适用于 compose V2,且必须确保容器可以解析和访问依赖的服务所在的网络。
BALANCE roundrobin 要使用的负载均衡算法。
可能的取值包括 roundrobinstatic-rrsourceleastconn
更多详细信息,参见 HAProxy:balance
CA_CERT_FILE CA 证书文件的路径。
通过使用该环境变量,您可以直接从数据卷挂载 CA 证书文件,而不需要通过环境变量传递证书文件内容。如果您设置了该变量,系统会忽略 CA_CERT 环境变量。
可设置为 /cacerts/cert0.pem
CA_CERT HAProxy 用于验证客户端的 CA 证书。
该环境变量的格式与 DEFAULT_SSL_CERT 相同。
CERT_FOLDER 证书的路径。
通过使用该变量,您可以直接从数据卷挂载 CA 证书文件,而不需要通过环境变量传递证书文件的内容。如果您设置了该变量,系统会忽略所依赖服务的 DEFAULT_SSL_CERTSSL_CERT 环境变量。
可设置为 /certs/
DEFAULT_SSL_CERT 默认的 SSL 证书。
该 pem 文件包含私钥和公钥(其中,私钥在前,公钥在后),使用 \n(两个字符)作为行分隔符。内容应该写在同一行,参见 SSL Termination
EXTRA_BIND_SETTINGS 额外设置,由逗号进行分隔的字符串(<port>:<setting>)。每一部分会被附加到配置文件中对应的端口绑定节点。
如果需要使用逗号,需要使用 \, 进行转义。
可设置为 443:accept-proxy, 80:name http
EXTRA_DEFAULT_SETTINGS 额外设置,由逗号进行分隔的字符串。每一部分会被附加到配置文件中的 DEFAULT 节点。
如果需要使用逗号,需要使用 \, 进行转义。
EXTRAFRONTEND_SETTINGS\<PORT> 额外设置,由逗号进行分隔的字符串。每一部分会按照环境变量名称中指定的端口号被附加到前端节点。
如果需要使用逗号,需要使用 \, 进行转义。
可设置为 EXTRA_FRONTEND_SETTINGS_80=balance source, maxconn 2000
EXTRA_GLOBAL_SETTINGS 额外设置,由逗号进行分隔的字符串。每一部分会被附加到配置文件中的 GLOBAL 节点。
如果需要使用逗号,需要使用 \, 进行转义。
可设置为 tune.ssl.cachesize 20000, tune.ssl.default-dh-param 2048
EXTRA_ROUTE_SETTINGS 该字符串会在健康检查结束后被附加到每一个后端路由上。
依赖的服务中的设置会覆盖该设置。
可设置为 "send-proxy"
EXTRA_SSL_CERTS 多余证书的名称列表,由逗号分隔,例如 CERT1, CERT2, CERT3
您还需要将每一个证书指定为单独的环境变量,例如 CERT1="<cert-body1>", CERT2="<cert-body2>", CERT3="<cert-body3>"
HEALTH_CHECK check 在每一个路由上设置健康检查。
可设置为 “check inter 2000 rise 2 fall 3”。
更多详细信息,参见 HAProxy:check
HTTP_BASIC_AUTH HTTP 基本认证的身份信息列表,格式为 <user>:<pass>,由逗号分隔。该身份信息适用于所有后端路由。
如果需要使用逗号,需要使用 \, 进行转义。
注意:生产环境中,请不要使用该环境变量进行认证。
MAXCONN 4096 设置每个进程的最大同时连接数。
MODE http HAProxy 的负载均衡模式。
可能的值包括 httptcphealth
MONITOR_PORT 要添加 MONTIOR_URI 的端口号。
该变量同 MONTIOR_URI 配合使用。
可设置为 80
MONITOR_URI 为获取 HAProxy 的健康状态所需要拦截的具体 URI。
更多详细信息,参见 Monitor URI
可设置为 /ping
OPTION redispatch default 节点中的 HAProxy option 条目列表,由逗号分隔。
RSYSLOG_DESTINATION 127.0.0.1 HAProxy 日志将要发送到的 rsyslog 目的地址。
SKIP_FORWARDED_PROTO 如果设置了该环境变量,HAProxy 将不会添加 X-Forwarded-For http请求头。
当 HAProxy 与其它负载均衡一同使用时,可以使用该环境变量。
SSL_BIND_CIPHERS 设置 SSL 服务器所要使用的 SSL 密钥套件。
该环境变量设置了 HAProxy ssl-default-bind-ciphers 的配置。
SSL_BIND_OPTIONS no-sslv3 设置 SSL 服务器所使用的 SSL 绑定选项。
该环境变量设置了 HAProxy ssl-default-bind-options 的配置。
设置为默认值则只允许在 SSL 服务器上使用 TLSv1.0+。
STATS_AUTH stats:stats 访问 Haproxy stats 统计页面所需要的用户名和密码。
STATS_PORT 1936 HAProxy stats 统计页面暴露的端口号。如果开放了该端口,则可以通过 http://<host-ip>:<STATS_PORT>/ 访问 stats统计页面。
TIMEOUT connect 5000, client 50000, server 50000 default 节点中 HAProxy timeout 条目列表,由逗号分隔。

被代理的后端服务通过相应服务镜像的标签进行某一后端服务的配置

即通过将标签写到后端服务的镜像上来进行配置。该部分的配置写在被代理的服务的模版部分

此处的设置可以覆盖 HAProxy 的设置。HAProxy 的设置仅适用于依赖的服务。如果在阿里云容器服务上运行,当服务重新部署,加入或者退出 HAProxy 服务时,HAProxy 服务会自动进行更新来应用这些变更。

标签 描述
aliyun.proxy.APPSESSION 会话保持选项。
可设置为 JSESSIONID len 52 timeout 3h
更多详细信息,参见 HAProxy:appsession
aliyun.proxy.BALANCE 要使用的负载均衡算法。
可设置为 roundrobinstatic-rrsourceleastconn
更多详细信息,参见 HAProxy:balance
aliyun.proxy.COOKIE 会话保持选项。
可设置为 SRV insert indirect nocache
更多详细信息,参见 HAProxy:cookie
aliyun.proxy.DEFAULT_SSL_CERT SSL_CERT 类似。但是该变量将 pem 文件保存在 /certs/cert0.pem 下作为默认的 SSL 证书。
如果在依赖的服务或者HAProxy 中设置了多个 DEFAULT_SSL_CERT,会导致未定义的行为。
aliyun.proxy.EXCLUDE_PORTS 端口号,由逗号分隔(例如:3306, 3307)。
默认情况下,HAProxy 将应用服务暴露的所有端口添加到后端路由。您可以指定您不希望进行路由的端口,比如数据库端口。
aliyun.proxy.EXTRA_ROUTE_SETTINGS 该字符串会在健康检查结束后被附加到每一个后端路由上。
可设置为 “send-proxy”。
aliyun.proxy.EXTRA_SETTINGS 额外设置,由逗号分隔。
每一部分会被附加到配置文件中相关的后端节点或监听会话。
如果需要使用逗号,使用 \, 进行转义。
可设置为 balance source
aliyun.proxy.FORCE_SSL 如果设置了该环境变量且启用了 SSL termination,HAProxy 会将 HTTP 请求重定向为 HTTPS 请求。
aliyun.proxy.GZIP_COMPRESSION_TYPE 启用 gzip 压缩。
该环境变量的值为将要压缩的 MIME 类型列表。
可设置为 text/html text/plain text/css
aliyun.proxy.HEALTH_CHECK 在每一个后端路由上设置健康检查。
可设置为 “check inter 2000 rise 2 fall 3”。
更多详细信息,参见 HAProxy:check
aliyun.proxy.HSTS_MAX_AGE 启用 HSTS。
该环境变量的值为一个整数,代表 HSTS 的有效期,单位为秒。
可设置为 31536000
aliyun.proxy.HTTP_CHECK 启用 HTTP 协议来检查服务器的健康情况。
可设置为 “OPTIONS * HTTP/1.1\r\nHost:\ www”。
更多详细信息,参见 HAProxy:httpchk
aliyun.proxy.OPTION HAProxy option 条目列表,由逗号分隔。
此处设置的 option 会被添加到相关的后端节点或监听节点,并会覆盖 HAProxy 容器中的 OPTION 设置。
aliyun.proxy.SSL_CERT SSL 证书。该 pem 文件包含私钥和公钥(其中,私钥在前,公钥在后),使用 \n (两个字符)作为行分隔符。
aliyun.proxy.TCP_PORTS 由逗号分隔的端口(比如:9000, 9001, 2222/ssl)。
TCP_PORTS 中列出的端口将在 TCP 模式下被负载均衡。
/ssl 结尾的端口表示该端口需要 SSL termination。
aliyun.proxy.VIRTUAL_HOST_WEIGHT 虚拟主机的权重,同 aliyun.proxy.VIRTUAL_HOST 配合使用。
该值为一个整数,默认值为 0。
该设置会影响虚拟主机的 ACL 规则的顺序。 虚拟主机的权重越高,ACL 规则的优先级越高,即值越大,越先被路由到。
aliyun.proxy.VIRTUAL_HOST 指定虚拟主机和虚拟路径。
格式为 [scheme://]domain[:port][/path], ...
可以在 domainpath 部分使用通配符 *

有关以上内容的更多信息,参见 HAProxy 配置手册

虚拟主机和虚拟路径

您可以在 VIRTUAL_HOST 环境变量中同时指定虚拟主机和虚拟路径。该变量的值由 URL 组成,多个 URL 之前用逗号分隔,格式为 [scheme://]domain[:port][/path]

条目 默认值 描述
scheme http 可能的值包括 httphttpswss
domain 虚拟主机。可以使用通配符 *
port 80/433 虚拟主机的端口号。当 scheme 设置为 httpswss 时,默认的端口为 443
/path 虚拟路径。以 / 开头,可以使用通配符 *

匹配示例

虚拟主机 匹配 不匹配
http://domain.com domain.com www.domain.com
domain.com domain.com www.domain.com
domain.com:90 domain.com:90 domain.com
https://domain.com https://domain.com domain.com
https://domain.com:444 https://domain.com:444 https://domain.com
\*.domain.com www.domain.com domain.com
\*domain.com www.domain.comdomain.comanotherdomain.com www.abc.com
www.e\*e.com www.domain.comwww.exxe.com www.axxa.com
www.domain.\* www.domain.comwww.domain.org domain.com
\* any website with HTTP
https://\* any website with HTTPS
\*/path domain.com/pathdomain.org/path?u=user domain.com/path/
\*/path/ domain.com/path/domain.org/path/?u=user domain.com/pathdomain.com/path/abc
\*/path/\* domain.com/path/domain.org/path/abc domain.com/abc/path/
\*/\*/path/\* domain.com/path/domain.org/abc/path/domain.net/abc/path/123 domain.com/path
\*/\*.js domain.com/abc.jsdomain.org/path/abc.js domain.com/abc.css
\*/\*.do/ domain.com/abc.do/domain.org/path/abc.do/ domain.com/abc.do
\*/path/\*.php domain.com/path/abc.php domain/abc.phpdomain.com/root/abc.php
\*.domain.com/\*.jpg www.domain.com/abc.jpgabc.domain.com/123.jpg domain.com/abc.jpg
\*/path, \*/path/ domain.com/pathdomain.org/path/
domain.com:90https://domain.com domain.com:90https://domain.com

注意:

  • 基于 VIRTUAL_HOST 所生成的 ACL 规则的顺序是随机的。在 HAProxy 中,当范围较窄的规则(比如 web.domain.com)被放置在范围较宽的规则(比如 *.domain.com)之后时, 系统永远不会达到范围较窄的规则。因此,如果您所设置的虚拟主机包含相互重叠的范围时,您需要使用 VIRTUAL_HOST_WEIGHT 来手动设置 ACL 规则的顺序,为范围较窄的虚拟主机设置高于范围较宽的虚拟主机的权重。
  • 所有带有相同 VIRTUAL_HOST 环境变量设置的服务将被看做并合并为一个服务。这对于一些测试场景比较适用。

SSL termination

acs/proxy 支持证书的 SSL ternimation。您只需要为每一个需要使用 SSL ternimation 的应用设置 SSL_CERTVIRTUAL_HOST 即可。然后,HAProxy 会读取依赖环境中的证书并开启 SSL ternimation。

注意: 当环境变量的值中包含等号(=)时(这种情况在 SSL_CERT中很普遍),Docker 会跳过该环境变量。因此,您只能在 Docker 1.7.0 或更高版本上使用多 SSL ternimation。

在以下情况下会启用 SSL ternimation:

  • 至少设置了一个 SSL 证书。
  • 没有设置 VIRTUAL_HOST 或者设置为使用 HTTPS 协议。

您可以通过以下方法设置 SSL 证书:

  • acs/proxy 中设置 DEFAULT_SSL_CERT
  • 在依赖于 acs/proxy 的应用服务中设置 aliyun.proxy.SSL_CERT 和/或 DEFAULT_SSL_CERT

aliyun.proxy.SSL_CERTDEFAULT_SSL_CERT 的区别在于 SSL_CERT 指定的多个证书保存为 cert1.pem, cert2.pem, ...,而 DEFAULT_SSL_CERT 指定的证书通常保存为 cert0.pem。在这种情况下,当没有设置 SNI 匹配时,HAProxy 会将 cert0.pem 用作默认证书。然而,当提供了多个 DEFAULT_SSL_CERTIFICATE 时,仅有其中一个证书可以保存为 cert0.pem,其它的证书将被弃用。

PEM 文件

acs/proxy 或依赖的应用服务所指定的证书为一个 pem 文件。该文件包含私钥和公钥(其中,私钥必须放在公钥和其它许可证书的前面)。您可以运行下面的脚本生成一个自签名证书。

  1. openssl req -x509 -newkey rsa:2048 -keyout key.pem -out ca.pem -days 1080 -nodes -subj '/CN=*/O=My Company Name LTD./C=US'
  2. cp key.pem cert.pem
  3. cat ca.pem >> cert.pem

您获取 pem 文件之后,可以运行下面的命令将文件转化为一行内容。

  1. awk 1 ORS='\\n' cert.pem

拷贝转换后的内容并将其设置为 aliyun.proxy.SSL_CERTDEFAULT_SSL_CERT 的值。

亲和性和会话保持

您可以通过以下任一方法设置亲和性和会话保持。

  • 在您的应用服务中设置 aliyun.proxy.BALANCE=source。当设置了 source 负载均衡方法时, HAProxy 会对客户端 IP 地址进行哈希并确保同一个 IP 总是连接到同一个后端服务容器上。
  • 设置 aliyun.proxy.APPSESSION=<value>。使用应用会话来确定客户端应该连接到哪一个服务容器上。<value> 可以设置为 JSESSIONID len 52 timeout 3h
  • 设置 aliyun.proxy.COOKIE=<value>。使用应用 cookie 来确定客户端应该连接到哪一个后端服务容器上。<value> 可以设置为 SRV insert indirect nocache

更多详细信息,参见 HAProxy:appsessionHAProxy:cookie

TCP 负载均衡

默认情况下,acs/proxy 运行在 http 模式下。如果您希望依赖的服务运行在 tcp 模式下,您可以指定 TCP_PORTS 环境变量。该变量的值为以逗号分隔的端口号(9000, 9001)。

例如,如果您运行以下命令:

  1. docker --name app-1 --expose 9000 --expose 9001 -e TCP_PORTS="9000, 9001" your_app
  2. docker --name app-2 --expose 9000 --expose 9001 -e TCP_PORTS="9000, 9001" your_app
  3. docker run --link app-1:app-1 --link app-2:app-2 -p 9000:9000, 9001:9001 acs/proxy

HAProxy 将分别在 9000 端口和 9001 端口上对 app-1app-2 进行负载均衡。

此外,如果您所暴露的端口多于 TCP_PORTS 中所设置的端口,剩余的端口将会使用 http 模式进行负载均衡。

例如,如果您运行以下命令:

  1. docker --name app-1 --expose 80 --expose 22 -e TCP_PORTS=22 your_app
  2. docker --name app-2 --expose 80 --expose 22 -e TCP_PORTS=22 your_app
  3. docker run --link app-1:app-2 --link app-2:app-2 -p 80:80 -p 22:22 acs/proxy

HAProxy 会在 80 端口使用 http 模式进行负载均衡,在 22 端口使用 tcp 模式进行负载均衡。

通过这种方法,您可以同时使用 tcp 模式和 http 模式进行负载均衡。

如果您在 TCP_PORTS 中设置了以 /ssl 结尾的端口,比如 2222/ssl,HAProxy 会在 2222 端口上设置 SSL termination。

注意:

  • 您可以同时设置 VIRTUAL_HOSTTCP_PORTS,以便为 http 模式提供更多的管控。
  • tcp 端口上的负载均衡适用于所有的服务。因此,如果您依赖了两个或多个使用同一 TCP_PORTS 设置的不同服务,acs/proxy 会将这些服务看做同一个服务。

WebSocket 支持

您可以通过以下任一方法启用 websocket 支持:

  • 鉴于 Websocket 使用 HTTP 协议进行启动,您可以使用虚拟主机来指定使用 wswss 协议。比如,-e VIRTUAL_HOST="ws://ws.domain.com, wss://wss.domain.com"
  • 鉴于 Websocket 本身为 TCP 连接,因此您可以尝试使用本文档前面所介绍的 TCP 负载均衡。

使用场景示例

注意:

  • 一下示例中的acs/proxy镜像均是registry.aliyuncs.com/acs/proxy:0.5的简写形式,请做相应替换。

我的 webapp 容器暴露了 8080 端口(或任意其它端口),我希望 proxy 监听 80 端口

使用下面的命令:

  1. docker run -d --expose 80 --name webapp dockercloud/hello-world
  2. docker run -d --link webapp:webapp -p 80:80 acs/proxy

我的 webapp 容器暴露了 80 端口和 8083/8086 数据库端口,我希望 proxy 监听 80 端口并且不希望将数据库端口加入 acs/proxy

  1. docker run -d -e EXCLUDE_PORTS=8803,8806 --expose 80 --expose 8033 --expose 8086 --name webapp dockercloud/hello-world
  2. docker run -d --link webapp:webapp -p 80:80 acs/proxy

我的容器暴露了 8080 端口(或任意其它端口),我希望 acs/proxy 监听 8080 端口

使用下面的命令:

  1. docker run -d --expose 8080 --name webapp your_app
  2. docker run -d --link webapp:webapp -p 8080:80 acs/proxy

我希望 acs/proxy 处理 SSL 连接并将我的普通 HTTP 请求转发到端口 8080(或任意其它端口)

使用下面的命令:

  1. docker run -d -e SSL_CERT="YOUR_CERT_TEXT" --name webapp dockercloud/hello-world
  2. docker run -d --link webapp:webapp -p 443:443 -p 80:80 acs/proxy

或者

  1. docker run -d --link webapp:webapp -p 443:443 -p 80:80 -e DEFAULT_SSL_CERT="YOUR_CERT_TEXT" acs/proxy

YOUR_CERT_TEXT 中的证书包含私钥和公钥(其中,私钥在前,公钥在后)。您需要在证书的行与行之间加上 \n。假设您的证书保存在 ~/cert.pem 中,您可以运行以下命令。

  1. docker run -d --link webapp:webapp -p 443:443 -p 80:80 -e DEFAULT_SSL_CERT="$(awk 1 ORS='\\n' ~/cert.pem)" acs/proxy

我希望 acs/proxy 终结 SSL 连接并将 HTTP 请求重定向为 HTTPS 请求

使用下面的命令:

  1. docker run -d -e FORCE_SSL=yes -e SSL_CERT="YOUR_CERT_TEXT" --name webapp dockercloud/hello-world
  2. docker run -d --link webapp:webapp -p 443:443 acs/proxy

我希望从数据卷中加载我的 SSL 证书,而不是通过环境变量来传递证书内容

您可以使用 CERT_FOLDER 环境变量来指定证书挂载在容器的哪个文件夹中。使用以下命令。

  1. docker run -d --name webapp dockercloud/hello-world
  2. docker run -d --link webapp:webapp -e CERT_FOLDER="/certs/" -v $(pwd)/cert1.pem:/certs/cert1.pem -p 443:443 acs/proxy

我希望通过域名设置虚拟主机路由

可以通过 proxy 读取依赖的容器的环境变量(VIRTUAL_HOST)来配置虚拟主机。

示例:

  1. docker run -d -e VIRTUAL_HOST="www.webapp1.com, www.webapp1.org" --name webapp1 dockercloud/hello-world
  2. docker run -d -e VIRTUAL_HOST=www.webapp2.com --name webapp2 your/webapp2
  3. docker run -d --link webapp1:webapp1 --link webapp2:webapp2 -p 80:80 acs/proxy

在上面的例子中,当您访问 http://www.webapp1.comhttp://www.webapp1.org 时,将显示运行于容器 webapp1 上的服务,http://www.webapp2.com 会连接到容器 webapp2

如果您使用下面的命令:

  1. docker run -d -e VIRTUAL_HOST=www.webapp1.com --name webapp1 dockercloud/hello-world
  2. docker run -d -e VIRTUAL_HOST=www.webapp2.com --name webapp2-1 dockercloud/hello-world
  3. docker run -d -e VIRTUAL_HOST=www.webapp2.com --name webapp2-2 dockercloud/hello-world
  4. docker run -d --link webapp1:webapp1 --link webapp2-1:webapp2-1 --link webapp2-2:webapp2-2 -p 80:80 acs/proxy

当您访问 http://www.webapp1.com 时,将显示运行于容器 webapp1 上的服务, http://www.webapp2.com 将基于轮询调度算法(或者任何其它 BALANCE 指定的算法)连接到容器 webapp2-1webapp2-2 上。

我希望我所有的 *.node.io 域名均指向我的服务

  1. docker run -d -e VIRTUAL_HOST="*.node.io" --name webapp dockercloud/hello-world
  2. docker run -d --link webapp:webapp -p 80:80 acs/proxy

我希望 web.domain.com 连接到一个服务, *.domain.com 连接到另外一个服务

  1. docker run -d -e VIRTUAL_HOST="web.domain.com" -e VIRTUAL_HOST_WEIGHT=1 --name webapp dockercloud/hello-world
  2. docker run -d -e VIRTUAL_HOST="*.domain.com" -e VIRTUAL_HOST_WEIGHT=0 --name app dockercloud/hello-world
  3. docker run -d --link webapp:webapp --link app:app -p 80:80 acs/proxy

我希望所有到 /path 路径的请求均指向我的服务

  1. docker run -d -e VIRTUAL_HOST="*/path, */path/*" --name webapp dockercloud/hello-world
  2. docker run -d --link webapp:webapp -p 80:80 acs/proxy

我希望所有的静态 html 请求均指向我的服务

  1. docker run -d -e VIRTUAL_HOST="*/*.htm, */*.html" --name webapp dockercloud/hello-world
  2. docker run -d --link webapp:webapp -p 80:80 acs/proxy

我希望查看 HAProxy stats

  1. docker run -d --link webapp:webapp -e STATS_AUTH="auth:auth" -e STATS_PORT=1936 -p 80:80 -p 1936:1936 acs/proxy

我希望将我的日志发送到 papertrailapp

用与您的 papertrailapp 账号相匹配的值替换 <subdomain><port>

  1. docker run -d --name web1 dockercloud/hello-world
  2. docker run -d --name web2 dockercloud/hello-world
  3. docker run -it --env RSYSLOG_DESTINATION='<subdomain>.papertrailapp.com:<port>' -p 80:80 --link web1:web1 --link web2:web2 acs/proxy

使用虚拟主机的拓扑图

阿里云容器服务代理拓扑图

1

手动重新加载 HAProxy

在大多数情况下,当依赖的服务发生变化时,acs/proxy 会自动进行配置。但是如果需要的话,您也可以按照下面的方法手动重新加载 acs/proxy

docker exec <acs/proxy_container_id> /reload.sh

本文导读目录