OpenShift上のコンテナから外部のDBを参照する

外部のMySQLを準備する

簡単に試すため MySQLのコンテナを利用します。

MySQLの実行

sudo docker pull docker.io/mysql
sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql

3306ポートの開放

sudo iptables -A OUTPUT -p tcp --dport 3306 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

テーブル作成

MySQLのコンテナに入って、データベースとテーブルを作成します。

docker exec -it <CONTAINER_ID> bash
mysql -u root -p
Enter password: mysql  ←mysqlと入力。パスワードなので表示はされない

create database mydb;
create table hello (
msg varchar(255)
);
insert into hello(msg) values('hello opensihft');

これで、データベースは準備完了です。

アプリケーション作成

MySQLを利用するPHPのアプリケーション作成

ここでは、helloテーブルを参照するように変更したdemoブランチを指定します。

oc new-project extdbtest
oc new-app https://github.com/akubicharm/hello-php.git#demo

ルーティングの設定

アプリケーションにFQDNでアクセスするために、ルーティングの設定をします。

oc expose service hello-php --hostname=hello-php.extdbtest.apps.cloud

curl hello-php.extdbtest.apps.cloudコマンドを実行しても、DBにアクセスできないので警告が表示されます。

これで、外部のDBを参照するアプリケーションは準備完了です。

外部のDBを利用する設定

外部のDBを利用するために、サービスとエンドポイントを定義します。

サービス定義

hello-phpアプリケーションから参照するためのhello-php-mysql-serviceサービスを定義します。 ここでmetadataで指定するnameの値がhello-php-mysql-serviceであることが重要です。index.phpからDBサーバ指定する環境変数と合わせておく必要があります。

サービスのホスト名は、[サービス名を大文字にした文字列]_SERVICE_HOST という命名規則になっています。

  • index.phpの抜粋
$mysqli = new mysqli(getenv("HELLO_PHP_MYSQL_SERVICE_HOST"), getenv("MYSQL_USER"), getenv("MYSQL_PASSWORD"), getenv("MYSQL_DATABASE"));
{
    "kind": "Service",
    "apiVersion": "v1",
    "metadata": {
        "name": "hello-php-mysql"
    },
    "spec": {
        "ports": [
            {
                "name": "mysql",
                "protocol": "TCP",
                "port": 3306,
                "targetPort": 3306,
                "nodePort": 0
            }
        ]
    },
    "selector": {}
}

サービスを作成します。

oc create -f hello-php-mysql-service.json

エンドポイント定義

hello-php-mysql-serviceサービスのエンドポイント(DBサーバ)を定義します。 subsetsで、DBサーバのIPアドレス、ポート番号を指定します。subsets->portsで定義しているname(ここでは、mysql)は、サービスのspecで定義したnameに合わせます。

  • エンドポイントの定義 [hello-php-mysql-endpoint.json]
{
  "kind": "Endpoints",
  "apiVersion": "v1",
  "metadata": {
    "name": "hello-php-mysql"
  },
  "subsets": [
    {
      "addresses":  [
        { "IP": "192.168.232.101" }
      ],
      "ports":  [
        { "port": 3306, "name": "mysql" }
      ]
    }
  ]
}

エンドポイントを作成します。

oc create -f hello-php-mysql-endpoint.json

デプロイメントコンフィグの抽出

deploymentConfig(dc)をJSON形式で抽出します。

oc export dc hello-php -o json > hello-php-dc.json

デプロイメントコンフィグの定義

保存したhello-php-dc.jsonを編集し、hello-phpアプリケーションから利用する環境変数名を定義します(65〜78行目)。実際の値はoc envコマンドで定義します。

  • 編集したデプロイメントコンフィグの抜粋
    55                   "containers": [
    56                      {
    57                          "name": "hello-php",
    58                          "image": "172.30.131.34:5000/extdbtest/hello-php@sha256:bb766f1c8fc7aab47fce0ce9bccb24e1a18fb692e4c8ddd33c40c994c0587e00",
    59                          "ports": [
    60                              {
    61                                  "containerPort": 8080,
    62                                  "protocol": "TCP"
    63                              }
    64                          ],
    65                          "env": [
    66                            {
    67                              "name": "MYSQL_USER",
    68                              "value": "${MYSQL_USER}"
    69                            },
    70                            {
    71                              "name": "MYSQL_PASSWORD",
    72                              "value": "${MYSQL_PASSWORD}"
    73                            },
    74                            {
    75                              "name": "MYSQL_DATABASE",
    76                              "value": "${MYSQL_DATABASE}"
    77                            }
    78                          ],
    79                          "resources": {},
    80                          "terminationMessagePath": "/dev/termination-log",
    81                          "imagePullPolicy": "Always"
    82                      }
    83                  ],

デプロイメントコンフィグの更新

デプロイメントコンフィグを更新します。更新するとLATEST VERSIONが1つインクリメントされます。

oc replace --force -f hello-php-dc.json

環境変数の設定

まず、環境変数が設定されていないことを確認します。

oc env dc/hello-php --listを実行すると、以下のように出力されます。

# deploymentconfigs hello-php, container hello-php
MYSQL_USER=${MYSQL_USER}
MYSQL_PASSWORD=${MYSQL_PASSWORD}
MYSQL_DATABASE=${MYSQL_DATABASE}

oc envコマンドで環境変数を設定します。

oc env dc hello-php -e MYSQL_USER=root  -e MYSQL_PASSWORD=mysql  -e MYSQL_DATABASE=mydb

再度oc env dc/hello-php --listを実行すると、環境変数が設定されていることを確認できます。

# deploymentconfigs hello-php, container hello-php
MYSQL_USER=root
MYSQL_PASSWORD=mysql
MYSQL_DATABASE=mydb

アプリケーションの確認

curl hello-php.extdbtest.apps.cloud コマンドを実行すると、以下のように表示されます。

<h1>Hello External DB</h1>array(1) {
  ["msg"]=>
  string(15) "hello opensihft"
}

設定の詳細はOpenShift v3 Developer GuideChapter 9. Integrating External Services - Red Hat Customer Portalをみてください。