如何使用Dokku一键DigitalOcean映像运行PHP应用程序

Dokku是快速部署应用到生产环境的简便方法。它使用Docker,Linux的容器系统,以保持隔离,轻松部署应用程序实例和git推从开发环境的变化。在本文中,我们将展示如何部署PostgreSQL数据库一个简单的PHP应用程序。

注:Dokku项目自本指南编写以来发生了重大变化。 以下说明可能无法反映Dokku项目的当前状态。

介绍


在开发应用程序一个显著的障碍是提供一个健全的和简单的方法来部署您的成品。Dokku是平台即服务解决方案,使您能够快速部署和一个单独的服务器上配置的应用到生产环境。

Dokku与Heroku类似,可以部署到远程服务器。 不同的是,Dokku被部署到单个个人服务器,并且非常轻量级。 Dokku使用Docker(一种Linux容器系统)来轻松管理其部署。

在本指南中,我们将介绍如何使用DigitalOcean Dokku一键安装映像来部署使用Dokku的PHP应用程序。

第一步 - 创建Dokku Droplet


我们需要做的第一件事是创建包含我们的Dokku安装的VPS实例。 这是使用DigitalOcean Dokku应用程序设置简单。

点击“创建”按钮创建一个新的Droplet:

DigitalOcean创造Droplet

命名您的Droplet,并选择您要使用的大小和地区:

DigitalOcean配置Droplet1

向下滚动并单击“应用程序”选项卡。 选择Dokku应用程序映像:

DigitalOcean Dokku图像

如果您有SSH密钥可用,请选择它们。 如果你还没有他们的配置,现在是一个伟大的时间来创建SSH密钥与DigitalOceanDroplet用 此步骤将帮助您以后。

点击“创建Droplet”。 将创建您的Dokku VPS实例。

DigitalOcean最终创造

一旦你的Droplet创建,你应该设置你的域名指向你的新DokkuDroplet。 你可以学习如何与DigitalOcean配置的域名在这里。

第二步 - 访问Droplet完成配置


您可以通过从Web浏览器访问您的VPS来完成您的Dokku配置。

如果您配置了一个域名以指向您的Dokku安装,您应该使用您喜爱的网络浏览器访问您的域名。 如果您没有配置域名,您可以使用您的Droplet的IP地址。

您将获得一个简单的配置页面。 这里有一些部分需要配置。

DigitalOcean Dokku ssh键

首先,检查公共密钥,你将可以部署的计算机相匹配。 这意味着如果您的项目在您的家庭计算机上,您应该使用与该设置对应的公共密钥。

如果您在创建Droplet期间选择了多个SSH密钥进行嵌入,则只有第一个可用。 根据需要进行修改。

DigitalOcean Dokku主机名配置

接下来,修改主机名外地来匹配您的域名。 如果您没有配置域名,请将其保留为您的IP地址。

选择希望引用应用程序的方式。 默认情况下,应用程序将如下所示:

http://your_domain.com:app_specific_port_number

如果选择“为应用程序使用虚拟主机命名”复选框,则可以使用虚拟主机访问您的应用程序:

http://app_name.your_domain.com

单击“完成设置”按钮完成配置。

第三步 - 将一个简单的PHP应用程序部署到您的Dokku Droplet


现在我们已经正确配置了Dokku,我们准备开始为我们的部署做准备。 Dokku平稳地处理PHP应用程序,所以你不必为了成功启动你的应用程序而篡改你的代码。

使用Dokku创建应用程序数据库


如果您已经使用其他服务部署应用程序,您可能会熟悉的一件事是数据库与应用程序环境分离的想法。

以这种方式配置事件允许您轻松地从应用程序中离开数据,如果数据库后端或代码本身必须更新。 它还允许你在很少或没有大惊小怪的切换数据库。

为了保持精益,Dokku通过一个插件系统处理数据库资源。 我们可以安装我们需要的数据库插件,而不需要将每个单独的数据库的代码打包到我们的部署环境中。 Dokku有一个页面在自己的wiki列出可用的插件 每个都有自己的安装说明。

