Dockerコンテナとホスト間のデータ相互作用の概要

Dockerコンテナとホスト間のデータ相互作用の概要

序文

実稼働環境で Docker を使用する場合、多くの場合、データを複数のコンテナ間で永続化または共有する必要があり、必然的にコンテナ データ管理操作が必要になります。

方法1: Docker cpコマンド

docker cp: コンテナとホスト間でデータをコピーするために使用されます。
構文 # コンテナ内のファイルをホストにコピーする docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# ホストファイルをコンテナにコピーする docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

オプションの説明:
-L : ソースとターゲット間のリンクを維持する

操作例:

ホストからコンテナへ

ホストするコンテナ

注意:この方法は管理にも使えますが、データは統合されず、基本的には利用されません。あくまでも理解のためだけに使われます。

方法2: Dockerデータボリューム

1. ボリュームとは何か

Docker Volume を理解するには、まず Docker のファイル システムがどのように機能するかを知る必要があります。 Docker イメージは複数のファイル システム (読み取り専用レイヤー) で構成されます。コンテナを起動すると、Docker はイメージ レイヤーをロードし、その上に読み取り/書き込みレイヤーを追加します。実行中のコンテナが既存のファイルを変更すると、そのファイルは読み取り/書き込みレイヤーの下の読み取り専用レイヤーから読み取り/書き込みレイヤーにコピーされます。読み取り専用バージョンのファイルは引き続き存在しますが、読み取り/書き込みレイヤーのファイルのコピーによって隠されています。 Docker コンテナを削除してイメージで再起動すると、以前の変更は失われます。 Docker では、読み取り専用レイヤーとその上の読み取り/書き込みレイヤーの組み合わせは、Union FIle System と呼ばれます。

データを保存(永続化)し、コンテナ間でデータを共有するために、Docker はボリュームの概念を提案しました。簡単に言えば、ボリュームとは、デフォルトのユニオン ファイル システムをバイパスし、通常のファイルまたはディレクトリとしてホスト マシン上に存在するディレクトリまたはファイルです。

2. データ量の特徴

• データボリュームはコンテナ間で共有および再利用できます

• データ量の変更はすぐに有効になります

• データボリュームの更新はイメージに影響を与えません

• デフォルトでは、コンテナが削除されてもデータボリュームは保持されます

3. データ量関連の操作

使用方法: docker volume コマンド
ボリュームを管理する
コマンド:
ボリュームを作成する
検査 1つまたは複数のボリュームの詳細情報を表示します
ls ボリュームをリストする
未使用のローカルボリュームをすべて削除する
rm 1つまたは複数のボリュームを削除します

データボリュームの作成

使用方法: docker volume create [OPTIONS] [VOLUME]
ボリュームを作成する
オプション:
 -d, --driver string ボリューム ドライバー名を指定します (デフォルトは "local")
 --label list ボリュームのメタデータを設定する
 -o, --opt map ドライバー固有のオプションを設定する (デフォルト map[])

すべてのデータボリュームを表示

使用方法: docker volume ls [オプション]
ボリュームの一覧
別名:
 ls、リスト
オプション:
 -f, --filter フィルター フィルター値を指定します(例:'dangling=true')
 --format string Goテンプレートを使用してボリュームをきれいに印刷する
 -q, --quiet ボリューム名のみ表示

1 つまたは複数のボリュームの詳細を表示する

使用方法: docker volume inspect [OPTIONS] VOLUME [VOLUME...]
1つまたは複数のボリュームの詳細情報を表示する
オプション:
 -f, --format string 指定されたGoテンプレートを使用して出力をフォーマットします

単一のデータボリュームを削除する

使用方法: docker volume rm [OPTIONS] VOLUME [VOLUME...]
1 つ以上のボリュームを削除します。コンテナーによって使用されているボリュームは削除できません。
別名:
 rm、削除
オプション:
 -f, --force 1つ以上のボリュームを強制的に削除する

アイドルデータボリュームをすべて削除

使用方法: docker volume prune [オプション]
未使用のローカルボリュームをすべて削除する
オプション:
 --filter フィルター フィルター値を指定します (例: 'label=<label>')
 -f, --force 確認を求めない

操作例:

4. データ使用量

データ ボリュームの使用は、Linux でディレクトリまたはファイルをマウントするのと似ています。

ユーザーは、docker run の --volume/-v または --mount オプションを使用してデータ ボリュームを持つコンテナーを作成できますが、2 つのパラメーターを同時に使用することはできません。

