Dockerfile における VOLUME と docker -v の違い

Dockerfile における VOLUME と docker -v の違い

Dockerfile でのボリュームのマウントと docker -v コマンドによるマウントには明らかな違いがあります。

1. ボリューム

Dockerfile で VOLUME を使用してホスト マシンにマウントされたボリュームは匿名ボリュームです。ホスト マシンでは、/var/lib/docker/volumes/ ディレクトリに自動的に匿名でマウントされます。コードは次のとおりです。

frolvlad/alpine-java:jre8-slim より
メンテナー oas.cloud
nickdir をコピーします。
ボリューム /usr/local/oas/file/
ワークディレクトリ /usr/local/oas/

上記の VOLUME /usr/local/oas/file/ は、コンテナ内のディレクトリのパスを定義します。このディレクトリは、コンテナ作成プロセス中にコンテナ内に作成され、ホスト上のマウント ディレクトリ名はランダムに生成されます。

例えば:

/var/lib/docker/ボリューム/593fda6d7b8296bfca22894b326727c734133eebb11c9bc2c25a73b892157a37

ホストマシン上で

/var/lib/docker/ボリューム/593fda6d7b8296bfca22894b326727c734133eebb11c9bc2c25a73b892157a37

ディレクトリはコンテナ内の/usr/local/oas/file/ディレクトリに対応します。

2. docker -v

docker -v はホストマシンにマウントされる特定のディレクトリを指定できるため、Dockerfile の VOLUME マウント方法よりも制御性が向上します。コードは次のとおりです。

$ docker run --name tengine-web -d -p 9527:80 -p 9000:9000 \
-v /usr/local/tengine/logs:/var/log/nginx \
-v /usr/local/tengine/conf.d:/etc/nginx/conf.d \
nginx.conf を /etc/nginx/ にコピーします。
-v /usr/local/tengine/html:/usr/share/nginx/html \
-v /usr/local/oas/file:/usr/local/oas/file nginx

上記のコマンドは、ホストの /usr/local/tengine/logs などのディレクトリを、コンテナの /var/log/nginx などの対応するディレクトリにマウントできます。コロンの前のパスはホスト ディレクトリ (絶対パス) で、コロンの後のパスはイメージにマウントされたパス (絶対パス) です。

補足: Dockerデータボリュームマウントコマンドvolume (-v)とmountの違い

1. はじめに

ユーザーは、docker run の --volume/-v または --mount オプションを使用してデータ ボリュームを持つコンテナーを作成できますが、これら 2 つのオプションには微妙な違いがあり、ここでまとめます。

2. コマンドの使用法

--volume(-v)

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

docker run --name $コンテナ名 -it \
-v $PWD/$コンテナ名/app:/app:rw \
-v $PWD/$コンテナ名/data:/data:ro \
avocado-cloud:最新の /bin/bash

注:

コマンド形式:

[[ホストディレクトリ:]コンテナディレクトリ[:オプション]]]

HOST-DIR を指定する場合は絶対パスでなければなりません。パスが存在しない場合は自動的に作成されます。

この例では、rw は読み取り/書き込み、ro は読み取り専用を意味します。

--mount

--mount パラメータは、デフォルトでボリュームをマウントするために使用されますが、バインドマウントや tmpfs の作成にも使用できます。 type オプションが指定されていない場合、デフォルトではボリュームがマウントされます。ボリュームは、より柔軟にデータを管理できる方法です。ボリュームは、docker volume コマンド セットを通じて管理できます。例:

docker run --name $コンテナ名 -it \
--mount type=bind、source=$PWD/$CONTAINER_NAME/app、destination=/app \ マウント
--mount ソース=${コンテナ名}-data、マウント先=/data、読み取り専用 \
avocado-cloud:最新の /bin/bash

注:

ボリュームマウントコマンドの形式:

[type=volume,]source=my-volume,destination=/path/in/container[,...]

バインドマウントコマンドの形式を作成します。

タイプ=bind、ソース=/path/on/host、宛先=/path/in/container[,...]

バインド マウントを作成し、ソースを指定する場合、絶対パスである必要があり、パスがすでに存在している必要があります。

この例では、readonlyは読み取り専用を意味します

3. 相違点のまとめ

1. バインドマウントの作成とボリュームのマウントの比較

