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 父子価値移転、兄弟価値移転、子父価値移転の詳細な説明

推薦する

nginx 設定ファイルで環境変数を使用する方法

序文Nginx はパフォーマンスを重視して設計された HTTP サーバーです。Apache や li...

Docker で Maven プロジェクトをより速くビルドする

目次I. 概要2. 従来の多段階イメージ構築3. Buildkitを使用してイメージをビルドする4....

Vueカスタム命令とその使用方法の詳細な説明

目次1. 指令とは何ですか? Vue でよく使われる組み込みの v ディレクティブv-if と v-...

MySQL 5.7.17 でパスワードを忘れた場合の対処方法

1. my.iniファイルにskip-grant-tablesを追加し、MySQLサーバーを再起動し...

MySQLクエリが遅い原因と解決策

クエリ速度が遅くなる理由は多数ありますが、最も一般的な理由は次のとおりです。 1. インデックスがな...

Prometheusコンテナのデプロイメントのための実用的なソリューション

環境ホスト名IPアドレス仕えるプロメテウス192.168.237.137プロメテウス、グラファナノー...

MySQL トリガー: 複数のトリガー操作の作成例の分析

この記事では、例を使用して、MySQL で複数のトリガー操作を作成する方法について説明します。ご参考...

Uniapp は DingTalk スキャンコード ログイン サンプル コードを実装します

UniappにはDingTalk認証ログインがないため、この記事ではDingTalk QRコードログ...

Linuxプロセス監視と自動再起動の簡単な実装方法

目的: Linux では、さまざまな理由でサーバー プログラムがダンプされ、ユーザーの使用に影響する...

HTML 要素 (タグ) とその使用法

a : ハイパーリンクの開始位置または宛先位置を示します。頭字語: 単語の最初の文字からなる略語を示...

イメージのアップロードとダウンロードに docker をプロキシするためのプライベート ライブラリとして nexus を使用する

1. Nexusの設定1. Dockerプロキシを作成する外部ネットワーク ウェアハウスからローカル...

js SMS認証コード入力ボックスを手動で実装する

序文この記事では、私が手動で実装したフロントエンドの一般的な SMS 認証コード入力コンポーネントと...

HTML のフォームフォームのメソッド属性の紹介

1 メソッドは、データをサーバーに送信する方法を指定するプロパティです。 2 post と get ...

js の通常形式の日付と時刻に 0 を自動的に追加する 2 つのソリューション

目次背景解決策1アイデア:コード:解決策2アイデア:要約する参照する背景日付と時間をフォーマットする...

Navicat Premium が MySQL 8.0 に接続してエラー「1251」を報告する問題を解決する方法の分析

長い間何もしていなかった人は、努力をすると一生懸命働いていると思うようになります。 1. 問題Nav...