我们的应用程序将利用PostgreSQL数据库,所以我们将安装相关的插件。 要直接从GitHub安装PostgreSQL插件,请运行:

dokku plugin:install https://github.com/dokku/dokku-postgres.git

这将下载和配置所有必要的包为Dokku在应用程序中集成PostgreSQL功能。 如果我们查看Dokku帮助命令,我们可以看到新的数据库命令已经可供我们使用:

dokku help

. . .
plugins         Print active plugins
postgres:create <app>     Create a PostgreSQL container
postgres:delete <app>     Delete specified PostgreSQL container
postgres:info <app>       Display database informations
postgres:link <app> <db>  Link an app to a PostgreSQL database
postgres:logs <app>       Display last logs from PostgreSQL container
run <app> <cmd>                                 Run a command in the environment of an application
. . .

我们将创建一个数据库,现在我们的应用程序可以钩在它一旦部署。 这是我们需要决定我们的应用程序的名称的点。 如果在Dokku配置期间设置虚拟主机,应用程序的名称将显示在到达它的URL中:

dokku postgres:create php_app

它将为您提供访问此数据库的连接信息。 在大多数情况下,你将不再需要连接到使用该信息,因为当你的应用程序部署,这些信息是在叫做环境变量中的一个格式化的URL访问数据库DATABASE_URL

填写应用程序数据


我们的PHP应用程序将非常简单和直接。 事实上,它将是如此简单,它不会包括在我们的数据库中插入数据的方法,只查询它。

要解决这个问题,我们将使用几个数据块来填充我们的数据库,以便我们以后可以查询。 这通常不是必需的。 这只是为了示范。

首先,在DokkuDroplet上安装PostgreSQL实用程序,以便我们可以连接到数据库:

apt-get install postgresql

现在,我们需要获取在数据库配置期间作为输出提供的那些连接参数。 我们可以通过键入:

dokku postgres:info php_app
    DSN: postgres://postgres:d257ed7158ae9a01339615aef4a3f871@172.17.0.43:5432/php_app

然后,我们可以使用连接到数据库psql命令,这里替换数据:

psql -h postgres://postgres:d257ed7158ae9a01339615aef4a3f871@172.17.0.43:5432/php_app

你会得到一个PostgreSQL提示符。

我们将创建一个简单的表,我们可以使用它来查询:

CREATE TABLE picnic (
    item_id SERIAL,
    item_name VARCHAR(30),
    item_quantity INTEGER
);

现在,在表中插入几个值:

INSERT INTO picnic (item_name, item_quantity) VALUES
    ('sandwich', 6),
    ('root_beer', 4),
    ('water', 2),
    ('salad', 6),
    ('potato_chips', 3),
    ('grapes', 50);

退出PostgreSQL,以便我们可以继续:

\q

创建或配置您的PHP应用程序


在我们的开发机器(无论哪个计算机都有与您在Dokku设置期间输入的SSH密钥相匹配的SSH密钥),我们将开发我们的PHP应用程序。

为了本教程的目的,我们假设你是在Ubuntu 12.04 VPS上开发的,但它可以真正是任何机器,只要你可以在其上安装git。 如果你的开发计算机运行Ubuntu,你还没有安装git,现在安装:

sudo apt-get install git

因为它确实表明,用于连接到存储在其凭据的PostgreSQL数据库的策略的一个伟大的工作,我们会得到从GitHub一个简单的PHP应用程序DATABASE_URL环境变量。

克隆用户主目录中的存储库,然后输入应用程序目录,如下所示:

cd ~
git clone https://github.com/kch/heroku-php-pg.git php_app
cd php_app

现在,我们将检查index.php文件并修改它一点点地使用我们刚刚创建的表:

nano index.php

在我们进行任何更改之前,我想指出作者用于连接到数据库的方法:

function pg_connection_string_from_database_url() {
    extract(parse_url($_ENV["DATABASE_URL"]));
    return "user=$user password=$pass host=$host dbname=" . substr($path, 1);
}

