使用 Rancher-Compose

Jitao Hou 正在翻译首稿,欢迎之后Review

Rancher-compose 工具就像一个多主机版本的 docker-compose. 它直接操作Rancher图形界面中的 应用栈(stack) , 应用栈属于一个环境(environment),并且包含很多主机(hosts). 由rancher-compose启动的容器将会被部署在所属环境内的任意满足调度规则(scheduling rules)的主机节点上. 如果事先没有定义调度规则, 服务中的容器将会在已启动容器数目较少的节点上来启动。 因为使用相同的API调用, 使用ancher-compose就和用户界面中启动服务的效果一样,服务中的容器将会被拉起。

Rancher-compose 工具就像大家熟知的 docker-compose一样, 支持任意的docker-compose.yml 文件. 另外,它还支持 rancher-compose.yml文件,该文件扩充和覆写了 docker-compose.yml的定义,包含了很多只有在Rancher环境才被支持的属性,如, 服务中容器的启动数量等。

如需深入掌握本章关于rancher-compose的知识,用户需要对docker-compose有基本的了解。请在开始使用rancher-compose之前,通读docker-compose documentation

安装

该命令的二进制文件可以直接在用户界面(UI)中下载,下载的链接位于UI的右下角,其中包含支持Windows, Mac和 Linux的命令行文件.

你也可以参考releases page for rancher-compose 来直接下载该工具。

在Rancher服务器中设置Rancher-Compose

为了使得rancher-compose能够在Rancher的实例中启动服务,你需要设置一些环境变量,或者在rancher-compose 命令行中以选项的方式传递这些变量。这些所需要的环境变量是RANCHER_URL, RANCHER_ACCESS_KEY, 和RANCHER_SECRET_KEY. Access key和Secret key属于API key.

  1. bash
  2. # Set the url that Rancher is on
  3. $ export RANCHER_URL=http://server_ip:8080/
  4. # Set the access key, i.e. username
  5. $ export RANCHER_ACCESS_KEY=<username_of_key>
  6. # Set the secret key, i.e. password
  7. $ export RANCHER_SECRET_KEY=<password_of_key>

如果你选择不设置这些环境变量,你将会需要在rancher-compose 命令行中以选项的方式传递这些变量。

  1. bash
  2. $ rancher-compose --url http://server_ip:8080 --access-key <username_of_key> --secret-key <password_of_key> up

现在, 你可以利用rancher-compose 搭配任意的 docker-compose.yml文件来启动服务. 该服务将会在API Key所在的environment中的相关Rancher 实例里自动被启动。

命令

如需了解关于命令和选项的更多信息,请参考 rancher-compose command 文档.

命令举例

  1. bash
  2. # Creating and starting a service without environment variables and picking a stack
  3. $ rancher-compose --url URL_of_Rancher --access-key username_of_API_key --secret-key password_of_API_key -p stack1 up
  4. # To change the scale of an existing service
  5. $ rancher-compose -p stack1 scale web=3

删除服务/容器

在缺省情况下, rancher-compose 不会删除服务/容器。这意味着如果你在一行内有两个up命令,第二个up将不起作用。这是因为第一个up指令将会创建每个对象,并且让它运行。 即使你不传递 -d 选项给 up指令, rancher-compose 也不会删除你的服务。你必须使用 rm来删除一个服务。

Build

有两种方式来支持 docker build。第一种是设置 build: 到一个与Docker Remote API 中的远程参数相兼容的 git 地址或 HTTP URL。第二种方法是设置build: 到一个本地目录,build的上下文将会被上传到S3,然后在每个节点上按指令构建。

为了基于S3 的build正常工作,你必须设置AWS credentials。 我们提供了如何在rancher-compose使用S3的详细样例

Sidekicks

使用服务时, 你可能需要你所定义的服务使用volumes_fromnet来指向另外一个服务. 为了达到这个目的,你需要设置sidekick关系。 Sidekick关系使得Rancher能够像一个单元一样来伸缩和调度一组服务。举例: B是A的sidekick, 这两个服务将会被始终成对部署,服务中的容器数量也将始终是一样的。

