LoginSignup
44
67

More than 3 years have passed since last update.

Docker入門編 docker-compose.ymlの書き方

Posted at

今回の記事の目的

現在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:

参考ドキュメント・書籍

Compose file version 3 reference

わかばちゃんによる解説書【マンガでわかるDocker】サポートページ

44
67
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
67