コンテナが分離されている場合、おそらくデータを保存するために、どのようにホストマシンと通信できますか?画像からコンテナを作成する場合、コンテナを削除すると、生成されたデータはすべて失われるためです。
したがって、永続的なストレージを用意する方法が必要です。
バインドマウントを使用してこれを行うことができます およびボリューム 。
バインドマウントがホストコンピューター上の任意のフォルダーを指すことができ、Dockerによって直接管理されないことを除いて、2つの間に大きな違いはありません。
それらから始めましょう。 1つの典型的な例はログです。アプリがコンテナ内の/usr/src/app/logs
にログファイルを作成するとします。 。 -v
を使用して、これをホストマシン上のフォルダーにマップできます。 (--volume
と同じ )docker run
でコンテナを実行するときにフラグを立てます 、次のように:-v ~/logs:/usr/src/app/logs
これにより、そのフォルダがユーザーのホームディレクトリのlogsサブフォルダにマップされます。
ノード:
-m
または--mount
フラグは非常によく似た方法で機能します
これは、examplenode
で使用されるフラグです。 以前に作成した画像:
docker run -d -p 80:3000 -v ~/logs:/usr/src/app/logs --name node-app examplenode
これで、Nodeアプリを実行できるようになり、ログはDockerコンテナー内ではなく、ホストコンピューターに保存されます。
examplenode
に注意してください appは/usr/src/app/logs
にログを生成しません 、これは単なる例であり、最初にそのロギングを設定する必要があります。
docker inspect
を実行すると、ボリュームに関する詳細が一覧表示されます。 コンテナ名の「マウント」の下:
"Mounts": [
{
"Type": "bind",
"Source": "/Users/flavio/logs",
"Destination": "/usr/src/app/logs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
"Type": "bind"
が表示されますか ?これは、バインドマウントを作成したことを意味します 。
それでは、ボリュームについてお話ししましょう。 。
バインドマウントとボリュームの違いは、ボリュームを作成することにより、Dockerが管理するフォルダーにデータを保存することです。つまり、ファイルのアクセス許可と所有権を処理し、それらのボリュームを管理するためのツールを提供します。バインドマウントはファイルシステムパスに基づいていますが、Dockerはそれらを回避するツールを提供できません。
たとえば、Dockerでは、docker volume prune
を実行して、未使用のボリュームをすべて削除できます。 またはdocker system prune --volumes
。
ボリュームを作成するには、最初にdocker volume create
を実行する必要があります :
docker volume create logs
これで、docker volume ls
を使用できます およびdocker volume inspect
システムボリュームに関する詳細データを取得するには:
次に、docker run
を実行します オプション-v logs:/usr/src/app/logs
(フォルダではなくボリューム名を教えてください)
docker run -d -p 80:3000 -v logs:/usr/src/app/logs --name node-app examplenode
現在、docker inspect
を実行しています 画像上にマウントされたボリュームが表示されます:
"Mounts": [
{
"Type": "volume",
"Name": "logs",
"Source": "/var/lib/docker/volumes/logs/_data",
"Destination": "/usr/src/app/logs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
見る?これで、ログは/var/lib/docker/volumes/logs/_data
に保存されます。 フォルダ。
たとえば、クラウドサービスにコンテナをデプロイするときは、ボリュームが不可欠になります。
docker volume rm <name>
を実行しているボリュームを削除できます 。