Dockerの開発環境構築その1-DockerComposeの解説

この投稿は、弊社が提供するWESEEK TECH通信の一環です。
WESEEK TECH通信とは、WESEEKのエンジニアがキャッチアップした技術に関する情報を、techブログを通じて定期的に発信していくものです。

はじめに

はじめまして、私は都内でシステムエンジニアとして働いており、主に Ruby, JavaScript を用いた Web アプリケーションの開発を行っています。
私の職場では 1~2 年くらい前からだんだんと Docker を使う機会が増え、最近ではほぼ全てのプロジェクトで Docker を使用して開発を行うようになりました。
それほどまでに Docker という技術は便利なものとなっており、今後も長い間使われると思っています。
そんなわけで今回から2回に渡って DockerCompose, Dockerfile の説明と Docker での Rails の開発環境構築について説明します。
今回の記事では Docker とは一体どういうものなのかと DockerCompose.yml の各種書式についての説明を行います。

Docker とは

Docker はコンテナ型の仮想環境を構築するための軽量なプラットフォームです。Docker はコンテナと呼ばれる仮想マシンをホストOS上に立ち上げます。これによりアプリケーションをすばやく構築、テスト、デプロイすることができます。
Docker によって作成されたコンテナは実行環境として独立しており外部からの影響を受けないため、docker-compose.yml や Dockerfile を共有するだけで全員が全く同じ環境を構築することができます。
従来の仮想化技術とは違いゲストOSを立ち上げないため、従来のと比較して非常に軽量であることも大きな特徴です。

Docker Compose

Docker Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。
コンテナの起動に必要な複雑な設定を YAML 形式で docker-compose.yml に設定することで、1つのコマンドを実行するだけで設定内容に基づいたアプリケーションサービスの生成、起動を行うことができます。

今回は Rails の開発環境を構築するために、Rails とデータベースである Postgres の計2つのコンテナを作成します。

docker-compose.yml

    version: '3.8'

    services:
      rails:
        build:
          context: .
          dockerfile: Dockerfile
        container_name: rails
        depends_on:
          - postgres
        ports:
          - 3000:3000
        volumes:
          - .:/app:delegated
          - bundle:/app/vendor/bundle
        tty: true
        stdin_open: true
      postgres:
        container_name: postgres
        image: postgres:12.4
        environment:
          POSTGRES_USER: POSTGRES_USER
          POSTGRES_PASSWORD: POSTGRES_PASSWORD
        ports:
          - 5432:5432
        volumes:
          - postgres_data:/var/lib/postgresql/data

    volumes:
      bundle:
        driver: local
      postgres_data:
        driver: local

version

フォーマットのバージョンを表しています
そのため version が変わるとファイルの書き方も変わります。

build

構築時に適用するオプションを指定します。
構築用コンテキストのパスの指定や、使用する Dockerfile のパスの指定を行えます。

context

ここで指定したディレクトリが構築時の基準となるコンテキストになります。
Dockerfile が置いてある場所を指定することが多いです。

dockerfile

build で使用する Dockerfile を指定します。
Docker Compose では 「Dockerfile」以外のファイル名であってもここで指定して使用することができます。パスを指定することもできます。

image

Dockerfile を指定していない場合は image を使います。
image に指定されたイメージを手元の docker images から探して使用しますが、持っていなければ DockerHub からイメージを pull して構築を行います。

container_name

好きなコンテナ名をつけることができます。

depends_on

コンテナの依存関係(作成順序)を表します。
今回の場合だと Postgres コンテナが作成された後に Rails コンテナが作成されます。

また、depends_on に condition を指定することで、コンテナが作成された後に実行するのではなく、コンテナが作成され終了した後に実行するなど、depends_on の条件を変更できます。(詳細はこちら)

ports

ホスト側とコンテナ側の両方のポートを指定できます。(ホスト側 : コンテナ側)
ポートを 1 つのみ指定した場合は、ホスト側にランダムなポート番号が割り当てられます。

volumes

DockerCompose における volumes は 2 種類存在しており、1つ目は docker-compose.yml の rails や postgres の中にある volumes です。これはいわゆるバインドマウントというもので、ホスト側のファイルやディレクトリをコンテナ側にマウントしています。

2つ目の volumes はファイルの一番下に定義されているもので、こちらはデータの永続化の設定を行っています。そのため、コンテナが削除されてもデータを残すことができます。

tty

docker run コマンドの -t オプションに該当します。
true を指定することでコンテナを起動させ続けることができます。
これにより起動させたコンテナがすぐに終了してしまうのを防ぐことができます。

stdin_open

docker run コマンドの -i オプションに該当します。
true を指定することで標準入出力とエラー出力をコンテナに結びつけることができます。

終わりに

これで docker-compose.yml の作成が終わりました。
しかしこのファイルを実行させるだけではまだ動かすことができません。Rails の build で指定している Dockerfile を用意する必要があります。
なので、次回はこの Dockerfile について説明します。

この記事は公式ドキュメントの Compose ファイル・リファレンスを参考にせていただきました。
Compose ファイル・リファレンス — Docker-docs-ja 19.03 ドキュメント

次の記事

Dockerの開発環境構築その2-Dockerfileの解説