タグ:Docker | Google Cloud Platform | Google Cloud SQL
Dockerのキャッチアップがてら色々と試してみたくてローカルのDocker環境とデプロイ先のデータベースを統一させたいのでGoogle Cloud SQLを使います。
とはいえ現実的に開発環境と本番環境のDBを同じにするメリットもないのでDocker環境内にWordpressを作り、そのDBをローカルでもサーバー上でも共有できるようにすることを目的とします。
まずは自分のPCからgcloudコマンドを使えるようにするためにSDKをインストール。Winの場合はこちらから、Macの場合はこちらから。
ダウンロードした圧縮ファイルをMacで解凍&新規プロジェクト作成までは以下の手順。
# ターミナルでダウンロードフォルダをHOMEディレクトリで解凍
tar -xzvf Downloads/ダウンロードしたファイル -C $HOME
$HOME/google-cloud-sdk/install.sh
--> 1. SDKにフィードバック許可するか?
--> 2. パスを通してコマンドを有効化するか?
--> 3. 設定ファイルの場所(そのままエンター)
# パス設定を更新
% source ~/.zshrc
# インストールを確認
$ gcloud version
--> Google Cloud SDK 327.0.0
# componentsをupdate
$ gcloud components update
# Googleアカウントでログイン
$ gcloud auth login アカウント名
# 対象アカウントのプロジェクト一覧
$ gcloud projects list
# 新規プロジェクト作成
gcloud projects create <PROJECT NAME ID>
# 作成したプロジェクトを作業対象に設定
% gcloud config set project <PROJECT NAME ID>
コンパネからでも作成できますがとりあえずコマンドから作成します
# CloudSQLインスタンス名「wordpress」を作成
$ gcloud sql instances create wordpress \
--activation-policy=ALWAYS \
--tier=db-f1-micro \
--region=asia-northeast1
# 「wordpress」インスタンスに[wp-db]テーブルを作成
$ gcloud sql databases create wp-db --instance wordpress
# CloudSQLユーザー情報設定
$ gcloud sql users set-password root --host=% --instance wordpress --password=<SQL PASSWORD>
activation-policy
はインスタンス接続のデフォ設定でtier
はマシンタイプのスペックによって料金が変わるので詳細はここを参照region
は後から変更できないので「asia-northeast1(東京)」に設定最初のコマンドからインスタンの作成が完了するまで5〜10分ほどかかります。
インスタンスが作成されたらwordpress用のテーブル、wp-db
とrootユーザー情報を設定します
Docker環境からCloud SQLに接続するためにプロキシを導入しますが
その前にwebアプリからCloud SQLの使用を許可するためのサービスアカウントを作成します。
サービスアカウントキーを元にローカル環境からCloud SQLを操作するために、メニューの「APIとサービス」からCloud SQL Admin APIを有効に設定します。
# cloud_sql_proxyインストール
$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
# cloud_sql_proxyファイルに実行権限を付与
$ chmod +x cloud_sql_proxy
# 作成したインスタンスの情報が不明な場合は下記コマンドでconnectionNameを参照
$ gcloud sql instances describe <INSTANCE_NAME>
# 作業環境からプロキシを実行
./cloud_sql_proxy \
-instances=<PROJECT_ID>:asia-northeast1:wordpress=tcp:13306 \
-credential_file=作業ディレクトリのパス/key.json
# プロキシ実行できたらローカルからCloud SQLに接続確認
$ mysql --socket :/cloudsql/<PROJECT_ID>:asia-northeast1:wp-db -u root -p
プロキシのコマンドを実行するとSequel Proなどの外部MySQLクライアントツールからCloudSQLに接続が可能になります。
その場合は自身のマシンからの接続になるのでホストは127.0.0.1になります
後述のDockerからの接続と競合しないように起動コマンドのポートは13306にしてあります
# CloudShellから接続
$ gcloud sql connect wordpress --user=root --quiet
# 設定情報を確認
$ gcloud sql instances describe wordpress
さて、ようやく本題ですが実際はファイル起動するだけなんでやることはほぼ無いです。Docker Desktopのダウンロードはこちらから
作業フォルダ内にwordpressフォルダを作成してその中に公式イメージからwordpressのファイルを入れます
version: '3'
services:
wordpress:
image: wordpress:latest # 最新公式イメージを利用
container_name: wordpress
volumes:
- ./wordpress/:/var/www/html/ # マウントするディレクトリを指定
ports:
- "8000:80" # ポート番号の設定
restart: always
env_file: .env # 環境変数の定義に.envを利用
depends_on:
- cloud-sql-proxy # cloudsqlプロキシのボリュームをマウント
cloud-sql-proxy:
container_name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.19.1
volumes:
- ./key.json:/config/key.json
ports:
- "3306:3306"
environment:
TZ: Asia/Tokyo
restart: always
command:
["/cloud_sql_proxy",
"-instances=<PROJECT_ID>:asia-northeast1:wp-db=tcp:0.0.0.0:3306",
"-credential_file=/config/key.json"]
volumes:
wordpress:
MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=wp-db
MYSQL_USER=root
MYSQL_PASSWORD=パスワード
MYSQL_ROOT_PASSWORD=パスワード
WORDPRESS_DB_HOST=cloud-sql-proxy
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=root
WORDPRESS_DB_PASSWORD=パスワード
WORDPRESS_TABLE_PREFIX: "wp_"
composeの設定に慣れてなかったんで、wordpressのDBホストを127.0.0.1だったりCloud SQLのIPにしてもうまく接続できず結構苦戦しましたが、結果的には cloud-sql-proxy
のコンテナオブジェクト名をそのまま引き継ぐことで上手くいきました。
# 「docker-compose.yml」をもとに作成と起動
$ docker-compose up -d
# コンテナを一時停止
$ docker-compose stop
# コンテナの作成&起動
$ docker-compose up
# この環境を削除
$ docker-compose down
# composeごとのログ確認
$ docker-compose logs wordpress
Docker Desktopを利用してる場合、一番上のコマンド以外はUIで実行できるので不要ですがメモとして。
これでlocalhost:8000にアクセスでwordpressの初期設定ページが表示されるのでアカウントユーザーを作成します。
最初記事の更新ができずに焦ったのですがWordPressのパーマリンク設定で利用しているmod_rewriteの記述がある.htacessが作成されてなかったので自前でファイルを作成。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
ローカル環境でwordpressを操作するとうい事もあまりないですが、アクセスする環境ごとでサイトURLが異なるため、wp-config.phpの接続情報を2パターンに修正します
if (@$_SERVER["SERVER_NAME"] === 'localhost') {
define('DB_NAME', 'wp-db');
define('DB_USER', 'root');
define('DB_PASSWORD', 'パスワード');
define('DB_HOST', 'cloud-sql-proxy');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
// ローカル起動時のサイトURL設定
define('WP_HOME','http://localhost:8000');
define('WP_SITEURL','http://localhost:8000');
define('WP_DEBUG', true);
} else {
define('DB_NAME', 'wp-db');
define('DB_USER', 'root');
define('DB_PASSWORD', 'パスワード');
define('DB_HOST', ':/cloudsql/<PROJECT_ID>:asia-northeast1:wordpress');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
// 本番環境起動時のサイトURL設定
define('WP_HOME','本番環境のドメイン');
define('WP_SITEURL','本番環境のドメイン');
define('WP_DEBUG', false);
}
今後はこの辺もちゃんとDockerfileで自動生成させないといけないですね