Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

【Docker入門】docker-compose.ymlにおけるボリュームとバインドマウントの読み方・書き方についてその基本を解説

Dockerのdocker-compose.ymlの読み方と書き方について、特にボリュームやバインドマウントを指定する場合の基本を解説

Dockerのボリュームとバインドマウントの違いについては、前回の記事「【Docker入門】Dockerのバインドマウントとボリュームについてわかりやすくその基本を解説」でその基本的なイメージを解説しました。

そこで今回は、docker-compose.ymlファイルにおいて両者の違いがどのように書き方として現れるのかを見ていきましょう。

ウェブ開発の人気オンラインコース

docker-compose.ymlにおける、ボリュームとバインドマウントの記述方法

docker-compose.ymlでは、上記ボリュームと同じで「volumes」キーを使って、次の2つの書き方ができます。

  • 長い書式での書き方
  • 短い書式での書き方

順番に見ていきましょう。

長い書式の場合の例

まずdocker-compose.ymlに、ボリュームとバインドマウントを長い書式を使ってかく場合の使用例で、特に今回は名前付きボリュームを利用する場合の例となります。次のようなものです。

version: "3.9"

services:
  web:
  (略)
    # このvolumesキーは、サービスwebのサブオプションとして指定。
    # 今回はボリュームとバインドマウントの方式ごとに設定している
    volumes:
      - type: volume
        source: mydata
        target: /data
        # volumesキーの追加オプションとしてのvolume(複数形のsがない)
        # nocopy: trueはコンテナからのデータのコピーを無効にする
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static


# このvolumesキーオプションは、トップレベル(versionやservicesと同レベル)のキーとして設定。この場合は、名前付きボリュームを指定していることになる
volumes:
  mydata:

これにつき、次の画像を参考にしてください。

docker-compose.yml example

まず青い□で囲まれた項目が、トップレベルキーと呼ばれる設定項目欄となります。

次にサービス「web」の中で①でボリュームの記述、②でバインドマウントの記述となっています。それぞれのtype項目を見てもらうとそれがわかると思います。

そして「ボリューム」を使うときは、そのトップレベルキーとしての「volumes」項目のところに、上の使用例ではmydataという「名前付きボリューム」を指定しています。これにより、docker-compose.ymlを実行すると名前付きボリューム「mydata」が作成されます。

そして画像中①のところで、マウントの方式を「volume」と指定、さらに、source(マウント元)としてその名前付きボリュームの名称を指定します。

続けて①のtargetのところに、コンテナー上にてマウント先のフォルダ/ディレクトリのパスを指定しています。こうするとボリュームmydataの中身が、コンテナ上のそのフォルダ/ディレクトリにも現れ、お互いに同期するイメージです。

②のセクションについては、上述のようにバインドマウントを使うときの設定になっています。こちらについては、ボリュームではないので名前付きボリュームmydataをsourceとして指定していません。そのかわりにホストPC(手元で使っているPC)のstaticというフォルダ/ディレクトリを、docker-compose.ymlからの相対パスを使って、sourceとして指定しています。

そしてそのstaticフォルダ/ディレクトリが、コンテナ上の「/opt/app/」という場所にあるstaticというフォルダ/ディレクトリへとコンテナ上の絶対パスを使ってマウントされています。

ボリュームにしろバインドマウントにしろ、いろいろオプションとして設定できるものがありますが、今回のような基本だけ理解できていればそれらも理解しやすくなるでしょう。

短い書式の例

さて上では長い書式を使って書く場合を紹介しましたが、短い書式を使って同じ内容を書くことが可能です。その場合は次のようになります。

(略)
service:
  web:
    (略)
     volumes:
        - mydata:/data
        - ./static:/opt/app/static

volumes:
  mydata

こちらのほうが簡潔な書き方となりますが、長い書式のほうがオプションが多くなると見やすく・わかりやすいでしょう。

バインドマウントにおける書式の違い

バインドマウントを使う場合において、これら書式の違いがエラーを引き起こす場合があります。つぎのような動作の違いがあるからです。

  • 長い書式を使うならば、フォルダ(上の例でいうとホスト側の「./static」)を事前に作成しておかなければならない
  • 短い書式を使うならば、それが即時作成される

Dockerはなかなか最初はとっつきにくく、わかりにくいものです。そこで動画による学習がわかりやすくおすすめです。世界最大規模の動画学習サイトUdemyでは次のようなDockerの人気講座があります。

愛を分かち合いましょう