ホームページ  >  記事  >  運用・保守  >  Docker ストレージにはどのような方法がありますか?

Docker ストレージにはどのような方法がありますか?

青灯夜游
青灯夜游オリジナル
2022-02-08 16:55:477252ブラウズ

Docker には 4 つのストレージ方法があります: 1. 「デフォルト ストレージ」、データは実行中のコンテナーに保存されます。コンテナーが削除されると、データも削除されます。2. 「ボリューム データ ボリューム」、3. 「bind mounts mount」、ホスト ファイル システム内の任意のディレクトリまたはファイルを直接マウントします。 4. 「tmpfs mount」。

Docker ストレージにはどのような方法がありますか?

このチュートリアルの動作環境: linux5.9.8 システム、docker-1.13.1 バージョン、Dell G3 コンピューター。

Docker コンテナのいくつかのストレージ方法

コンテナのストレージは 2 つのカテゴリに分類できます:

1 つはミラーリングに関連しており、これは記事「Docker コンテナ テクノロジの基礎: ジョイント ファイル システム OverlayFS」で説明したコンテナ層の Copy-On-Write 機能です。デフォルトでは、コンテナ内で作成されたすべてのファイルは書き込み可能なコンテナ層に保存されます。コンテナ層にファイルを直接保存するこの方法では、ストレージ ドライバへの依存とホストへの直接書き込みの使用により、データの永続化と共有が困難になります。ファイル システム。この追加の抽象化により、データ ボリュームと比較してパフォーマンスが低下します。

もう 1 つはホスト ストレージで、ホスト ディレクトリをコンテナにバインドまたはハングすることで使用され、コンテナの停止後もデータを保持できます。主に後者を紹介します。

いくつかのストレージ マウント方法

ここでは、Docker ホスト上のデータが保存されるさまざまな場所に基づいて次の図を描きます。

##Docker には、デフォルト、ボリューム データ ボリューム、バインド マウント、および tmpfs マウント (Linux 環境でのみ利用可能) の 4 つのストレージ メソッドがあり、そのうち 2 つのボリュームとバインド マウントは永続的なコンテナ データを実装します。 Docker ストレージにはどのような方法がありますか?

#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 ホストにデータをバックアップ、復元、または移行する必要がある場合、ボリュームは非常に便利であり、ホスト パスの制限から解放されます。

バインド マウントとボリュームを使用する場合は、次の伝播カバレッジの原則に注意する必要があります。

空のボリュームをマウントする場合: ディレクトリの内容コンテナがボリュームに伝播 (コピー) されます。

Docker ストレージにはどのような方法がありますか?マウントされたボリュームまたは空ではないボリュームをバインドする場合: コンテナ内のディレクトリの内容は、ボリュームまたはバインドされたホスト ディレクトリによって上書きされます。

4.tmpfs mount

tmpfs 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挂载到多个容器中即可。这里不做赘述,我们来看一下通过中间容器实现共享的方式。

我们创建一个中间容器,包含绑定挂载目录和一个卷。

docker create -v /share:/volume1 -v /volume2  --name volume_share  busybox

在我们需要共享的容器中通过选项--volumes-from拿过来用即可

docker run -d -t --volumes-from volume_share  --name container1  busybox

我们inspect检查一下Mounts字段,此时container1已经挂载到了一个bind目录和一个volume

"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视频教程

以上がDocker ストレージにはどのような方法がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。