开始使用

    本文档假定你的 Flynn 集群使用这个默认域名(如果你安装的是演示环境)。如果你使用自定义的域名,请在 Flynn 启动时,设置CLUSTER_DOMAIN参数的值,替换掉默认的demo.localflynn.com

    下面我们将部署一个使用 Node.js 编写的演示程序,它自带了一个最简单功能的 HTTP 服务器。

    首先使用 Git 将代码 clone 到本地:

    进入本地的代码目录,创建一个 Flynn 应用:

    1. $ cd nodejs-flynn-example
    2. $ flynn create example
    3. Created example

    上面的命令会增加一个 Flynn 的 Git 远程分支。

    1. $ git remote -v
    2. flynn https://git.demo.localflynn.com/example.git (push)
    3. flynn https://git.demo.localflynn.com/example.git (fetch)
    4. origin https://github.com/flynn/nodejs-flynn-example.git (fetch)
    5. origin https://github.com/flynn/nodejs-flynn-example.git (push)

    同时还会增加一个默认路由,将example.demo.localflynn.com指向example-web服务。

    1. $ flynn route
    2. ROUTE SERVICE ID
    3. http:example.demo.localflynn.com example-web http/1ba949d1654e711d03b5f1e471426512

    推送 Flynn 远程分支,来部署应用:

    1. $ git push flynn master
    2. ...
    3. -----> Building example...
    4. -----> Node.js app detected
    5. ...
    6. -----> Creating release...
    7. =====> Application deployed
    8. =====> Added default web=1 formation
    9. To https://git.demo.localflynn.com/example.git
    10. * [new branch] master -> master

    现在应用已经部署成功,可以使用上面创建的域名来访问:

    1. $ curl http://example.demo.localflynn.com
    2. Hello from Flynn on port 55006 from container d55c7a2d5ef542c186e0feac5b94a0b0

    应用扩展

    Flynn 里部署的应用会在根目录下生成一个Procfile配置文件,在此文件中定义该应用的类型。比如上文中部署的演示程序,它的配置中声明这是一个web应用,入口可执行程序是web.js

    1. $ cat Procfile

    web类型的应用默认的配置是启动一个web进程,这可以在 Flynn 里用ps命令查看:

    1. $ flynn ps
    2. ID TYPE
    3. flynn-d55c7a2d5ef542c186e0feac5b94a0b0 web

    使用ps命令可以看到现在启动了三个进程:

    1. ID TYPE
    2. flynn-7c540dffaa7e434db3849280ed5ba020 web
    3. flynn-3e8572dd4e5f4136a6a2243eadca5e02 web
    4. flynn-d55c7a2d5ef542c186e0feac5b94a0b0 web

    重复访问部署的 web 服务,可以看到启动的三个进程会自动进行负载均衡:

    1. $ curl http://example.demo.localflynn.com
    2. Hello from Flynn on port 55006 from container d55c7a2d5ef542c186e0feac5b94a0b0
    3. $ curl http://example.demo.localflynn.com
    4. Hello from Flynn on port 55007 from container 3e8572dd4e5f4136a6a2243eadca5e02
    5. $ curl http://example.demo.localflynn.com
    6. Hello from Flynn on port 55008 from container 7c540dffaa7e434db3849280ed5ba020
    7. $ curl http://example.demo.localflynn.com
    8. Hello from Flynn on port 55007 from container 3e8572dd4e5f4136a6a2243eadca5e02

    可以使用log命令来查看任务日志(例如:stdout/stderr):

    1. $ flynn log flynn-d55c7a2d5ef542c186e0feac5b94a0b0
    2. Listening on 55006

    关于flynn log命令的详细介绍可以访问。

    应用发布

    在 git 里提交更新,同时推送到 Flynn 里就可以创建应用的新发布。在web.js里最上面增加下面一行:

    1. console.log("I've made a change!")

    在 git 里提交更新到 Flynn:

    1. $ git add web.js
    2. $ git commit -m "Add log message"
    3. $ git push flynn master

    一旦更新成功,你会看到三个新的进程:

    1. $ flynn ps
    2. ID TYPE
    3. flynn-cf834b6db8bb4514a34372c8b0020b1e web
    4. flynn-16f2725f165343fca22a65eebab4e230 web
    5. flynn-d7893da39a8847f395ce47f024479145 web

    这些进程的日志里能看到上面增加的信息:

    1. $ flynn log flynn-cf834b6db8bb4514a34372c8b0020b1e
    2. Listening on 55007

    创建应用时,应用的web进程会生成一个默认的HTTP路由,是默认域名的子域名(例如:example.demo.localflynn.com)。如果你想使用不同的域名,则需要增加新的路由配置。

    假如你有一个example.com域名,它指向你的 Flynn 集群(例如:它是example.demo.localflynn.comCNAME别名)。

    现在你的web应用有了两个路由:

    1. $ flynn route
    2. ROUTE SERVICE ID
    3. http:example.demo.localflynn.com example-web http/1ba949d1654e711d03b5f1e471426512

    现在访问example.com的请求会被路由到对应的web进程:

    1. $ curl http://example.com
    2. Hello from Flynn on port 55007 from container cf834b6db8bb4514a34372c8b0020b1e

    现在你可以修改应用通过 HTTP 头信息(这里是example.demo.localflynn.comexample.com)来识别不同的访问并且返回不同的内容。

    注意:HTTP 路由只能增加到默认的web应用和以-web结尾的应用类型里。例如:对于api-web类型的应用,你可以增加如下路由:

    1. $ flynn route add http -s example-api-web api.example.com
    2. http/9cfb5f1b-b174-476c-b869-71f1e03ef4b

    多进程

    到目前为止,我们的应用只有一种进程类型(例如:web进程),但在 Flynn 里部署的应用可以同时拥有多种进程类型,并且可以独立进行配置扩展。

    让我们增加一个简单的clock服务,每秒钟输出当前的时间。在clock.js里增加下面的代码:

    1. setInterval(function() {
    2. console.log(new Date().toTimeString());
    3. }, 1000);

    在应用的Procfile里指定clock的进程类型:

    1. clock: node clock.js

    发布更新:

    1. $ git add clock.js Procfile
    2. $ git commit -m "Add clock service"
    3. $ git push flynn master

    创建一个clock进程,并且查看输出:

    1. $ flynn scale clock=1
    2. $ flynn ps
    3. ID TYPE
    4. flynn-aff3ae71d0c149b185ec64ea2885075f clock
    5. flynn-cf834b6db8bb4514a34372c8b0020b1e web
    6. flynn-16f2725f165343fca22a65eebab4e230 web
    7. flynn-d7893da39a8847f395ce47f024479145 web
    8. $ flynn log flynn-aff3ae71d0c149b185ec64ea2885075f
    9. 18:40:42 GMT+0000 (UTC)
    10. 18:40:43 GMT+0000 (UTC)
    11. 18:40:44 GMT+0000 (UTC)
    12. 18:40:45 GMT+0000 (UTC)
    13. 18:40:46 GMT+0000 (UTC)

    单次运行的交互式进程可以在容器里用命令创建: