#今回の記事の目的
現在dockerの構築を勉強中でありますが、備忘録としてまとめてみました。
今後加筆予定です。
#docker-compose.ymlとは?
拡張子がYAMLの、アプリケーションを動かすための処理を記述しているファイルです。
公式サイトではComposeFileと呼ばれているので、本記事でもComposeFileと表記することにします。
version: '2'
services:
db:
image: mysql
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
こんな感じでサンプルコードが記述されていますね。
前提知識がないと、なんの処理を書いているのかさっぱりだと思いますが、一つずつ用語を解説していきたいと思います。
docker-compose.yml用語解説
version
docker-composeで使用するバージョンを定義しています。
公式サイトによると、この記事を執筆時点(2020/05/02)時点で3.8が最新となっています。
このバージョンによって、ComposeFileの書き方が異なるので、注意が必要。
ちなみに、CircleCIというCIツールは、ComposeFileのバージョンが2系以上じゃないとWarningがでます。
(将来的に1系が使われなくなる予定のため)
###Service
Docker-Composeでは、アプリケーションを動かすための各要素をServiceと読んでいます。
そのため、ComposeFileにも、serviceとして、それぞれのServicesの内容をネストさせて記述していきます。
冒頭であげたサンプルコードをもう一度みてみると、dbとwebがServiceとして定義されていますね。
services:
db:
image: mysql
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
db については、DockerHubにアップされている既存のDockerImageを使うことになり、Railsのようなウェブアプリケーションについては、ディレクトリを指定します。
dbのDockerImage指定方法(最新版を使う場合)
MySQL | PostgresSQL |
---|---|
mysql:latest | postgres:latest |
ちなみに、ComposeFile内の各サービス名は、わかりやすければなんでもいいです。
したがって、db
じゃなくてもdatabase
のように表記してもOK。
Serviceの設定項目について
Serviceの内容の設定項目はかなりたくさんあるので、よく使うものをピックアップし、簡単な表にしてまとめてみます。
項目 | 意味 | リファレンスリンク |
---|---|---|
restart | 実行時に再起動するかどうか | https://docs.docker.com/compose/compose-file/#restart |
environment | DBについての環境変数設定(パスワードなど) | https://docs.docker.com/compose/compose-file/#environment |
ports | DBのDockerImageを立ち上げる際のポート番号 | https://docs.docker.com/compose/compose-file/#ports |
volumes | マウントする設定ファイルのパスを指定(mysqlのconfなど)。 | https://docs.docker.com/compose/compose-file/#short-syntax-3 |
build | ComposeFileを実行し、ビルドされるときのpath | https://docs.docker.com/compose/compose-file/#build |
depends_on | Service同士の依存関係 | https://docs.docker.com/compose/compose-file/#depends_on |
entrypoint | デフォルトのentrypointを上書きする | https://docs.docker.com/compose/compose-file/#entrypoint |
driver | ボリュームに使用するドライバ(動かすための接続先)の指定。 | https://docs.docker.com/compose/compose-file/#driver |
サンプルコード
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: hogehoge
MYSQL_PORT: 3306 # MySQLのデフォルトポート
ports:
- 3306:3306 # 3306のポートがきたら、3306のポートを使う
volumes:
- ./usr/rails/mysql/conf:/etc/mysql/conf.d:rw # Composefileからみた相対パスでmysql/confが呼び出されたら、etc/mysql/conf.dを使ってrw(読み込み・書き込み)を行う。実際は、再ビルド後も、DBの中身がリセットされないようにしてる。
- ./mysql-datavolume:/var/lib/mysql # Composefileからみた相対パスでmysql-datavolumeが呼び出されたら、/var/lib/mysqlを指定して実行
- "bundle:/usr/local/bundle" # Composefileからみた相対パスでbundleが呼び出されたら、ローカルのbundleファイルを指定して実行。これにより、ローカルで実行したbundle installの内容が永続化(=変更内容の適用)される。
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db # ここで指定したServiceは、`docker-compose run`した際に、指定元のServiceが実行されるよりも前に呼び出されるようになる。つまり、webというServiceよりも前に、dbというサービスが実行される。
frontend:
depends_on:
- db
ports:
- "8200:8200"
entrypoint: "/bin/sh -c 'npm install && npm run start'" # この記述によって、フロントエンドのフレームワーク最大の恩恵であるlive loadがdockerでも使える。ただし、このComposeFileでentrypointを指定すると、Dockerfile内のCMDやENTRYPOINTは無視されるので注意。
volumes: # このようにトップレベルでvolumesを指定すると、名前付きボリュームになる。
bundle:
driver: local # bundleを使う際のdriverとしてlocalを指定
mysql-datavolume:
##参考ドキュメント・書籍