昨年から自作サービスの多くを dokku 環境で公開しています。このブログでも何件かの dokku 関連ネタを紹介しています。今回のネタはその1つです:

dokku を使うことで、ウェブアプリケーションだけでなく PostgreSQL のようなデータベースインスタンスを作って利用することもできます。実際に PostgreSQL データベースを作ってウェブアプリケーションと接続(link)して使う方法をブログエントリとして紹介したこともあります:
http://dotnsf.blog.jp/archives/1080505175.html
最終的に dokku で公開するアプリケーションに関しては dokku アプリから dokku の PostgreSQL に接続して使うことになります。この場合はアプリとデータベースとを link することで、アプリケーション側の環境変数 DATABASE_URL に
のような接続文字列の値が設定されます(ホスト名 dokku-postgres-mydb、ポート番号 5432、ユーザー名 postgres、パスワード password、DB名 mydb)。この値を使ってデータベースに接続することになります(ホスト名 dokku-postgres-mydb という値は dokku 内部で解決されて、アプリケーションサーバーと同じ dokku 内で動いている PostgreSQL データベースコンテナに接続されます)。この時点では PostgreSQL データベースは dokku 内のアプリケーションだけに公開されていることになります。
ただアプリケーションを一時的に localhost で起動して、localhost から dokku の PostgreSQL に接続して動作確認したくなることもあります(デバッグ時など)。そのようなことをする場合、dokku 内に作った PostgreSQL を dokku 外の(localhost の)アプリケーションから接続することになり、上述の(dokku 内のアプリケーションから接続する前提の)接続文字列を使うことはできません。このような接続設計を実現するための設定を紹介します。
まず PostgreSQL データベースインスタンス(mydb)を作成します:
この mydb への(link した dokku アプリからの)接続文字列を確認するには以下のようなコマンドを実行します。実行結果の Dsn 値に対象の接続文字列を確認できます:
この mydb データベースを dokku 外部から利用するには expose コマンドを実行します:
すると実行結果に(↑の例だと) 5432->31157 という結果が表示されます。この 31157 というのが dokku 外部からこの mydb に接続するための(外向けの)ポート番号となります。仮にこの dokku が動いているホストの名前が dokku.myserver.com であったとすると、外部アプリからの接続文字列は
を指定すればよい、ということになります。

dokku を使うことで、ウェブアプリケーションだけでなく PostgreSQL のようなデータベースインスタンスを作って利用することもできます。実際に PostgreSQL データベースを作ってウェブアプリケーションと接続(link)して使う方法をブログエントリとして紹介したこともあります:
http://dotnsf.blog.jp/archives/1080505175.html
最終的に dokku で公開するアプリケーションに関しては dokku アプリから dokku の PostgreSQL に接続して使うことになります。この場合はアプリとデータベースとを link することで、アプリケーション側の環境変数 DATABASE_URL に
postgres://postgres:password@dokku-postgres-mydb:5432/mydb
のような接続文字列の値が設定されます(ホスト名 dokku-postgres-mydb、ポート番号 5432、ユーザー名 postgres、パスワード password、DB名 mydb)。この値を使ってデータベースに接続することになります(ホスト名 dokku-postgres-mydb という値は dokku 内部で解決されて、アプリケーションサーバーと同じ dokku 内で動いている PostgreSQL データベースコンテナに接続されます)。この時点では PostgreSQL データベースは dokku 内のアプリケーションだけに公開されていることになります。
ただアプリケーションを一時的に localhost で起動して、localhost から dokku の PostgreSQL に接続して動作確認したくなることもあります(デバッグ時など)。そのようなことをする場合、dokku 内に作った PostgreSQL を dokku 外の(localhost の)アプリケーションから接続することになり、上述の(dokku 内のアプリケーションから接続する前提の)接続文字列を使うことはできません。このような接続設計を実現するための設定を紹介します。
まず PostgreSQL データベースインスタンス(mydb)を作成します:
# dokku postgres:create mydb
この mydb への(link した dokku アプリからの)接続文字列を確認するには以下のようなコマンドを実行します。実行結果の Dsn 値に対象の接続文字列を確認できます:
# dokku postgres:info mydb =====> mydb postgres service information Config dir: /var/lib/dokku/services/postgres/mydb/data Config options: Data dir: /var/lib/dokku/services/postgres/mydb/data Dsn: postgres://postgres:password@dokku-postgres-mydb:5432/mydb Exposed ports: - Id: 1f5692d21aeb94de6f7bd9f467c41e2a52d6ee9fdff4d628379c883f72d25f9e Internal ip: 172.17.0.29 Links: - Service root: /var/lib/dokku/services/postgres/mydb Status: running Version: postgres:14.2
この mydb データベースを dokku 外部から利用するには expose コマンドを実行します:
# dokku postgres:expose mydb -----> Service mydb exposed on port(s) [container->host]: 5432->31157
すると実行結果に(↑の例だと) 5432->31157 という結果が表示されます。この 31157 というのが dokku 外部からこの mydb に接続するための(外向けの)ポート番号となります。仮にこの dokku が動いているホストの名前が dokku.myserver.com であったとすると、外部アプリからの接続文字列は
postgres://postgres:password@dokku.myserver.com:31157/mydb
を指定すればよい、ということになります。
コメント