Docker Composeファイル(docker-compose.yml)の書き方

更新日 : 2023/9/5

前にDockerイメージファイルの書き方を簡単でしたがまとめました。
今回はDocker Composeファイル(docker-compose.yml)の作り方をまとめようと思います。

目次

    Docker Composeファイルを作って実行するまでの手順

    DockerComposeファイルの書き方の前に、DockerComposeファイルを実行するまでの流れを簡単にまとめます。
    • 独自のコンテナを使用する場合は、コンテナのイメージファイル(Dockerfile)を用意する。
    • 任意のディレクトリにdocker-compose.ymlのファイル名でファイル作成する。
    • 作成したdocker-compose.ymlに内容を記載する。
    • 作成したdocker-compose.ymlのあるディレクトリまで移動して、以下のコマンドを実行する。
    • $ docker-compose up
    次のセクションから「3.作成したdocker-compose.ymlに内容を記載する」の具体的な書き方をまとめます。

    docker-compose.ymlの書き方

    めちゃくちゃ簡単ですがDocker Composeファイルの中身は以下のように記載します。
    1version: '3'
    2services:
    3    redis-server:
    4        image: 'redis'
    5    node-app:
    6        restart: on-failure:5
    7        build: ./
    8        ports:
    9            - "4001:8081"
    10        volumes: 
    11            - /app/node_modules
    12            - .:/app
    13    tests:
    14        build: ./
    15        volumes:
    16            - /app/nome_modules
    17            - .:/app
    18        command: ["npm", "run", "test"]
    以上の内容で、redisサーバーでデータ管理を行い、フロントエンドはNode.jsで作成されたWebサイトが作れます。(当たり前ですが、HTMLやJSのファイルなどは別途用意する必要があります。)
    また、tests:以降の記述はテストを自動実行するためのものです。(ただし、テスト用ファイルの更新に合わせて、テストの実施内容をリアルタイム更新をするためには、docker-compose.ymlのあるディレクトリより下の何処かにApp.test.jsのようなテストに関連するファイルが必要です。)
    このファイルを元に次から各行についてまとめます。

    version

    まずはversionです。この部分は定型文です。
    コンテナの振る舞い自体に影響するものではないのではあまり重要ではないのですが、docker-compose.ymlの構文のバージョンを指定するものです。
    バージョン2を使うことも可能ですが、せっかくなので最新版のバージョン3を使いましょう。(バージョン1は非推奨のようです。)
    バージョンの細かい説明や違いはこちらに書いてあるのでここを確認しましょう。
    書き方としては以下のような感じになります。
    version: '3'

    services

    続いてservicesです。これも定型文です。
    この部分には、まとめて管理するコンテナの中身を記載します。
    このservicesより下に、階層構造でコンテナの振る舞いを詳細に書くことになりますので、次からは階層別でまとめます。

    一階層目(services > 一階層目)

    一階層目はサンプルだと、redis-servernode-appの部分にあたります。
    この部分は、まとめて管理するコンテナの名前をつける部分なのですが、任意の名前を設定できます。
    なのでプロジェクトで決められた規則がある場合はそれに沿った名前を、個人的な用途で使う場合は自分でわかりやすい名前を適当につけましょう。

    二階層目(services > 一階層目 > 二階層目)

    二階層目はサンプルだと、image:build:ports:の部分にあたります。
    この部分でコンテナの具体的な設定を定義してきます。
    文章でまとめると分かり辛いので、表にします。

    【二階層目で指定できるオプション】
    コマンド使い方
    image起動するコンテナのイメージ名・IDを指定します。
    build実行したいDockerfileのあるディレクトリを指定します。
    また、Dockerfiledocker-compose.ymlと同じ階層にない場合や、ファイル名がDockerfile以外のファイルでイメージを作成したい場合は以下のように書けば良いです。
    build:
        context: ./ # Dockerfileのあるパスを指定
        dockerfile: Dockerfile.dev # Dockerfileのファイル名を指定
    portsコンテナを起動する端末(ローカルPCなど)とのポートの対応を定義します。
    restartコンテナがクラッシュなどして停止した場合の再起動の設定です。こちらはいくつか選択肢があるので別で表にまとめます。
    volumesローカルPCとコンテナのフォルダのマッピングを設定します。
    /app/node_modulesは飽くまでサンプルなのですが、このように文の中に:/を含めない場合、コンテナ内の該当のフォルダはマウント対象から除外するという意味になります。 一方、.:/appのように:/を含めた場合は、:/の左側にかかれているローカルPCのパスのフォルダが、:/の右側に書かれているコンテナ内のフォルダへマウントされます。
    commandコンテナの起動時コマンドを設定します。
    【restartで指定できるオプション】
    オプションオプションの説明
    'no'再起動はしない設定です。デフォルトはこれになっています。
    alwaysコンテナが停止すると常に再起動する設定です。Docker stopコマンドで停止できますが、Dockerデーモン(Docker Desktopなど)を再起動すると、この設定をしたコンテナも謎に勝手に起動されます。
    on-failure終了コードが0以外でコンテナが停止した場合、再起動する設定です。異常終了した場合、終了コードには0以外の何かしらの値が設定されるからですね。Dockerデーモン(Docker Desktopなど)を再起動してもコンテナは再起動されません。
    on-failure:5のように記載すると5回再起動をトライするようになります。
    unless-stopped手動で再起動した場合を除いて、コンテナを常に再起動する設定です。Dockerデーモン(Docker Desktopなど)を再起動してもコンテナは再起動されません。

    DockerCompose関連のコマンド一覧

    前述の通り、ファイル(docker-compose.yml)を作成しただけで終わりではなく、コンテナを実行するためのコマンドを打つ必要があります。
    実行以外にも、DockerCompose用のコマンドがいくつかあるのでまとめます。

    ▼docker-compose.ymlの内容を実行

    $ docker-compose up
    docker-compose.ymlがあるディレクトリまで移動してから実行しましょう。
    イメージの作成と起動が同時に実行されます。

    ▼docker-compose.ymlの内容をビルドして実行

    $ docker-compose up --build
    一度docker-compose.ymlから作成したコンテナのソースコードを書き換えた場合は、普通の「停止」→「起動」では更新されません。
    ビルドをし直す必要があるんですね。そんな時に使用します。

    ▼docker-compose.ymlの内容をバックグランドで実行

    $ docker-compose up --d
    普通にdocker-compose upを実行するとサーバのログが表示され、キーボードからコンソール入力はできなくなってしまいます。
    ですが、このコマンドを使用するとコンテナがバックグランドで実行され、コンソールが開放されます。

    ▼起動中のDockerComposeを停止

    $ docker-compose down
    停止対象のdocker-compose.ymlがあるディレクトリまで移動してから実行しましょう。

    最後に

    以上、個人的なメモも含みましたが、DockerComposeの作成方法について簡単でしたがまとめてみました。

    それでは!