複数プロダクトで使うコンテナをまとめて立ち上げるdocker-composeを作成して、環境構築をラクにした!

GA technologies Boosterチームの浜野です。一番好きな食べ物はさつまいもです🍠この季節になるとスーパーに行くだけで焼き芋の香りがして誘惑に打ち勝つのが大変です。🍠

さて…Boosterチームでは、自社の不動産取引の様々なフェーズを効率化するプロダクトを複数開発しています。 例えば

  • 物件の仕入を効率化するもの

  • 営業を効率化するもの

  • 賃貸管理を効率化するもの

  • 経理を効率化するもの etc.

そこで発生するのが、環境構築ダルすぎ問題です。

今は基本的に各々担当のプロダクトがありますので、dockerを使用してその1つを構築する分には問題ないのですが…… いざ、他のプロダクトと連携したり複数のプロダクトの開発を並行してやることになると、

  • それぞれのプロダクトのREADME通りに環境構築していたら同じDBが違うコンテナで複数立っちゃうので、違うプロダクトで同じDBを参照する際に不都合

  • redisやsidekiqなどもそれぞれのdocker-composeに書いているので、競合してしまって上手く動かないことが多々

  • 同一DBでもリストア方法が各プロダクト毎に微妙に違うので、上手くいかなくて時間をとられる

などなど、特に私は複数のプロダクトにまたがる開発が多いということもあり、毎回これらが非常にストレスでした。 また、プロダクトが属人的になってしまうのも良くないということで、チームとしても今後は皆が複数プロダクトを触るような環境を整えていこう的な気配を察しましたので

  • 共通のDBコンテナを立ち上げる用の docker-compose.yml
  • 各プロダクトのDBをリストアするスクリプト

を作成し、誰が、どれだけプロダクトを触っても爆速で環境構築ができるようにしました!! (正確には、スクリプトは先輩である ryskito (Ryosuke Ito) · GitHub 先生が書いて下さいました)

before & after としては↓のような感じです。

f:id:kaobaba:20191018193959p:plain
docker-design

また、参考までに共通の docker-compose.yml は↓

version: '3'
services:
  crmDB:
    image: mdillon/postgis:9.6-alpine
    container_name: crmDB
    ports:
      - 15432:5432
    environment:
      POSTGRES_DB: crm
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_INITDB_ARGS: --encoding=UTF-8
    volumes:
      - postgresql_data:/var/lib/postgresql/data
    networks:
      - common_db_docker
  redis:
    image: redis
    container_name: redis
    ports:
      - 6379:6379
    volumes:
      - redis:/data
    command: redis-server --appendonly yes
    networks:
      - common_db_docker
volumes:
  postgresql_data:
    driver: local
  redis:
    driver: local
networks:
  common_db_docker:
    external: true

(ポートを 15432 にしているのは、ローカルでpostgresを立ち上げている場合にバッティングしないためです)

ポイントとしては、

  • 同一の docker network 下にコンテナを置くと、コンテナ名をホスト名として指定できる

Docker コンテナ・ネットワークの理解 — Docker-docs-ja 17.06.Beta ドキュメント

例えば、各プロダクトのアプリケーションコンテナにおけるDBのURLは APP_DATABASE_URL: postgres://postgres:postgres@crmDB:5432/crm となります。

まとめ

共通の docker-compose.yml とリストアスクリプトによって環境構築をラクにした話でした。(タイトルを復唱) もっと細かく、どういったコードを書いてどのような手順で環境構築すればいいかが知りたい、という声がありましたら、続きの記事を書こうと思います!

それでは、最後までお読みいただきありがとうございました!