一般的に、--mount はより明示的で詳細です。最大の違いは、-v 構文ではすべてのオプションが 1 つのフィールドにまとめられるのに対し、--mount 構文ではオプションが分離されることです。初心者の場合は、わかりやすいので --mount を使用することをお勧めします。

使用方法: docker run [オプション] イメージ [コマンド] [引数...]
新しいコンテナでコマンドを実行する
オプション:
 --volume list ボリュームをバインドマウントする
 --volume-driver string コンテナのオプションのボリュームドライバ
 --volumes-from list 指定されたコンテナからボリュームをマウントします
 --mount mount コンテナにファイルシステムマウントをアタッチする

4.1 --ボリューム使用状況の詳細

パラメータ --volume (または短縮形 -v) はバインドマウントのみ作成できます。

コマンド形式:
-v [[ホストオプション:]コンテナディレクトリ[:オプション]]]
ホストオプション:
VOLUME_NAME (データボリューム名)
ABSOLUTE-HOST-DIR (ホストファイルディレクトリの絶対パス)
ABSOLUTE-HOST-FILE (ホストファイルの絶対パス) (空の場合は匿名データボリュームがマウントされます)
オプション:
rw 読み書き可能(デフォルト)
ro 読み取り専用

4.1.1 データボリューム名によるマウント

docker run -itd -v VOLUME_NAME:CONTAINER-DIR IMAGE [コマンド] [引数...]

例:

データボリューム my_vol をコンテナの /data/docker/volume/my_vol ディレクトリにマウントします。

docker run -itd --name=vol1_ubuntu -v my_vol:/data/docker/volume/my_vol ubuntu /bin/bash

注: データ ボリューム my_vol が存在する場合は、直接マウントされます。存在しない場合は、Docker によってデータ ボリュームが自動的に作成され、マウントされます。

4.1.2 ホストファイルディレクトリの絶対パスに従ってマウントする

docker run -it -v 絶対ホストディレクトリ:コンテナディレクトリ イメージ [コマンド] [引数...]

例:

ホストファイルディレクトリ /opt/common/docker/volumes/my_vol2 をコンテナの /data/docker/volume/my_vol ディレクトリにマウントします。

docker run -itd --name=vol2_ubuntu -v /opt/common/docker/volumes/my_vol2:/data/docker/volume/my_vol ubuntu /bin/bash

注意: ホスト マシンのファイル ディレクトリは絶対パスである必要があります。

4.1.3 ホストファイルの絶対パスに従ってマウントする

docker run -itd -v VOLUME_NAME:CONTAINER-DIR IMAGE [コマンド] [引数...]

例:

ホストファイル ~/.bash_history をコンテナの /.bash_history にマウントします。

docker run -itd --name=vol3_ubuntu -v ~/.bash_history:/.bash_history ubuntu /bin/bash

4.1.4 匿名ボリュームのマウント

-v パラメータでホスト関連のボリューム情報を追加しない場合、Docker はマウント用に匿名ボリュームを作成します。

docker run -itd -v コンテナディレクトリ イメージ [コマンド] [引数...]

例:

匿名ボリュームをコンテナの/data/docker/volume/my_volディレクトリにマウントします。

docker run -itd --name=vol4_ubuntu -v /data/docker/volume/my_vol ubuntu /bin/bash

4.1.5 -v の包括的な操作例は次のとおりです。

docker run -itd --name=vol_ubuntu \
-v my_vol:/data/docker/volume/my_vol1:ro \
-v /opt/common/docker/volumes/my_vol2:/data/docker/volume/my_vol2:rw \
-v /opt/common/docker/volumes/my_vol3.txt:/data/docker/volume/my_vol3.txt \
-v /data/docker/volume/my_vol4 \
Ubuntu /bin/bash で

4.2 --mount の使用法の詳細

--mount: カンマで区切られた複数の <key>=<value> キーと値のペアで構成されます。キーの順序は任意です。

コマンド形式:
--mount type=マウントタイプ、<キー>=<値>

--mount オプションの場合、Docker は現在、ホストからコンテナにマウントするための 3 種類のデータ ボリューム (volume、bind、tmpfs) を提供しています。

3 つの方法の概略図を以下に示します。

4.2.1 名前付きマウント

通常のデータ ボリューム (このタイプがデフォルト)。これは Docker によって管理されるホスト ファイル システムの一部であり、デフォルトでは /var/lib/docker/volumes ディレクトリに配置されます。

--mount type=volume、source=<ボリューム名>、destination=<コンテナパス>、volume-driver=<ドライバー名>、volume-opt=<オプション>=<値>、readonly

