Docker には 4 つのストレージ方法があります: 1. 「デフォルト ストレージ」、データは実行中のコンテナーに保存されます。コンテナーが削除されると、データも削除されます。2. 「ボリューム データ ボリューム」、3. 「bind mounts mount」、ホスト ファイル システム内の任意のディレクトリまたはファイルを直接マウントします。 4. 「tmpfs mount」。
このチュートリアルの動作環境: linux5.9.8 システム、docker-1.13.1 バージョン、Dell G3 コンピューター。
Docker コンテナのいくつかのストレージ方法
コンテナのストレージは 2 つのカテゴリに分類できます:
1 つはミラーリングに関連しており、これは記事「Docker コンテナ テクノロジの基礎: ジョイント ファイル システム OverlayFS」で説明したコンテナ層の Copy-On-Write 機能です。デフォルトでは、コンテナ内で作成されたすべてのファイルは書き込み可能なコンテナ層に保存されます。コンテナ層にファイルを直接保存するこの方法では、ストレージ ドライバへの依存とホストへの直接書き込みの使用により、データの永続化と共有が困難になります。ファイル システム。この追加の抽象化により、データ ボリュームと比較してパフォーマンスが低下します。
もう 1 つはホスト ストレージで、ホスト ディレクトリをコンテナにバインドまたはハングすることで使用され、コンテナの停止後もデータを保持できます。主に後者を紹介します。
いくつかのストレージ マウント方法
ここでは、Docker ホスト上のデータが保存されるさまざまな場所に基づいて次の図を描きます。
##Docker には、デフォルト、ボリューム データ ボリューム、バインド マウント、および tmpfs マウント (Linux 環境でのみ利用可能) の 4 つのストレージ メソッドがあり、そのうち 2 つのボリュームとバインド マウントは永続的なコンテナ データを実装します。
#1. デフォルトのストレージデータは実行中のコンテナに保存され、コンテナが削除されるとデータも削除されます
2. バインド マウントバインド マウントは、ボリュームと比較して機能が制限されています。バインド マウントを使用すると、ホスト上のファイルまたはディレクトリがコンテナにマウントされます。ファイルまたはディレクトリは、ホスト上のフルパスで参照されます。ディレクトリは Docker ホスト上に存在する必要はなく、存在しない場合は Docker が作成します。自動的に作成できるのはディレクトリのみであることに注意してください。 -v オプションを使用してディレクトリ/nginx/html をバインドしてマウントし、コンテナ内で確認します
docker run -dt -v /nginx/html:/usr/share/nginx/html --name nginx nginx
docker Inspection nginx
"Mounts": [ { "Type": "bind", "Source": "/nginx/html", "Destination": "/usr/share/nginx/html", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
を通じてコンテナの [マウント] フィールドを表示します次に、docker ホスト上にindex.html を作成し、hello nginx と書き込み、コンテナ IP にアクセスします。明らかにマウントが有効になっています。
[root@localhost ~]# echo "hello nginx" > /nginx/html/index.html [root@localhost ~]# curl 172.17.0.4 hello nginx
ここに問題があります。コンテナ内のファイルを有効にするために、Docker ホストを介してファイルを変更できます。逆も同様です。コンテナは、コンテナ上のコンテンツを変更、作成、削除できます。ホストファイルシステム。この問題に対処するには、コンテナの作成時にマウント ディレクトリのアクセス許可 (次の読み取り専用アクセス許可など) を構成できます:
docker run -dt -v /nginx/html:/usr/share/nginx/html:ro --name nginx nginx
したがって、バインド マウントを使用するときは、ホスト ファイル システムを操作することになります。 , 次のことを理解しておく必要があります:
他のアプリケーションへの影響を避けるために、マウントするディレクトリにはどのようなコンテンツが含まれているか。
コンテナにこれらのディレクトリを操作する権限が必要かどうか。
3.volumes データ ボリュームボリューム ストレージ ボリュームは Docker によって作成および管理されます。docker volume create コマンドを使用して明示的にボリュームを作成するか、またはコンテナボリュームが作成されます。 [root@localhost ~]# docker volume create nginx_volume
nginx_volume
[root@localhost volumes]# docker inspect nginx_volume
[
{
"CreatedAt": "2021-08-12T01:58:04-04:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx_volume/_data",
"Name": "nginx_volume",
"Options": {},
"Scope": "local"
}
]
マウント ポイントが docker のルート ディレクトリ /var/lib/docker/volumes の下にあることがわかります。
docker volume rm/prune を使用して、未使用の 1 つまたはすべてのボリュームをクリアします。 docker コマンドを使用することは、バインド マウントよりも利点があります。
[root@localhost ~]# docker volume ls DRIVER VOLUME NAME local owncloud-docker-server_files local owncloud-docker-server_mysql local owncloud-docker-server_redis [root@localhost ~]# docker volume prune WARNING! This will remove all local volumes not used by at least one container. Are you sure you want to continue? [y/N] y Deleted Volumes: owncloud-docker-server_files owncloud-docker-server_mysql owncloud-docker-server_redis Total reclaimed space: 199.4MB
コンテナを作成するときに、コンテナのマウント元が指定されていない場合、docker は自動的に匿名ボリュームを作成します。このボリュームも docker のルート ディレクトリに配置されます。
[root@localhost volumes]# docker run -dt -v /usr/share/nginx/html --name nginx_with_volume nginx d25bdfce9c7ac7bde5ae35067f6d9cf9f0cd2c9cbea6d1bbd7127b3949ef5ac6 [root@localhost volumes]# docker volume ls DRIVER VOLUME NAME local d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980 local nginx_volume [root@localhost volumes]# ls /var/lib/docker/volumes/ backingFsBlockDev d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980 metadata.db nginx_volume
マウント ボリュームを作成すると、現時点のストレージはバインド マウントと一致しますが、Docker ホストが特定のディレクトリまたはファイル構造を保証できない場合、ボリュームは Docker ホストの構成に役立ちます。コンテナー ランタイムから切り離されています。このようにして、ある Docker ホストから別の Docker ホストにデータをバックアップ、復元、または移行する必要がある場合、ボリュームは非常に便利であり、ホスト パスの制限から解放されます。
バインド マウントとボリュームを使用する場合は、次の伝播カバレッジの原則に注意する必要があります。
空のボリュームをマウントする場合: ディレクトリの内容コンテナがボリュームに伝播 (コピー) されます。マウントされたボリュームまたは空ではないボリュームをバインドする場合: コンテナ内のディレクトリの内容は、ボリュームまたはバインドされたホスト ディレクトリによって上書きされます。
4.tmpfs mounttmpfs mount は Linux ホストにのみ適用できます。tmpfs mount を使用してコンテナを作成する場合、コンテナは書き込み可能な層に置くことができます。コンテナー外部でファイルを作成します。データをメモリに保持し、コンテナが停止すると、書き込まれたデータは削除されます。主に、ホストまたはコンテナーの書き込み可能レイヤーに残したくない機密ファイルを一時的に保存するために使用されます。 --tmpfs オプションを使用してメモリ ブロックをマウントします。
docker run -dt --name busybox_tmpfs --tmpfs /etc/running busybox
--mount メソッドにパラメータを入力して、一時ストレージのサイズを指定します。
docker run -dt --name busybox_tmpfs2 --mount type=tmpfs,tmpfs-size=2048,destination=/etc/running busybox
ストレージ データの共有
在容器之间共享数据主要有两种方法,第一种比较简单,只需要将目录或者volume挂载到多个容器中即可。这里不做赘述,我们来看一下通过中间容器实现共享的方式。 我们创建一个中间容器,包含绑定挂载目录和一个卷。 在我们需要共享的容器中通过选项--volumes-from拿过来用即可 我们inspect检查一下Mounts字段,此时container1已经挂载到了一个bind目录和一个volume 推荐学习:《docker视频教程》docker create -v /share:/volume1 -v /volume2 --name volume_share busybox
docker run -d -t --volumes-from volume_share --name container1 busybox
"Mounts": [
{
"Type": "bind",
"Source": "/share",
"Destination": "/volume1",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "volume",
"Name": "21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e",
"Source": "/var/lib/docker/volumes/21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e/_data",
"Destination": "/volume2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
以上がDocker ストレージにはどのような方法がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。