比較項目バインドマウント音量
ソースの場所ユーザー指定ボリューム
ソースが空です宛先を空に上書きする宛先コンテンツを保持
ソースが空ではありません宛先コンテンツを上書きする宛先コンテンツを上書きする
ソースタイプファイルまたはディレクトリディレクトリのみ可能
携帯性一般(自己メンテナンス)強力(Dockerホスティング)
ホスト直接アクセス簡単(ただ噛むだけ)制限あり(ルートユーザーとしてログインする必要があります)*

*注記:

Docker は、sudo chown someuser: -R /var/lib/docker/volumes/somevolume を実行して、ボリュームの内容をホスト上の一般ユーザーに単純に公開することはできません。 それ以上の権限が開かれると、セキュリティ上のリスクが生じます。この点では、Podman の設計の方がはるかに理想的です。ボリュームは $HOME/.local/share/containers/storage/volumes/ パスに保存されるため、利便性が高く、セキュリティも確保されます。

コンテナはルート権限なしで実行できます。これは Podman の利点の 1 つです。実際の使用では非常に大きなメリットがあります。

2. バインドマウントを作成するときに --volume と --mount を使用する比較

比較項目--volume または -v --マウントタイプ=バインド
ホストパスが存在しない場合自動作成コマンドエラー

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • Dockerfile ファイルの書き込みとイメージ構築コマンドの分析
  • Dockerfileの簡単な紹介
  • Docker イメージの階層化と Dockerfile の記述スキル
  • Dockerfile 内の予約語命令の解析処理
  • Dockerfile ビルド中に発生する「/bin/sh: pip: コマンドが見つかりません」という問題の解決方法
  • DockerはDockerFileビルドプロセス命令の解析を実行します

<<:  CSS3はキングをマッチングさせるときにパーティクルアニメーション効果を実現します

>>:  Vue 父子価値移転、兄弟価値移転、子父価値移転の詳細な説明

推薦する

CSSのマッチング問題を解決する

問題の説明ご存知のとおり、CSS を記述する場合、HTML のクラスの定義または ID の定義に従っ...

HTML チュートリアル: 定義リスト

<br />原文: http://andymao.com/andy/post/104.h...

CSS3 と JavaScript を使用して Web カラー ピッカーのサンプル コードを開発する

この例の Web カラー ピッカー機能は、ページ効果を実現するために CSS3 を使用します。つまり...

HTML+CSS+jQuery はスクリーンショットで検索ホットリストタブ効果を模倣します

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

HTML フォームタグチュートリアル (2):

このチュートリアルでは、ウェブデザインにおけるFORMフォームタグのさまざまな属性の応用を紹介します...

Centos7 ベースの Nginx Web サイト サーバーの構築の詳細説明 (仮想 Web ホストの構成を含む)

1. Nginx サービス基盤Nginx (エンジン x) は、パフォーマンスの最適化のために特別...

iframe タグの使用方法の詳細な説明 (属性、透明度、適応高さ)

1. iframe の定義と使用法iframe 要素は、別のドキュメントを含むインライン フレーム...

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

K8s k8s はクラスターです。クラスターには複数の名前空間があります。名前空間の下には複数のポッ...

Linux の一般的な基本コマンドと使用方法

この記事では、一般的な基本的な Linux コマンドとその使用方法を例を使って説明します。ご参考まで...

Typescriptの基本構文13個を共有する

目次1. Tsとは何か2. 基本的な文法1. プリミティブデータ型を宣言する2. オブジェクト型を宣...

MySQL の異常なエラー ERROR: 2002 を解決する方法

最近、MySQL の起動中にエラーが発生しました。エラー メッセージは次のとおりです。 エラー 20...

数千万のMySQLデータ量を素早くページ分割する方法

序文バックエンド開発では、一度に大量のデータがロードされ、メモリやディスク IO のオーバーヘッドが...

特定の部門 ID に基づいて、すべての下位レベルの複数レベルのサブ部門を照会する MySQL の例

シミュレーションテーブルとデータスクリプト次の SQL ステートメントをコピーして、sys_dept...

CSS ボックスモデル内のパディングと略語の詳細な説明

上図のように、パディング値は時計回り(右上、右下)の複合属性であり、パディングの内側の余白がボックス...

ウェブページエクスペリエンス: 計画と設計

1. デザインの方向性を明確にする<br />まず、どのユーザーを対象にデザインするのか...