パパエンジニアのポエム

奥さんと娘ちゃんへの愛が止まらない

GCEとCloudSQLとDockerでmetabase

metabaseってなんぞ?

データ可視化OSSです OSSのデータ可視化ツール「Metabase」が超使いやすい ちょっとつかってみた感じ、すこぶる良いです データ分析は全部こいつにぶん投げるのがとてもよさそう

GCE(Container-Optimized OS)作成

インスタンスの作成と設定  |  Container-Optimized OS  |  Google Cloud * コンソールのブートディスクからContainer-Optimized OSを選択する * CloudSQLに接続可能なサービスアカウントCloudSQLClientを作成し設定する(詳細省略) * HTTP/HTTPSを開ける

ユーザー定義bridgeネットワーク作成

metanetというbridgeネットワークを作成し各コンテナの起動時に指定する これで同一ネットワーク内でコンテナを起動できる

docker network create -d bridge metanet

CloudSQLへのプロキシコンテナ作成

Cloud SQL Proxy Docker イメージを使用して MySQL クライアントを接続する  |  Cloud SQL for MySQL  |  Google Cloud

docker pull gcr.io/cloudsql-docker/gce-proxy:1.11

PAY.JP API リファレンス

docker run --name cloud_sql_proxy --net=metanet -d \
-v /mnt/stateful_partition/cloudsql:/cloudsql \
-p 3306:3306 \
gcr.io/cloudsql-docker/gce-proxy:1.11 /cloud_sql_proxy \
-instances=planet-pluto-dev:asia-northeast1:mysql-dev=tcp:0.0.0.0:3306

ここでのポイントはポートをホストのローカル127.0.0.1でバインドする必要がないこと metanet経由のコンテナ間通信を行い、ポート3306でCloudSQLにプロキシ接続する あとは--net=metanet を指定するのを忘れないこと

metabase コンテナ作成

docker run -d -p 80:3000 --name metabase --net=metanet metabase/metabase

同じように--net=metanet を指定する

PINGで疎通確認

これで、metanet内ではコンテナ名で名前解決可能になる コンテナ内からPINGで疎通確認

docker exec -it metabase /bin/bash
ping cloud_sql_proxy

疎通できていたらmetabaseからMySQLをDBに設定

HOST : cloud_sql_proxy
PORT : 3306

で接続できるはず

おまけ

ちなみに最初は docker-compose を使って接続していた ただContainer-Optimized OSにdocker-compose をインストールするのが手間なので、オススメしない Running Docker Compose with Docker  |  Google Cloud Platform Community  |  Google Cloud 一応そのときのdocker-compose.ymlを貼っとく

version: '2'
services:
cloud_sql_proxy:
image: gcr.io/cloudsql-docker/gce-proxy:1.11
container_name: cloud_sql_proxy
command:
- "/cloud_sql_proxy"
- "-instances=planet-pluto-dev:asia-northeast1:mysql-dev=tcp:0.0.0.0:3306"
volumes:
- /mnt/stateful_partition/cloudsql:/cloudsql
ports:
- "3306:3306"
metabase:
image: metabase/metabase
container_name: metabase
volumes:
- /mnt/stateful_partition/tmp:/tmp
environment:
- "MB_DB_FILE=/mnt/stateful_partition/metabase.db"
ports:
- "80:3000"