Dockerストレージマウントの比較

Docker ストレージの概要

Docker に詳しい友人は、Docker イメージがレイヤーの概念に基づいて存在し、レイヤーごとに重ね合わされて、最終的に必要なイメージになることを知っています。ただし、画像の各レイヤーは読み取り専用です。読み取りレイヤーと書き込みレイヤーは、コンテナーを実行するときにのみ作成されます。ファイル システムの分離により、次のことが可能になります。

  • コンテナーが実行されなくなると、データは保持されず、コンテナーから取り出すのが困難になります。
  • 異なるホスト間ではデータ移行をうまく実行できません。
  • コンテナーの読み取り/書き込み層にデータを書き込むには、カーネルがフェデレーテッド ファイル システムを提供する必要があるため、さらにパフォーマンスが低下します。

Docker は、コンテナー、ボリューム、バインド マウント (-v マッピング)、tmpfs にデータをマウントする 3 つの異なる方法を提供します。

ボリュームモード

ボリュームメソッドは、Docker にデータを永続化する最良の方法です

  • デフォルトでは、docker はホスト上 (Linux システム: /var/lib/docker/volumes/) にボリュームを保存するために使用される特定の領域を持ちます。
  • Docker 以外のプロセスは、このディレクトリ内のファイルを変更しないでください。
  • ボリュームは、作成、削除、その他の操作など、Docker ボリュームを通じて管理できます。
  • ボリュームを生成するときに名前を指定しない場合、ボリュームはランダムに生成されます。
[root@localhost ~]# ls /var/lib/docker/volumes/
ea73bac7843b4d05c08dc758ef15a5b3fc1070f3de8b3361dd40c3c58247c98f 
ffa4846b581c1a50a01e7a12a6342ad2aaa442701a35ae56ef2f0e5d7888b22c
  • コンテナを停止または削除してもボリュームは存在し続けるため、削除したい場合はステートメントを表示する必要があります。
関連する使用例
  • データは複数のコンテナ間で共有されます。コンテナが停止または削除されても、ボリュームはまだ存在します。複数のコンテナ間で同じボリュームをロードできます。
  • ホストが指定されたディレクトリまたはファイル構造を保証できない場合
  • バックアップ、復元、またはホスト間のデータ移行が必要な場合は、コンテナを停止し、ボリュームのディレクトリをバックアップします。
使用法

docker ではボリュームを優先する方法として推奨されており、バインド マウント (-v) と比較して次の利点があります。

  • バインドマウントと比較して、ボリュームのバックアップや移行が容易です
  • Docker CLI (コマンド ライン インターフェイス) コマンドまたは Docker API (インターフェイス) を使用して管理できます。
  • ボリュームは Linux コンテナと Windows コンテナの両方で動作します
  • 複数のコンテナ間でボリュームをより安全に共有できる
  • ボリューム ドライバーを使用すると、リモート ホストまたはクラウド上でストレージ、暗号化、またはその他の機能を提供できます。
  • 新しいボリュームの内容はコンテナによって事前に設定できます。
