例えばPostgreSQLを使う際、本番環境ではRDSを使うけど、開発環境ではRDSは使いたくない、けれどもMarketplaceになくてセットアップするのが面倒。という時に、Docker Imageを使ってPostgreSQLをCloud Foundryにデプロイできます。 通常のCloud FoundryアプリケーションではHTTPリクエストしか受け付けられませんが、 Container to Container Networkingを使うことでコンテナ間はTCP/UDPアクセス可能です。
つまり、Docker + Container to Container NetworkingでPostgreSQLをCloud Foundryにデプロイしてアプリケーションからアクセスすることが可能です。 ただし、永続ボリュームではないのでコンテナをリスタートするたびにデータは消滅しますので、ちょっとした開発用やデモ用途限定です。
PostgreSQLのデプロイ
次のmanifest.yml
を用意します。
applications:
- name: postgres
health-check-type: process
memory: 256m
docker:
image: postgres:9.6.10
routes:
- route: postgres.apps.internal
env:
POSTGRES_USER: vcap
POSTGRES_PASSWORD: my-secret
POSTGRES_DB: demo
PGDATA: /tmp/data
POSTGRES_INITDB_ARGS: --encoding=UTF-8 --locale=C
デプロイします。
Docker Imageのデプロイが有効で、かつCloud FoundryのService Discoveryが使えることが必須です。
cf push
これでPostgreSQLがデプロイできました。apps.internal
ドメインを使うのがポイントです。
外向けにはルーティングされません。
ちなみに、TCP Routingの機能を利用すれば外向けにルーティング可能です。
アプリのデプロイ
次のmanifest.yml
を用意します。Spring Bootで作ったアプリを前提としています。
applications:
- name: demo
path: target/demo-0.0.1-SNAPSHOT.jar
env:
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres.apps.internal:5432/demo
SPRING_DATASOURCE_USERNAME: vcap
SPRING_DATASOURCE_PASSWORD: my-secret
--no-start
をつけてデプロイします。その後、demo
からpostgres
へのネットワークポリシーを定義し、5432ポートへのアクセスを許可します。
そしてstartします。
cf push --no-start
cf add-network-policy demo --destination-app postgres --protocol tcp --port 5432
cf start demo