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 におけるその役割の概要

推薦する

MySQLdump コマンドを使用した MySQL データの移行

このソリューションの利点はシンプルさと使いやすさですが、欠点はダウンタイムが長くなることです。 した...

js で 0ms 遅延タイマーを実装するいくつかの方法

目次キューマイクロタスク非同期/待機メッセージチャネルやっと付録ここ二日間、「タイムリーな setT...

Nginx のステータス監視とログ分析の詳細な説明

1. Nginx ステータス監視Nginx には、Nginx の全体的なアクセス ステータスを監視す...

Nginx でバージョン番号を隠したり偽造したりする方法

1. デフォルトでアクセスするには、curl コマンドを使用します。 # curl -I http:...

Robots.txtの詳細な紹介

robots.txt の基本的な紹介Robots.txt はプレーンテキスト ファイルであり、Web...

Vueはドラッグ可能なツリー構造図を実装します

目次Vue 再帰コンポーネントドラッグイベント最近、Vue を使用して、ドラッグ可能なツリー構造図と...

Vue+flaskで動画合成機能を実現(ドラッグ&ドロップアップロード)

目次ドラッグアンドドロップアップロードについては以前の記事で書きました。ファイルをアップロードするF...

MySQL-8.0.26 構成グラフィックチュートリアル

はじめに: 最近、会社のプロジェクトでデータベースのバージョンが変更されました。ここでは、MySQL...

Tomcat でのサーブレットの作成と実装に関する深い理解

1. サーブレットとは何か1.1. 正式な言葉で説明する:サーブレットは、動的な Web リソースを...

Docker コンテナ ソース コードのデプロイ httpd ストレージ ボリュームを使用して Web サイトをデプロイする (推奨)

目次Dockerコンテナのソースコードを使用してhttpdをデプロイし、ストレージボリュームを使用し...

入力テキストボックスの入力実装プロパティを無効にする

今日は、開発でよく使われる、非常に便利な HTML タグをいくつかまとめてみたいと思います。これらの...

Linux で pyenv をインストールする方法

前提条件gitをインストールする必要があるインストール手順1. リモートリポジトリからpyenvをク...

JavaScript WeakMap の使い方の詳しい説明

WeakMap オブジェクトは、キーが弱参照であるキー/値のペアのコレクションです。キーはオブジェク...

ブラウザの互換モードでボタン内のテキストが垂直方向に中央揃えにならない問題について簡単に説明します。

XML/HTML コードコンテンツをクリップボードにコピー<ボタンスタイル= "カ...

画像マーキー効果を実現するネイティブJS

今日は、ネイティブ JS で実装された画像マーキー効果を紹介します。効果は次のとおりです。 実装され...