67
73

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

"なんとなく”Dockerのファイル共有について語れるようになる

Posted at

Docker開発において、あまり把握せずやり過ごしてしまうものの1つに「ファイル共有」があります。

自分がその一人なのですが、yarn installが遅かったことをキッカケに調べてみました。

タイトル通り、まんべんなく解説する記事ではなく、「ここは押さえておいたほうがいい」と感じたものをピックアップします。

より詳細に知りたい方は、下記を読んでください。本記事の引用元もこれです。

Docker におけるデータ管理 | Docker ドキュメント

もし誤りがあれば教えてください!

要約

  • ファイル共有の方法が2つ(本当は3つ)あることを知ろう
    • volumes
    • bind mounts
    • (tmpfs mounts) ※この記事では割愛します
  • --volumesオプションと--mountオプションは、それぞれtypeのvolumesとbind mountsと関連している訳ではないので初心者は注意
  • bind mountsではなくvolumesでボリューム共有されるようなコマンド、設定ファイルを書けるようになろう
    • --volumesオプションでなく、--mountオプションを使おう
    • docker-compose.ymlvolumesの正式な書き方を覚えよう

ファイル共有の方式

Docker コンテナーにおけるファイルをホストマシン上に保存する方法は 2 つあります。 これを行えば、コンテナーが停止した後にもデータを維持していくことができます。 その 2 つの方法とは ボリューム(volumes)バインドマウント(bind mounts) です。

まずは、ファイル共有の方法にvolumesbind mountsがあることを知りましょう。

このタイミングでは、「volumesとは」「bind mountsとは」という話は省略して、この2つがあることを理解しておけばOKです。

なぜかというと、volumesで管理できる方法を覚えておけばいいからです。

ボリュームは Docker においてデータを維持するための最良の方法です。

そのため2つの違いを知るよりも、まずはdocker rundocker-compose.ymlで指定しているファイル共有の方式を確認できるようになりましょう。

【初心者向け】volumesとmountのオプションを混同しないように

Dockerを始めたばかりの方の中には、次のように考える人もいるでしょう。

  • docker run --volumesと指定していたら、ファイル共有の方式はvolumes
  • docker run --mountと指定していたら、ファイル共有の方式はbind mounts

上記は間違いです。オプションの名前とファイル共有方式に関連はありません。

また2021年現在では、--volumesオプションより--mountオプションを利用するほうが良いこともお伝えします。

はじめて利用する方は--mountを利用してください。 上級ユーザーは-v--volumeを用いることに慣れているかもしれませんが、--mountを利用するように心がけてください。 --mountの方が簡単に利用することができるとの調査もあります。

ファイル共有方式をvolumesにする方法

ではどうすればvolumesでファイル共有ができるのか。

シンプルな回答は、「Dockerボリュームで共有すること」です。

よく使われるであろうdocker rundocker-compose.ymlの場合で説明します。

docker run

docker run --mountでは、次の設定ができます。

  • type: ここで'volumes'または'bind mounts'を指定できる
    • bind, volume, tmpfsから選ぶ
  • source: ホスト側のディレクトリまたはDockerボリューム
    • ここでDockerボリュームを指定すればOK
  • target: コンテナ側のディレクトリ

上記の通りですので、sample-volumesというDockerのボリュームを作成して、これを共有したコンテナdevtestを作ってみます。

$ docker volume create sample-volumes
$ docker run -d \
  --name devtest \
  --mount source=sample-volumes,target=/app \
  ubuntu

このように書くことで、Dockerボリュームでファイル共有ができました。

docker inspectコマンドで、実際にそのようになっていることも確認可能です。

$ docker inspect devtest

ちなみにbind mountsになるときは、sourceに実際のディレクトリを指定した場合です。 ex.) docker run --mount src:/app/arc

なんとなくDockerコンテナを立ち上げている場合は、たいていbind mountsになっていることでしょう。

docker-compose.yml

同じくdocker-compose.ymlも確認します。

下記のリファレンスにあるように、docker-compose.ymlvolumesの書き方は、shortとlongの2種類があります。

Compose file version 3 reference | Docker Documentation

どちらでも書けるようになるといいですが、先にlongを理解したほうがいいので、こちらを紹介します。なぜかというと、前述の--mountオプションと同じだからです。

同様に、sample-volumesというDockerのボリュームを共有したサービスdevtestを作ってみます。

docker-compose.yml
version: "3.9"
services:
  devtest:
    image: ubuntu
    volumes:
      - type: volume
        source: sample-volumes
        target: /app
volumes:
  sample-volumes:

末尾のvolumesでDockerボリュームを作り、これをsourceに指定する。targettypedocker runと同じです。

なおbind mountsになっている場合も、docker runとほぼ同じです。一応、サンプルのYAMLを貼っておきます。

docker-compose.yml
version: "3.9"
services:
  web:
    image: ubuntu
    volumes:
      - type: bind
        source: src
        target: /app/src
      # 上と同じ内容を、1行のshortで書くと次の通り
      - "src:/app/arc"

おわりに

おめでとうございます!

これでDockerのファイル共有がbind mountsかvolumesかを判別でき、さらに形式をvolumesへ変更できました。執筆者と完全に同じレベルです。

ここまで理解できたら、volumesそしてbind mountsの使い分けを勉強しても苦ではなくなるでしょう。

最初に挙げた参考ページの、「ボリュームの適切な利用例」、「バインドマウントの適切な利用例」を確認してみてください。

67
73
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
67
73

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?