管理ボリュームを作成する
[root@localhost ~]# docker volume create my-vol   创建卷
my-vol
[root@localhost ~]# docker volume ls   查看卷列表
DRIVER              VOLUME NAME
local               1ad4af809485ff974988b79fdc3ada634c0b14b1324d9581369fd3b161632115
local               my-vol
local               portainer_data
[root@localhost ~]# docker volume inspect my-vol     查看卷信息
[
    {
        "CreatedAt": "2019-03-01T19:40:26+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]
[root@localhost ~]# docker volume rm my-vol       删除卷
my-vol
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               1ad4af809485ff974988b79fdc3ada634c0b14b1324d9581369fd3b161632115
local               portainer_data
ボリュームを使用してコンテナを起動する

次のように:

[root@localhost ~]# docker volume create my-vol2
my-vol2


方法一:
[root@localhost ~]# docker run -d -it --name storage-test -p 80:80 --mount source=my-vol2,target=/app nginx:latest
77d559ebcdb47e9b54b7023bbb6b7bf0a7135dc7458bb68c49311e1140251901


方法二   
[root@localhost ~]# docker run -d -it --name storage-test -p 80:80 -v myvol2:/app nginx:latest


[root@localhost ~]# docker inspect storage-test
 "Mounts": [
            {
                "Type": "volume",      
                "Name": "my-vol2",     
                "Source": "/var/lib/docker/volumes/my-vol2/_data",
                "Destination": "/app",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }

注: ボリュームには正しいソースと宛先があり、読み取りと書き込みが可能です。

コンテナを停止してボリュームをクリーンアップする
[root@localhost ~]# docker stop storage-test  #停止容器
storage-test
[root@localhost ~]# docker rm storage-test  #删除容器
storage-test
[root@localhost ~]# docker volume rm my-vol2   #删除卷
my-vol2

学習リンク
サービスを開始するときに、ドライバーがローカルにある場合、どのコンテナーもこのデータを共有できません。さらに、サービスは --mount フラグのみを使用できます。

ボリュームドライバーの使用
docker volume create を使用してボリュームを作成する場合、またはボリュームがまだ作成されていないコンテナーを起動する場合、ボリュームドライバーを指定できます。
次の例では、独立ボリュームを作成するときに最初にボリューム ドライバーが使用され、次に新しいボリュームを作成するコンテナーを起動するときにボリューム ドライバーが使用されます。
初期セットアップ
この例では、2 つのノードがあり、1 つ目は Docker ホストで、SSH を使用して 2 つ目のノードに接続できることを前提としています。
vieux/sshfx プラグインを Docker ホストにインストールします。

$ docker plugin install --grant-all-permissions vieux/sshfs

ボリュームドライバーを使用したボリュームの作成
以下にSSHパスワードを指定しますが、2ホスト共有キーを設定している場合はパスワードを省略できます。各ボリューム ドライバーには、-o フラグを使用して指定された複数の構成オプションを指定できます。

$ docker volume create --driver vieux/sshfs \
  -o sshcmd=test@node2:/home/test \
  -o password=testpassword \
  sshvolume

コンテナーの作成時にボリューム ドライバーを使用します。
コマンドでオプションを使用する必要がある場合は、-v の代わりに --mount を使用する必要があることに注意してください。

$ docker run -d \
  -it \
  --name sshfs-container \
  --volume-driver vieux/sshfs \
  --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
  nginx:latest

バインドマウント方式

バインド マウント メソッドを使用すると、ホスト上の任意のファイルまたはディレクトリ (絶対パス) をコンテナにマウントできます。

  • マウントされたファイルまたはディレクトリはどのプロセスでも変更できるため、コンテナ内のファイルまたはディレクトリへの変更が他のプロセスに影響を与える場合があります。

  • ホストがマウントされているファイルまたはディレクトリが存在しない場合は、自動的に作成されます。

  • このメソッドは、docker volume コマンドでは管理できません。

関連する使用例:

バインド マウントは通常、次の方法で使用されます。

  • ファイルをマウントできるのはバインドマウント方法のみであるため、マウントされるのはファイルです。

  • 構成ファイルをホストからコンテナーに共有します。デフォルトでは、docker は DNS 解決のために /etc/resolv.conf に似たファイルをバインドします。

  • ホストは、ソース コードまたはビルド ツールをコンテナーと共有します。たとえば、Maven ターゲット/をコンテナーにマウントすると、Maven プロジェクトがホスト上でビルドされるたびに、コンテナーは再ビルドされたアーティファクトにアクセスできるようになります。

  • ホストのファイルまたはディレクトリ構造がコンテナで必要とされる構造と一致している場合。

空のファイルまたはディレクトリをコンテナにマウントし、コンテナ内のディレクトリにファイルがある場合、これらのファイルはホスト上のディレクトリにコピーされます。空ではないファイルまたはディレクトリをコンテナにマウントし、コンテナ内のディレクトリにファイルがある場合、コンテナ内のファイルは非表示になります。

ボリューム方式と -V 方式の比較

volume はボリューム マウント ボリュームを意味し、-v はバインド マウントを意味します

タイプ -v 音量
volume 位置 任意に指定可能 /var/lib/docker/volumes/…
既存のマウント ポイントへの影響 非表示にしてボリュームで置き換える 元のデータをボリュームにコピーする
単一ファイルをサポートするかどうか サポート サポートされていません。ディレクトリのみを指定できます
権限制御 読み取り専用に設定できます。デフォルトは読み取りおよび書き込み権限です。 制御なし、すべてに読み取りおよび書き込み権限がある
携帯性 移植性が弱く、ホストパスに束縛される 移植性が高く、ホストディレクトリを指定する必要がありません。

tmpfsモード

tmpfs は、ホスト システムのメモリに保存するだけで、ホストのファイル システムには書き込みません。

関連する使用例:

tmpfs は通常、セキュリティが重要であり、データを永続化する必要がない場合に使用されます。

使い方:

–tmpfs と --mount の関係は前の 2 つの方法と同じであることは言うまでもありません。それらの違いは次のとおりです。

  • –tmpfs では、構成可能なオプションを指定できません
  • –tmpfs は swarm サービスでは使用できません。--mount を使用する必要があります。

コンテナ内で tmps を使用する

おすすめ

転載: blog.csdn.net/cljdsc/article/details/132866545