$pg_conn = pg_connect(pg_connection_string_from_database_url());

pg_connection_string_from_database_url功能用于解析DATABASE_URL环境变量并分配相关件与该PHP连接到PostgreSQL数据库的方式重合的变量。

让我进一步分析:

  • $_ENV["DATABASE_URL"] :提供了访问DATABASE_URL环境变量
  • parse_url :创建一个包含URL的组成部分的关联数组
  • extract :这进口变量数组到符号表

结果是,我们将建立数据库连接所需的参数与变量相关联。 然后我们将这些函数作为PHP PostgreSQL库识别为连接信息的变量名。

这些变量被传递给pg_connect函数,它返回一个表示开放式数据库连接的对象。

现在您已经了解了PHP如何建立与数据库的连接,我们将修改此行中包含的查询字符串:

$result = pg_query($pg_conn, "SELECT relname FROM pg_stat_user_tables WHERE schemaname='public'");

注释这行,然后在它下面写一个新的查询字符串,它将使用我们刚刚创建的表:

$result = pg_query($pg_conn, "SELECT item_name,item_quantity from picnic;");

我们还将更改一些打印的行以更好地反映我们的内容。 查找当前打印表名称的部分:

print "Tables in your database:\n";
while ($row = pg_fetch_row($result)) { print("- $row[0]\n"); }

我们要修改第一行,以便将我们的内容正确标记为野餐项目。 我们也想改变第二行,不仅打印行中的第一个项目( $row[0]也是第二个项目,这样我们就可以看到我们的野餐每种食物的数量有关:

// print "Tables in your database:\n";
// while ($row = pg_fetch_row($result)) { print("- $row[0]\n"); }
print "Items in your picnic:\n";
while ($row = pg_fetch_row($result)) { print("- $row[0] -> $row[1]\n"); }

保存并关闭文件。

因为我们从GitHub克隆这个项目,它已经在版本控制,但我们需要添加我们的新的更改到存储库:

git add .
git commit -m 'Modify database connection and printing'

我们的应用程序是完整的,我们的git存储库是完整的。

将您的PHP应用程序部署到Dokku


该应用程序现在的地步,它已经准备好生产。 我们在我们的DokkuDroplet上创建了一个PostgreSQL数据库,将为这个应用程序提供服务。 所有剩下要做的是实际部署应用程序。

要部署我们的应用程序到Dokku,我们需要做的是git push我们的文件到DokkuDroplet。 Dokku将自动配置和启动我们的应用程序。 第一步是添加DokkuDroplet作为我们的应用程序的git远程。

git remote add remote_name dokku@your_domain.com:php_app

在这种情况下, remote_name可以是任何你想。 它只是一个标签,用于本地计算机上,以引用您的DokkuDroplet。 在大多数情况下,像“dokku”或“production”这样的名称将是适当和描述性的。

然而, php_app标签很重要,因为它必须符合您选择了你的数据库的名称。 这也是决定如何通过虚拟主机访问您的应用程序的一部分。

现在,通过将应用程序推送到Dokku来部署它:

git push remote_name master

您应该在本地计算机上看到Dokku输出。 最后,它将提供您可以用来访问您的应用程序的URL:

       Default process types for PHP (classic) -> web
-----> Releasing php_app ...
-----> Deploying php_app ...
-----> Cleaning up ...
=====> Application deployed:
       http://php_app.your_domain.com

To dokku@your_domain.com:php_app
   e2b2547..5dfaed7  master -> master

如果您在Web浏览器中访问此页面,您应该能够看到我们的PHP应用程序的结果:

http://php_app.your_domain.com

Dokku PHP应用程序部署

结论


您现在已经部署了一个PHP应用程序到您的DokkuDroplet。 虽然我们的示例应用程序相当简单,但您可以看到通过Dokku的插件系统如何轻松地将数据库绑定到您的应用程序。 您可以在更复杂的示例中应用我们在此处使用的相同步骤。 Dokku将负责其余的配置和部署。

作者:Justin Ellingwood