<キー>=<値> 説明:
source: データボリュームのソースパス。キーワードはsourceまたはsrcです。このパラメータが存在しない場合、Dockerは自動的に匿名ボリュームマウントを作成します。
VOLUME-NAME: データボリューム名
destination: データ ボリュームの宛先パス。キーワードは destination、dst、または target です。
CONTAINER-PATH: コンテナ内のデータボリュームのマウントパス
volume-driver: データボリュームドライバを指定します。デフォルト値は「local」です。
DRIVER-NAME: ドライバー名
volume-opt: オプション、データボリュームドライバーパラメータオプション
オプション: キー値
値: 値
readonly: オプション。コンテナにマウントされるデータボリュームを読み取り専用権限で設定します。デフォルトでは読み取りと書き込みが可能です。

コード例:

docker service create --mount 'type=volume,src=<ボリューム名>,dst=<コンテナパス>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"' --name myservice <イメージ>

4.2.2 バインドマウント

データ ボリューム、ファイル、またはディレクトリをマウントにバインドします。これにより、ホスト システム上の任意の場所に保存できるようになります。

--mount type=bind、source=<ホストパス>、destination=<コンテナパス>、bind-propagation=<PG タイプ>、readonly

<キー>=<値> 説明:
source: データ ボリュームのソース パス。キーワードは source または src です。実行前に、ファイルまたはファイル ディレクトリが存在することを確認してください。存在しない場合はエラーが発生します。
HOST-PATH: ホストファイルまたはディレクトリの絶対パス
destination: データ ボリュームの宛先パス。キーワードは destination、dst、または target です。
CONTAINER-PATH: コンテナ内のデータボリュームのマウントパス
バインド伝播: オプション、
PG-TYPE: オプションの値: rprivate、private、rshared、shared、rslave、slave。
readonly: オプション。コンテナーにマウントされるデータ ボリュームを読み取り専用権限で設定します。デフォルトでは読み取りと書き込みが可能なため、このパラメーターは追加されません。

*注: Dockerfile は移植と共有を目的としているため、この使用法は Dockerfile ではサポートされていません。ただし、オペレーティング システムによってパスの形式が異なるため、現在はサポートされていません。

コード例:

docker run -d -it --name devtest --mount type=bind,source="$(pwd)"/target,target=/app --mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave nginx:latest

4.2.2 tmpfsマウント

一時データ ボリュームはホスト システムのメモリにマウントされ保存されますが、ホストのファイル システムには書き込まれません。

--mount type=tmpfs、destination=<コンテナパス>、tmpfs-size=<サイズ値>、tmpfs-mode=<モード値>、readonly

<キー>=<値> 説明:
destination: データ ボリュームの宛先パス。キーワードは destination、dst、または target です。
CONTAINER-PATH: コンテナ内のデータボリュームのマウントパス
tmpfs-size: オプション。tmpfs マウントのサイズ (バイト単位)。Linux のデフォルトは無限です。
SIZE-VALUE: 値
tmpfs-mode: オプション、tmpfs の 8 進ファイル モード。Linux でのデフォルト値は「1777」です。
MODE-VALUE: 値

注意: この機能は、Linux 上で Docker を実行している場合にのみ使用できます。

コード例:

docker run -d -it --name tmptest --mount type=tmpfs,destination=/app,tmpfs-size=1024,tmpfs-mode=1770 nginx:latest

4.3 -v と --mount の違い

(1) --mount はクラスター サービスのデータ ボリュームの作成をサポートしますが、-v はサポートしません。

(2)ファイルまたはディレクトリをマウントします。マウント前に存在しない場合は、-v docker によって自動的に作成されますが、--mount では作成されません(エラーが報告されます)。

4.4 補足事項

(1) (--mount は基本的に --volume のオプション属性を含みます) 公式の推奨は --mount メソッドを使用することです。元のテキストは次のとおりです。

--volumeを廃止する予定はありませんが、 --mountの使用が推奨されます。

(2)公式文書リンク:

詳しくはこちら

https://docs.docker.com/engine/reference/commandline/service_create/

方法3: Dockerデータボリュームコンテナ

データ ボリューム コンテナーもコンテナーですが、その目的は、他のコンテナーがマウントするためのデータ ボリュームを提供することです。ユーザーが複数のコンテナー間で継続的に更新されるデータを共有する必要がある場合、最も簡単な方法はデータ ボリューム コンテナーを使用することです。

1. データボリュームコンテナの基本的な使用方法 1.1 データボリュームコンテナの作成

データ ボリューム コンテナー dbdata を作成し、その中にデータ ボリュームを作成して、/dbdata ディレクトリにマウントします。

