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に合わせます。
{ "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をみてください。