Dockerコンテナのいくつかの保存方法の詳細な説明

Dockerコンテナのいくつかの保存方法の詳細な説明

前面に書かれた

前回の記事では、コンテナ ネットワークについて学び、コンテナ ネットワーク ドライバー ブリッジの動作原理について比較的詳しく紹介しました。今日は、コンテナのもう 1 つの重要な領域であるストレージについて見てみましょう。

コンテナストレージは、次の 2 つのカテゴリに分けられます。

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

もう 1 つはホスト ストレージです。これは、ホスト ディレクトリをコンテナーにバインドまたはマウントして使用し、コンテナーが停止した後でもデータが保持されるようにします。この短いエッセイでは主に後者について紹介します。

複数のストレージマウント方法

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

1.バインドマウント

バインドマウントはボリュームに比べて機能が制限されています。バインドマウントを使用すると、ホスト上のファイルまたはディレクトリがコンテナにマウントされます。ファイルまたはディレクトリは、ホスト マシン上の完全なパスによって参照されます。ディレクトリは Docker ホスト上にすでに存在している必要はありません。存在しない場合は、Docker によって作成されます。 自動的に作成できるのはディレクトリのみであることに注意してください。

-v オプションを使用して、ディレクトリ /nginx/html をコンテナにバインドマウントしてみましょう。

docker run -dt -v /nginx/html:/usr/share/nginx/html --name nginx nginx

docker inspect nginx でコンテナのマウントフィールドを表示する

「マウント」: [
    {
        「タイプ」:「バインド」
        「ソース」: 「/nginx/html」、
        「宛先」: 「/usr/share/nginx/html」、
        "モード": "",
        「RW」:真、
        「伝播」: 「rprivate」
    }
]、

次に、docker ホストに index.html を作成し、hello nginx と記述して、コンテナの IP にアクセスします。明らかに、マウントが有効になっています。

[root@localhost ~]# echo "hello nginx" > /nginx/html/index.html
[root@localhost ~]# カール 172.17.0.4
こんにちは、nginx

ここで問題があります。Docker ホストを介してファイルを変更し、コンテナ内のファイルを有効にすることができます。逆に、コンテナはホスト ファイル システム上のコンテンツを変更、作成、削除できます。この問題を解決するには、コンテナを作成するときに、次の読み取り専用権限のようにマウント ディレクトリの権限を構成します。

docker run -dt -v /nginx/html:/usr/share/nginx/html:ro --name nginx nginx

したがって、バインド マウントを使用する場合は、ホスト ファイル システムを操作するので、次の点に注意する必要があります。

  • 他のアプリケーションに影響を与えないように、マウントしたディレクトリには何が含まれていますか。
  • コンテナにはこれらのディレクトリを操作する権限が必要ですか?

2. 巻数

ボリューム ストレージ ボリュームは、Docker によって作成および管理されます。docker volume create コマンドを使用してボリュームを明示的に作成することも、コンテナーの作成時にボリュームを作成することもできます。

[root@localhost ~]# docker ボリューム作成 nginx_volume
ボリューム
[root@localhost ボリューム]# docker で nginx_volume を検査する
[
    {
        「作成日時」: 「2021-08-12T01:58:04-04:00」、
        "ドライバー": "ローカル",
        「ラベル」: {},
        「マウントポイント」: 「/var/lib/docker/volumes/nginx_volume/_data」、
        "名前": "nginx_volume",
        「オプション」: {},
        「スコープ」: 「ローカル」
    }
]

マウントポイントがdockerのルートディレクトリ/var/lib/docker/volumesにあることがわかります。

docker volume rm/prune を使用して、未使用のボリュームを 1 つまたはすべてクリアします。docker コマンドを使用してボリュームを管理できる点は、バインド マウントよりも優れています。

[root@localhost ~]# docker ボリューム ls
ドライバーボリューム名
ローカルの owncloud-docker-server_files
ローカル owncloud-docker-server_mysql
ローカル owncloud-docker-server_redis
[root@localhost ~]# docker ボリュームプルーニング
警告! これにより、少なくとも 1 つのコンテナーで使用されていないすべてのローカル ボリュームが削除されます。
本当に続行しますか? [y/N] y
削除されたボリューム:
独自のクラウドDockerサーバーファイル
独自のクラウドDockerサーバー_mysql
独自のクラウド-docker-server_redis
​
回収された合計容量: 199.4MB

コンテナの作成時にコンテナマウントのソースが指定されていない場合、Docker は自動的に匿名ボリュームを作成します。このボリュームも Docker ルート ディレクトリに配置されます。

[root@localhost ボリューム]# docker run -dt -v /usr/share/nginx/html --name nginx_with_volume nginx
d25bdfce9c7ac7bde5ae35067f6d9cf9f0cd2c9cbea6d1bbd7127b3949ef5ac6
[root@localhost ボリューム]# docker ボリューム ls 
ドライバーボリューム名
ローカル d8e943f57d17a​​255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980
ローカル nginx_volume
[root@localhost ボリューム]# ls /var/lib/docker/volumes/
backingFsBlockDev d8e943f57d17a​​255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980 メタデータ.db nginx_volume

