デフォルトでは、Dockerコンテナは完全にステートレスです。コンテナに保存されているデータは一時的なものであり、コンテナがシャットダウンすると消去されます。これは明らかに多くのアプリケーションにとって理想的ではないため、Dockerは状態を処理するいくつかの方法を提供します。
ボリュームとは何ですか?
Dockerデータを永続化する最も簡単な方法は、バインドマウントです。 、これは文字通り、ホストのディスク上の場所をコンテナのディスク上の場所にバインドします。これらは作成と使用が簡単ですが、ディレクトリを設定して自分で管理する必要があるため、少し厄介です。
ボリュームは、Dockerによって管理される仮想ハードドライブのようなものです。 Dockerは、それらをディスク(通常は/var/lib/docker/volumes/
)に保存します。 )、ディレクトリパスではなく、覚えやすい単一の名前を付けます。 DockerCLIを使用して簡単に作成および削除できます。
これらには、Dockerによる管理以外にもいくつかの利点があります。 LinuxとWindowsの両方のコンテナで動作し、複数のコンテナ間でより安全に共有できます。ボリュームドライバを使用すると、クラウドプロバイダーは基盤となるデータのリモートホスティングを提供できます。全体として、ボリュームはバインドマウントよりも使いやすく、状態を管理するためにDockerによって推奨されています。
もちろん、Dockerデータをサーバーに保存する必要があるかどうかを検討する必要があります。多くのアプリケーションでは、Amazon S3などの外部リモートデータストアまたは外部データベースを使用するだけで、使用するデータをフロントエンドサーバーに拘束せずに保存できます。
どのように使用しますか?
次のコマンドを使用して、コマンドラインから新しいボリュームを作成できます。
docker volume create nginx-config
次に、Dockerコンテナーを実行するときに、--mount
を使用してコンテナー内のターゲットにリンクします。 フラグ:
docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx nginx:latest
docker inspect <name>
を実行する場合 、Mounts
の下にボリュームが表示されます セクション。
Docker Composeを使用している場合は、セットアップも簡単です。 volumes
を追加するだけです 使用している各コンテナサービスのエントリを入力し、ボリューム名をゲスト内の場所にマップします。また、トップレベルのvolumes
にボリュームのリストを提供する必要があります 作成してプロビジョニングするためのキー。
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-config:/etc/nginx/ volumes: nginx-config:
これにより、このコンポーズのボリュームが自動的に作成されます。 Composeの外部から作成済みのボリュームを使用する場合は、external: true
を指定します。 ボリューム構成の場合:
volumes: cms-content: external: true
代わりに、ボリュームを気にせずにバインドマウントを実行する場合は、ボリューム名の代わりにパス名を入力し、ボリューム名の定義を省略します。
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - /docker/nginx-config/:/etc/nginx/
ユースケースでこれよりも具体的なものが必要な場合は、Composeでのボリュームの使用に関するDockerの完全なドキュメントを読むことができます。
Dockerボリュームの転送
Dockerボリュームは、自動的に作成され、/var/lib/docker/volumes/
に保存される単なるフォルダーです。 、各ボリュームは./volumename/_data/
の下に保存されます 。バックアップと復元を行うには、これらのボリュームを直接バックアップするだけです。
代わりにDockerCLIを使用したい場合、残念ながらこれを行う簡単な方法は提供されていません。コンテナのボリュームをバックアップするには、コンテナ名と、データが保存されているマウント場所が必要です。
これを行う方法は少しハックです。新しいDockerコンテナでコマンドを実行し、現在のシェルディレクトリをバインドマウントし、ボリュームをそのコンテナにマウントしてから、tar
を実行する必要があります。 ディレクトリをバックアップに入れます。最終的にはbackup.tar
になります ボリュームの:
docker run --rm --volumes-from containername -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /mountlocation
次に、同様に、ターゲットディレクトリにアーカイブを抽出できます。
docker run --rm --volumes-from containername -v $(pwd):/backup ubuntu bash -c "cd /mountlocation && tar xvf /backup/backup.tar --strip 1"
ただし、これはホストの場所を知る必要があるよりも優れているため、必要に応じてこれを自動化できます。