今回はdocker-compose.ymlについて説明していきます。
DockerでのRails環境の構築について何回かに分けて説明しているので、よろしければ以下も参照してください。
docker-compose.ymlとは
Dockerで複数のコンテナを設定にしたがってまとめて起動するために使用します。
今回はRailsを実行するコンテナとMysqlサーバーを実行するコンテナを起動していきます。
そのための設定を記載したものがYAMLファイルになります。
読み方はみんな「ヤムル」って呼んでますね。
YAML(ヤムル)の内容
XMLに似ていて、YAML(ヤムル)は拡張子[yml]で記載される構造化されたデータを表現するためのフォーマットです。
早速中身の解説です。
1行目にはバージョンが記載されており、こちらはdocker-compose.ymlのフォーマットのバージョンを表すもので、今回は記載時の最新である「3」を指定しております。
その下は「services」が記載され「web」と「db」が定義されています。
「web」がRailsのコンテナの定義で「db」がMysqlのコンテナの定義になります。
version: '3'
services:
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- 3000:3000
depends_on:
- db
tty: true
stdin_open: true
db:
image: mysql:5.7
volumes:
- db-volume:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
db-volume:
Railsのコンテナの定義
まずはRailsコンテナについて中身を確認していきましょう。
buildの項目には「.(ドット)」が記載してあります。
これはdocker-compose.ymlと同じディレクトリにあるDockerfileを元にイメージを作成して使用することを意味しています。ちなみにこの場合のbuildとはDockerfileからイメージを作成することを言います。
次は「command」ですが、コンテナを起動したときに実行されるコマンドを記載しています。
コマンドの内容としてはRailsサーバーを起動するコマンドが記載されています。
「bundle exec rails」でGemfileでインストールしたrailsコマンドを実行することができます。「s」はサーバー(server)の頭文字でWebサーバーを起動する際に使用します。「-p」で公開するポート番号、「-b」でバインドするIPアドレスを指定しています。
ここでは「0.0.0.0」でバインドしているので、コンテナが持っている全てのネットワークインターフェースの3000番ポートに通信がきたらrailsサーバーが応答するようになっています。
「volumes」ではPC上のディレクトリをコンテナ上の「/app」ディレクトリにマウントしています。
つまり、docker-compose.ymlのあるフォルダがコンテナ上の「/app」ディレクトリに展開されるということです。これによってPC上で修正したコードがすぐにコンテナに反映され、動作確認が可能になり、開発する際に便利です。
「ports」はコンテナの外部に3000番ポートを公開するように設定しています。
こちらを設定しないと、自分のPCからコンテナで動作しているRailsに通信できないため明示的にポートを開放してあげる必要があります。「[コンテナ外に公開するポート番号]:[コンテナ内部の転送先ポート番号]」で設定します。
「depends_on」では「db」を定義しております。このためRailsが起動する前にMysqlサーバーが先に起動するようにしています。
「tty」「stdin_open」はRailsでpryを使用してデバッグをするために必要なため設定しています。
デバッグ方法についてはまた別の機会に説明します。
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- 3000:3000
depends_on:
- db
tty: true
stdin_open: true
Mysqlのコンテナの定義
「image」では「mysql」のバージョン「5.7」を指定しています。
「volumes」では「db-volume」というデータ保管領域(ボリューム)を以下の7行目以降で作成しており、そのボリュームをコンテナの「/var/lib/mysql」にマウントしております。
こちらを指定しないとDBが直接コンテナ上に作成されてしまい、コンテナを削除した場合にデータも一緒に削除されてしまいます。回避策としてここでPCにDBのデータを保存しておき、コンテナを作り直した際もデータが消えないようにしております。
「environment」では環境変数を設定しています。環境変数とはOSが持っている変数でここで設定している「MYSQL_ROOT_PASSWORD」とはMysqlのrootユーザーのパスワードで今は開発環境なので簡単な「password」としています。
db:
image: mysql:5.7
volumes:
- db-volume:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
db-volume:
コメント