マウントされたボリュームを作成すると、ストレージはバインドマウントと一致します。ただし、Docker ホストが特定のディレクトリまたはファイル構造を保証できない場合、ボリュームは Docker ホストの構成をコンテナ ランタイムから分離するのに役立ちます。このように、ある Docker ホストから別の Docker ホストにデータをバックアップ、復元、または移行する必要がある場合、ボリュームは非常に便利であり、ホスト パスの制限から解放されます。

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

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

バインドマウントまたは空でないボリュームの場合: コンテナ内のディレクトリの内容は、ボリュームまたはバインドされたホスト ディレクトリによって上書きされます。

3.tmpfsマウント

tmpfs マウントは Linux ホストでのみ使用可能です。tmpfs マウントを使用してコンテナを作成すると、コンテナはコンテナの書き込み可能レイヤーの外部にファイルを作成できます。データをメモリ内に保持し、コンテナが停止すると、書き込まれたデータも削除されます。主に、ホストまたはコンテナの書き込み可能レイヤーに残したくない機密ファイルの一時的な保存に使用されます。

--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

ストレージデータ共有

コンテナ間でデータを共有するには、主に 2 つの方法があります。最初の方法は比較的単純で、ディレクトリまたはボリュームを複数のコンテナにマウントするだけです。ここでは詳細には触れません。中間コンテナを介して共有を実現する方法を見てみましょう。

バインドマウントされたディレクトリとボリュームを含む中間コンテナを作成します。

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

共有する必要があるコンテナでは、オプション --volumes-from を使用して取得できます。

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

Mounts フィールドを調べてみましょう。この時点で、container1 はバインド ディレクトリとボリュームにマウントされています。

「マウント」: [
    {
        「タイプ」:「バインド」
        「ソース」: 「/share」、
        「宛先」: 「/volume1」、
        "モード": "",
        「RW」:真、
        「伝播」: 「rprivate」
    },
    {
        「タイプ」:「ボリューム」、
        「名前」: 「21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e」、
        「ソース」: 「/var/lib/docker/volumes/21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e/_data」、
        「宛先」: 「/volume2」、
        "ドライバー": "ローカル",
        "モード": "",
        「RW」:真、
        「伝播」: 「」
    }
]、

Docker コンテナ ストレージについて学んだことは以上です。この短い記事が、必要なときに役立つことを願っています。

これで、docker コンテナのいくつかの保存方法についての記事は終了です。docker コンテナの保存の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Dockerコンテナ終了エラーコードの手順
  • Docker コンテナ データ ボリュームの名前付きマウントと匿名マウントの問題
  • Docker コンテナにおける Patroni の簡単な分析

<<:  泡の小さな鋭角効果を実現するCSS

>>:  HTML リンク アンカー タグと SEO におけるその役割の概要

推薦する

サーバーストレステストの概念と方法 (TPS/同時実行性)

目次1 ストレステストの指標1.1 秒あたり1.2 クォータ1.3 平均処理時間(RT) 1.4 同...

DockerのIDEA構成プロセス

IDEA は Java で最も一般的に使用されている開発ツールであり、Docker は最も人気のある...

Docker の MySQL コンテナのタイムゾーン問題の修正

序文Ahhang が Springboot プロジェクトを開発していたとき、フロントエンドから検証コ...

MySQL 5.7.17 圧縮パッケージのインストールと設定方法のグラフィックチュートリアル

インターネット上にはMySQL 5.7.17のインストールチュートリアルがほとんどなく不十分なので、...

Docker が占有するディスク領域をクリーンアップする方法

Docker は多くのスペースを占有します。コンテナを実行したり、イメージを取得したり、アプリケー...

...

MySQL 学習: 初心者のための 3 つのパラダイム

目次1. パラダイム基盤1.1 パラダイムの概念2. 3つの主要なパラダイム2.1 3つの主要なパラ...

1 つ以上のフィールドに基づいて重複データを検索する MySQL SQL ステートメント

SQLはテーブル内の重複レコードをすべて見つけます1. テーブルには id と name の 2 つ...

React の 3 つの主要属性における Ref の使用に関する詳細な説明

目次クラスコンポーネント機能コンポーネントインタビューのよくある質問: React における ref...

Docker で ElasticSearch をデプロイする方法

1. ElasticSearch とは何ですか? Elasticsearch も Java で開発さ...

Linuxコマンド履歴の調整方法の詳細な説明

Linux システムの bash history コマンドは、以前に実行したコマンドを記憶し、再入力...

Linux sftp コマンドの使用法

SFTPの概念sftp は、安全なファイル転送プロトコルである Secure File Transf...

centos7.2 オフラインインストール mysql5.7.18.tar.gz

ネットワークが分離されているため、MySQL は yum を使用してインストールできません。ここでは...

HarborをベースにしたDocker専用倉庫の構築方法

目次1. ハーバーの紹介1. ハーバーが民間倉庫を建設3. 港湾の維持管理4. Harborユーザー...

MySQL 8.0.19 では、間違ったパスワードを 3 回入力するとアカウントがロックされるようになりました (例)

MySQL 8.0.19 では、間違ったパスワードを 3 回入力するとアカウントがロックされるよう...