另外你需要定义sidekick的情形是,你需要确保多个服务始终部署在同一个主机节点上。

为了设置sidekick关系, 你需要为其中一个服务加上标签(label)。标签的关键字是 io.rancher.sidekicks ,其赋值是一个服务或多个服务名称。如果你需要添加多个服务作为sidekick,这些服务名称需要用逗号隔开。举例: io.rancher.sidekicks: sidekick1, sidekick2, sidekick3

为一个服务定义了sidekick之后,你将不需要在rancher-compose里设置link,因为这些这些在同一环境的服务将会自动被DNS解析到。

主服务

包含sidekick的服务被称之为主服务,其sidekick将被认为是从服务。主服务的尺寸(容器多少)将会被应用于所有在sidekick的从服务。 如果你所有服务的尺寸不一致,主服务的尺寸将会被用在所有服务上。

当为定义了sidekick的服务配置负载均衡器 时,你只能为主服务设置目标服务。Sidekick服务 不能够 被定义为目标服务。

Rancher-Compose中的Sidekick举例:

Sample configuration docker-compose.yml

  1. yaml
  2. test:
  3. tty: true
  4. image: ubuntu:14.04.2
  5. stdin_open: true
  6. volumes_from:
  7. - test-data
  8. labels:
  9. io.rancher.sidekicks: test-data
  10. test-data:
  11. tty: true
  12. command:
  13. - cat
  14. image: ubuntu:14.04.2
  15. stdin_open: true



Sample rancher-compose.yml

  1. test:
  2. scale: 2
  3. test-data:
  4. scale: 2

Rancher-Compose中的Sidekick举例:多个服务使用同一个volumes_from

如果你有多个服务使用同一个容器来做volumes_from, 你可以为主服务增加一个定义为sidekick的从服务,来使用同一个数据容器。因为只有一个容器能够被作为负载均衡的目标,所以请确保选择一个正确的服务作为主服务(即定义了sidekick标签的服务)。

  1. yaml
  2. test-data:
  3. tty: true
  4. command:
  5. - cat
  6. image: ubuntu:14.04.2
  7. stdin_open: true
  8. test1:
  9. tty: true
  10. image: ubuntu:14.04.2
  11. stdin_open: true
  12. labels:
  13. io.rancher.sidekicks: test-data, test2
  14. volumes_from:
  15. - test-data
  16. test2:
  17. tty: true
  18. image: ubuntu:14.04.2
  19. stdin_open: true
  20. volumes_from:
  21. - test-data

在Rancher中,同一个环境里的所有服务都是可以被DNS解析到的,所以并不需要为服务显示地添加链接(link),除非你需要使用一个指定的别名来做DNS解析。

Note: 目前我们不支持将sidekick链接到主服务或者主服务连接到sidekick。更多信息,请参考Rancher内置DNS的工作原理.

属于同一个应用栈的服务,任何服务可以按照自己原有的 服务名称被DNS解析到, 当然,你可以定义链接,如果你希望为某一个服务定义别名的话。

docker-compose.yml的一个例子

  1. wordpress:
  2. image: wordpress
  3. links:
  4. - db:mysql
  5. db:
  6. image: mysql

在这个例子中, db 将被解析为 mysql. 如果没有定义链接(link), db 将只能按db解析.

在其它应用栈中的服务,服务将会按照service_name.stack_name的格式被DNS解析。 如果你需要使用一个指定的别名做DNS解析,你需要在docker-compose.yml中定义 external_links

docker-compose.yml的一个例子

  1. wordpress:
  2. image: wordpress
  3. external_links:
  4. - alldbs/db1:mysql


在这个例子中, alldbs 应用栈中有一个 db1 服务,wordpress将会链接到它。 在 wordpress服务中, db1 将会被解析为 mysql. 如果没有定义external link, db1 将按db1.alldbs解析.

备注: 跨应用栈的服务发现只限于同一个环境之内(by design),不支持跨环境的服务发现。