docker run -it -v /dbdata --name db_data ubuntu

1.2 他のコンテナのマウント

他のコンテナで --volumes-from を使用して、dbdata コンテナのデータボリュームをマウントします。

docker run -it --volumes-from db_data --name db1 ubuntu
docker run -it --volumes-from db_data --name db2 ubuntu

db1とdb2はdb_dataを通じてデータを共有します

2. データボリュームコンテナを使用してデータボリュームをバックアップ、復元、移行する

データ ボリュームは、データのバックアップ、復元、移行に使用できます。

2.1 バックアップ

まず、--volumes-from フラグを使用して、dbdata コンテナ ボリュームをマウントし、ローカル ホストの現在の /backup ディレクトリをコンテナにマウントするコンテナを作成します。コマンドは次のとおりです。

sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

コンテナが起動したら、tar コマンドを使用して dbdata ボリュームをローカルの /backup/backup.tar にバックアップします。

2.2 回復

コンテナにデータを復元する場合は、まずデータ ボリュームを持つコンテナ dbdata2 を作成します。

sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

次に、別のコンテナを作成し、dbdata2 コンテナをマウントし、untar を使用してバックアップ ファイルをマウントされたコンテナ ボリュームに解凍します。

sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

免責事項:このブログ記事の内容は、完全に個人的な理解に基づいています。異論がある場合は、コメントしてください。

これで、Docker コンテナとホスト間のデータ相互作用に関するこの記事は終了です。Docker コンテナとホスト間のデータ相互作用の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Dockerコンテナが起動直後に終了する問題を解決する
  • Dockerコンテナのネットワークポート設定プロセスの詳細な説明
  • Dockerコンテナオーケストレーション実装プロセス分析
  • Docker データボリュームコンテナの作成と使用状況分析
  • Dockerコンテナのデータボリュームの詳細な説明
  • WIN10 システムと Docker 内部コンテナ IP 間の通信方法

<<:  MySQL 8の新機能ROLEの詳しい説明

>>:  VueとReactの詳細

推薦する

Dockerデータストレージのバインドマウントの詳細な説明

この記事を読む前に、Volumes について予備知識を身に付けておいてください。詳細については、こち...

レスポンシブなカードホバー効果を実現するための HTML+CSS

目次成し遂げる:要約:言うことはあまりありませんが、まずは効果を見てみましょう。 カードホバー、レス...

航空機戦争ゲームを実装するためのネイティブJS

この記事の例では、参考のために航空機戦争ゲームを実装するためのJSの具体的なコードを共有しています。...

Linux システム修復モード (シングル ユーザー モード)

目次序文1. シングルユーザーモードでの一般的なバグ修正2. シングルユーザーモードでシステムパスワ...

CSS 水平プログレスバーと垂直プログレスバーの実装コード

時々、素敵なスクロールバー効果を見るのは楽しいものです。ここでは、CSSを使用してそれを実現する方法...

SSMプロジェクトは、ホットデプロイメント構成を実装するためにTomcatとMavenを使用してWARパッケージとしてデプロイされることが多い。

背景ご存知のとおり、JavaEE プロジェクトを開発した後は、そのプロジェクトをサーバーの Tomc...

CentOS 6-7 PHPのyumインストール方法(推奨)

1. 現在インストールされているPHPパッケージを確認するyum list installed |...

MySQL Index Pushdown (ICP) とは何かを理解するための記事

目次1. はじめに2. 原則III. 実践3.1 インデックスプッシュダウンを使用しない3.2 イン...

MySQLにインデックスを追加する方法

インデックスの簡単な紹介は次のとおりです。インデックスを追加する目的は、データベース クエリのパフォ...

Ubuntu 18仮想マシンのクローン作成後に同じIPアドレスになる問題の解決方法

序文最近、仮想マシンを使用して Ubuntu 18.04 をインストールしました。クローン作成後、I...

MySQL データベースの Binlog 使用法の概要 (必読)

MySQL データベースにとって binlog バイナリ ログがどれほど重要であるかについては詳し...

Nginx の高同時実行最適化の実践

1. チューニングの必要性​ 私は、どのように書けばいいのか本当に分からないので、共有するために最適...

Vue の better-scroll コンポーネントを使用して水平スクロール機能を実現する

について最近、Vue を学習する過程で、基本的な知識の練習と強化を目的として、Qunar.com の...

ServerSocketのデフォルトIPバインディングの実装プロセスの詳細な説明

開発中にサーバーを起動する必要がある場合、ローカルテストではポートを直接書き込み、実際の環境ではバイ...