Webエンジニアの日常とリーグオブレジェンド

Webエンジニアとして働いている猫のブログ。EmacsとMySQLとリーグオブレジェンド(LoL)が好物。主に技術的な記事かLoLの記事を書く。

Heroku向けのアプリケーションのローカル開発環境向けにDockerでPostgreSQLサーバーをたてる

f:id:yoshiki_utakata:20190309225112p:plain

はじめに(読み飛ばしていいです)

Herokuを使っているとPostgreSQLをよく使います。HerokuではPostgreSQLのデータベースが無料で使えるからです。MySQLを使っている人もいるでしょう。

僕は個人開発ではDockerやVagrantのようなものを使っていません。ローカルに直接PHPPythonRubyなどをインストールして開発しています。最近えはpyenvやrbenvのような、ローカル環境のrubypythonのバージョンを簡単に変更できるからです。Dockerなどを導入してもいいのですが、セットアップが面倒です。Localのほうがbrewやaptでインストールしてすぐに開発に取り掛かれるので身軽です。

しかしここで結構困ることが多いのがDBです。PCによってPostgreSQLMySQLのバージョンが違ったりなどすると面倒です。複数のプロジェクトでローカルのMySQLを使いまわしていると「こっちのプロジェクトはMySQL5.6で、こっちは5.7、こっちは8」のような状況になかなか対応できなくなってきます。

そこで、DB部分だけDockerを利用するようにします。今回はPostgreSQLを利用して、僕が開発しているプロダクトである「LGTMoon」のローカル開発環境のデータベースをDockerに置き換えたいと思います。

docker-compose.yml(ここから読んだらいいです)

ここまで長々と書きましたがやり方は簡単で、

  1. docker-compose.yml を書く
  2. dockerコンテナを立ち上げる
  3. psqlで接続する

だけです。

今回はPostgreSQLを使うことを考えます。docker-compose.ymlを以下のようにします。

postgresql:
  image: postgres:10.5
  container_name: postgresql
  ports:
    - 5432:5432
  volumes:
    - ./postgres/init:/docker-entrypoint-initdb.d
  environment:
    POSTGRES_USER: root
    POSTGRES_PASSWORD: root
    POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
  hostname: postgres
  restart: always
  user: root

今回は postgres 10.5 が入っているイメージを利用しています。environemntで POSTGRES_USERPOSTGRES_PASSWORD を指定していますが、これがローカルDBに接続するときのユーザー名とパスワードになります。userpostgresqlを起動するlinuxユーザーの名前です。特にこだわりがなければ POSTGRES_USER と同じでいいでしょう。

ports: - 5432:5432 この部分はローカルの5432ポートに来た接続をこのdockerコンテナの5432ポートに飛ばすようにしています。5432はPostgreSQLの標準のポート番号です。もしすでにローカル環境にpostgresqlが立ち上がっていると5432ポートは利用できなくなってしまうので、ローカルのpostgresqlを止めるか、 55432:5432 のようにローカルのポート番号を変えるといいでしょう。ローカルのポート番号を変えた場合は、アプリケーションの設定を変更したり、psqlのコマンド時にポート指定によって、55432 の方のポートに接続することを明示的にする必要があるので気をつけてください。

dockerを起動します。

docker-compose up -d

接続します。注意点としては、localhostだと繋がりません。ちゃんとIPで書く必要があります。

psql -U root -h 127.0.0.1

完了しました。

LGTMoonの場合

ここから、データベースを作成したあとマイグレーションSQLを流します。Dockerを立ち上げた状態で

createdb lgtmoon -O postgres -U postgres -h 127.0.0.1
psql -U postgres -h 127.0.0.1 lgtmoon < sql/create.sql

こんな感じで lgtmoonデータベースを作成してsqlを流し込むことができます。

失敗から学ぶRDBの正しい歩き方 (Software Design plus)

失敗から学ぶRDBの正しい歩き方 (Software Design plus)