この投稿は、弊社が提供する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 ドキュメント