見出し画像

コンテナがアクセスできる共有ディレクトリと共有ファイル

はじめに

ハローワールド!マイクです。
 Dockerはオープンなプラットフォームです。Dockerオブジェクトと呼ばれるイメージ、コンテナ、ネットワーク、ボリュームなどで構成され、これらを操作する事でアプリケーションを開発、配布、実行することが出来ます。
コンテナの共有ディレクトリ、共有ファイルについてみてみましょう。

使ったもの

 今回の環境を下記に示しておきます。
 ・Ubuntu 22.04 LTS Desktop 64-bit
 ・Docker version 20.10.13 build a224086

Persistent data "接続的データ、永続的に保持するデータ"

 Dockerは”immutable infrastructure”といってコンテナは再デプロイはするけど変更はしない、ユニークなデータはコンテナの中に入れない思想でつくられているそうです。しかし、アプリケーションを実行するにはそうも言ってられません。そこで、ボリュームとバインドマウントという方法を使います。
 ボリュームはコンテナの外に作成されるデータを保持する仮想ディスクのようなものです。Dockerによって管理されています。イメージには含まれていない点に注意が必要です。ボリュームを使用するコンテナが起動されるとき、ボリュームが存在しなければDockerが作成してくれます。コンテナを削除してもボリュームは削除されません。
 バインドマウントはホストのファイルディレクトとコンテナ内のファイルディレクトリをマウントします。ホストにファイルディレクトリが必ず存在しなければならないため、Docker fileでは定義しないでコンテナを実行するときに指定します。バインドマウントはホストファイルディレクトリに強く依存する為、ボリュームの使用が公式ドキュメントではオススメされていました。
 Linux環境で複数のコンテナからボリューム、バインドマウントにアクセスする場合注意が必要です。ファイルパーミッションの問題が発生する可能性があります。名前が同じでもIDが違う可能性があります。

ここでのまとめとして。
 ・コンテナが消えても残したいデータがある場合はボリューム、バインドマウントで残すことができます。
 ・ボリュームは勝手には消えないので、消したい場合には手動で消します。
 ・バインドマウントよりもボリュームを使うほうがよいかもしれません。

ボリュームとバインドマウントを操作するコマンド

次にボリュームとバインドマウントを操作するコマンドをみてみましょう。

・ボリュームを指定してコンテナを起動する

 > docker run -d --name "コンテナ名" --mount source=”ボリューム名”,target="コンテナ内ディレクトリ" "イメージ名"
 ”ボリューム名”のボリュームが存在しない場合には作成されます。他にも-vオプションでボリュームを指定する方法もあるようです。

・ボリュームを個別に作成する

 > docker volume create ”ボリューム名”

・ボリュームの一覧を表示する

 > docker volume ls

・ボリュームの詳細を表示する

 > docker volume inspect "ボリューム名"

・ボリュームを削除する

 > docker volume rm "ボリューム名"

・バインドマウントを指定してコンテナを起動する

 > docker run -d --name "コンテナ名" --mount type=bind,source="ホストディレクトリ",target="コンテナ内ディレクトリ" "イメージ名"
 --volumeオプションを使って指定する方法もあるようですが、--mountオプションの使用を公式ドキュメントではオススメされていました。

・バインドマウントが正しく生成されたか確認する

 > docker inspect "イメージ名"
 Mountsの項目にバインドマウントが記述されています。

最後に

 今回はボリュームとバインドマウントについて書いてみました。最後まで読んで頂きありがとうございます。

参考

履歴

2022年12月21日:投稿


この記事が気に入ったらサポートをしてみませんか?