Dockerイメージの作成Dockerfileとコミット操作

Dockerイメージの作成Dockerfileとコミット操作

イメージを構築する

イメージを構築するには、主に 2 つの方法があります。

実行中のコンテナをイメージにコミットするには、docker commit コマンドを使用します。

docker build コマンドを使用して、Dockerfile からイメージをビルドします。

まずは実行中のコンテナからイメージを送信する方法を紹介します。ここでは引き続き、busybox イメージを例として使用します。次のコマンドを使用して、busybox という名前のコンテナーを作成し、busybox コンテナーに入ります。

$ docker run --rm --name=busybox -it busybox sh

上記のコマンドを実行すると、現在のウィンドウはbusyboxコンテナを起動し、コンテナに入ります。コンテナ内で次のコマンドを実行してファイルを作成し、その内容を書き込みます。

/ # touch hello.txt && echo "私は Docker が大好きです。" > hello.txt

この時点で、コンテナのルート ディレクトリに hello.txt ファイルが作成され、そこに「I love Docker.」が書き込まれます。

次に、別のコマンド ライン ウィンドウを開き、次のコマンドを実行してイメージを送信します。

$ docker commit busybox busybox:hello

sha256:cbc6406aaef080d1dd3087d4ea1e6c6c9915ee0ee0f5dd9e0a90b03e2215e81c

次に、上記の docker image ls コマンドを使用してイメージを表示します。

$ docker イメージ ls busybox
リポジトリ タグ イメージ ID 作成 サイズ
busybox hello cbc6406aaef0 2分前 1.22MB
busybox 最新 018c9d7b792b 4 週間前 1.22MB

この時点で、ホスト上に新しい busybox:hello イメージが作成されたことがわかります。

比較すると、Dockerfile を使用した Docker ビルドの方が優れていることは明らかです。 docker commit の欠点は次のとおりです。

操作はコンテナ内で行う必要があり、面倒で非効率的です。

これも最も重要なポイントです。他の人や、時間が経てば自分自身でさえも、このイメージがどのように作成されたかはわかりませんが、Dockerfile によってビルドされたイメージを使用すると、apt-get install コマンドが実行されたことが分かります。

2 番目の方法は、最も重要で最も一般的に使用されるイメージ構築方法である Dockerfile です。 Dockerfile は、ユーザーのすべてのビルド コマンドが含まれるテキスト ファイルです。 docker build コマンドを使用して、Dockerfile からイメージを生成できます。

Dockerfile を使用してイメージを構築すると、次の機能が得られます。

Dockerfile内の各コマンド行は、一意のIDを持つ独立したイメージレイヤーを生成します。

Dockerfile 内のコマンドは完全に透過的です。Dockerfileの内容を表示することで、イメージが段階的にどのように構築されるかを確認できます。

Dockerfile はプレーンテキストなので、コードと一緒にコード リポジトリに保存し、バージョンを管理するのが簡単です。

Dockerfile を使用してイメージを構築すると多くの優れた機能があることがわかり、その使い方を知りたいと思いませんか?心配しないでください。まずは Dockerfile の一般的な手順を学びましょう。

Dockerfileの手順指導の紹介
からコメントに加えて、Dockerfile の最初の行は FROM で、その後にコンテナを構築するベースイメージを表すイメージ名が続く必要があります。
走るRUN の後には、Linux のコマンド ライン実行コマンドと同様に、特定のコマンドが続きます。
追加ローカルファイルまたはリモートファイルをイメージにコピーする
コピーローカルファイルをイメージにコピーする
ユーザーコンテナを起動するユーザーを指定する
エントリーポイントコンテナ起動コマンド
CMDF CMD は、ENTRYPOINT 命令のデフォルト パラメータを提供します。CMD のみを使用して、コンテナーの起動パラメータを指定することもできます。
環境コンテナ実行時の環境変数をキー=値の形式で指定します。
ARGB外部変数を定義します。イメージをビルドするときに、build-arg = 形式を使用してビルドのパラメータを渡すことができます。
さらすコンテナがリッスンするポートを、[port]/tcp または [port]/udp の形式で指定します。
ワークディレクトリDockerfile 内でこれに続くすべての RUN、CMD、ENTRYPOINT、COPY、ADD コマンドの作業ディレクトリを設定します。

たくさんの説明を読んで、少し混乱してしまいましたか?心配しないでください。例を挙げて説明しながら、理解を深めていきます。 Dockerfile は次のとおりです。

Centos:7より 
nginx.repo をコピー /etc/yum.repos.d/nginx.repo 
yum install -y nginxを実行します 
エクスポーズ80 
環境変数HOST=mynginx 
CMD ["nginx","-g","デーモンオフ;"]

最初の行は、centos:7 イメージに基づいてカスタム イメージを構築することを示しています。ここで注意すべき点は、コメントを除いて、各 Dockerfile の最初の行は FROM で始まる必要があるということです。

2 行目は、ローカル ファイル nginx.repo をコンテナー内の /etc/yum.repos.d ディレクトリにコピーすることを意味します。 nginx のインストール ソースを追加するために、nginx.repo ファイルをここにコピーします。

3 行目は、コンテナ内で yum install -y nginx コマンドを実行して、コンテナ内に nginx サービスをインストールすることを示しています。3 行目のコマンドを実行すると、コンテナ内に nginx がインストールされます。

4 行目は、コンテナ内のサービス (nginx) がポート 80 を使用して外部サービスを提供することを宣言します。

5行目はコンテナ起動時の環境変数HOST=mynginxを定義します。コンテナ起動後は環境変数HOSTの値がmynginxとして取得できます。

6 行目はコンテナの起動コマンドを定義し、コマンドの形式は json 配列です。ここでは、コンテナの起動コマンドが nginx に設定され、nginx をフォアグラウンドで起動するために nginx 起動パラメータ -g 'daemon off;' が追加されます。

ミラーリングの実装原理

実際、Docker イメージは一連のイメージ レイヤーで構成されており、各レイヤーはイメージ構築プロセスにおける送信を表します。以下では、イメージから構築された Dockerfile を使用して、イメージがどのように階層化されるかを説明します。

ビジーボックスより

コピーテスト /tmp/test

mkdir /tmp/testdirを実行します。

上記の Dockerfile は次の 3 つのステップで構成されています。

最初の行は、busybox に基づいてイメージ レイヤーを作成します。

2 行目は、ローカル テスト ファイルをイメージにコピーします。

3 行目は、/tmp フォルダーにディレクトリ testdir を作成します。

ここで私の Docker は overlay2 ファイル ドライバーを使用します。/var/lib/docker/overlay2 ディレクトリに移動し、tree . コマンドを使用して生成されたイメージ ファイルを表示します。

$ ツリー 。
 
# 以下はツリーの出力です。コマンド |-- 3e89b959f921227acab94f5ab4524252ae0a829ff8a3687178e3aca56d605679
 
| |-- diff # このレイヤーはベースレイヤーで、上記の Dockerfile の最初の行に対応し、/etc、/bin、/var などのディレクトリなど、busybox イメージのすべてのファイルの内容が含まれています...今回は、元のイメージファイルの内容の一部が省略されています| `-- link 
 
|-- 6591d4e47eb2488e6297a0a07a2439f550cdb22845b6d2ddb1be2466ae7a9391
 
| |-- diff # このレイヤーは上記の Dockerfile の 2 行目に相当し、テスト ファイルを /tmp フォルダーにコピーするため、diff フォルダーには /tmp/test ファイルがあります| | `-- tmp
 
| | `-- テスト
 
| |-- リンク
 
| |-- 下
 
| `-- 仕事
 
|-- バックイングFsブロックDev
 
|-- bec6a018080f7b808565728dee8447b9e86b3093b16ad5e6a1ac3976528a8bb1
 
| |-- diff # このレイヤーは、上記の Dockerfile の 3 行目に相当します。testdir フォルダーは /tmp フォルダーの下に作成されるため、diff フォルダーの下に /tmp/testdir フォルダーがあります。 | | `-- tmp
 
| | `--testdir
 
| |-- リンク
 
| |-- 下
 
| `-- 仕事
 
...

上記のディレクトリ構造から、Dockerfile 内の各コマンド行がミラー レイヤーを生成し、各レイヤーの diff フォルダーには増分データのみが格納されていることがわかります (図 2 を参照)。

階層構造により、Docker イメージは非常に軽量になります。各レイヤーには、イメージの内容に基づいて一意の ID 値があります。異なるイメージに同じイメージ レイヤーがある場合、イメージ レイヤーを異なるイメージ間で共有できます。

要約すると、Docker イメージは静的で階層的に管理されるファイルの組み合わせであり、イメージの基盤となる実装は Union File System (UnionFS) に依存しています。イメージの原則を完全に理解することは、実際の運用で最高のイメージを構築するのに役立ち、コンテナとイメージの関係をより深く理解するのにも役立ちます。

要約する

この時点で、Docker イメージのコア概念をより深く理解し、Docker イメージの一般的な操作 (プル、表示、「名前変更」、削除、カスタム イメージの構築) と基礎となる実装原則に精通していると思います。

ミラー操作コマンド:

イメージをプルし、docker pull コマンドを使用してリモート ウェアハウスのイメージをローカルにプルします。

イメージの名前を変更するには、docker tag コマンドを使用してイメージの名前を変更します。

イメージを表示するには、docker image ls または docker images コマンドを使用して、既存のイメージをローカルで表示します。

イメージを削除し、docker rmi コマンドを使用して不要なイメージを削除します。

イメージをビルドします。イメージをビルドする方法は 2 つあります。最初の方法は、docker build コマンドを使用して Dockerfile に基づいてイメージを構築することです。これは私が推奨するイメージ構築方法でもあります。2 番目の方法は、docker commit コマンドを使用して、すでに実行中のコンテナーに基づいてイメージを送信することです。

ミラーリングの実装原則:

イメージは一連のイメージ レイヤーで構成されています。各レイヤーはイメージ構築プロセスにおけるコミットを表します。イメージ内のファイルを変更する必要がある場合は、現在のイメージ レイヤーに基づいて新しいイメージ レイヤーを作成し、変更されたファイル コンテンツのみを保存するだけで済みます。レイヤー構造により、画像間で画像レイヤーを共有することが非常に簡単かつ便利になります。

Docker イメージ作成 Dockerfile とコミット操作に関する上記の記事は、私が皆さんに共有できるすべてです。これが皆さんの参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • コンテナDockerCommitを介してイメージを送信し、DockerPushでイメージをプッシュします。
  • Dockerイメージ送信コマンドcommitの動作原理と使い方の詳細な説明
  • Docker 学習ノート: コンテナをイメージにコミットする方法
  • 既存のイメージを変更する Docker の詳細な説明 (コミット)
  • コミットコマンドを使ってイメージを作成するDocker学習の詳細な説明
  • Dockerイメージコミット操作の例と機能

<<:  21 の MySQL 標準化および最適化のベスト プラクティス!

>>:  JS の new 関数の詳細な説明

推薦する

UbuntuにMySQLデータベースをインストールする方法

Ubuntu は、Linux をベースにした無料のオープンソース デスクトップ PC オペレーティン...

CSS 3.0 テキストホバージャンプ特殊効果コード

これは、CSS 3.0 で実装されたテキストのホバーとジャンプ効果です。効果は次のとおりです。 以下...

MySQL インデックスの種類 (通常、ユニーク、フルテキスト) の説明

MySQL のインデックスの種類には、通常のインデックス、一意のインデックス、全文インデックスがあり...

HTML メタの使用例

使用例コードをコピーコードは次のとおりです。 <!DOCTYPE html> <!...

2 級コンピュータ試験のための MySQL の知識ポイントとよく使用される MYSQL コマンド

2級コンピュータ試験のMySQL知識ポイントの基礎、一般的なMYSQLコマンドは次のとおりです。よく...

Linux (Ubuntu) での MySQL 5.7.17 のインストールと設定のチュートリアル

序文以前、MySQL 5.6 をインストールしました。3 か月後、開発者から MySQL で JSO...

反応ルーティングでパラメータを渡すいくつかの方法についての簡単な説明

最初のパラメータ渡し方法は、動的ルーティングパラメータ渡しです。リンクのパス属性を設定することで、ル...

CSS3 のエラスティック レイアウトでの em の使用の概要: 1em は何ピクセルですか?

私は長い間 CSS を使用してきましたが、Web 要素の関連属性を設定するために常に「px」を使用し...

JS を使用してデータ型を決定する 4 つの方法

目次序文1. 型2. インスタンス3. コンストラクター詳細: 4. 文字列要約する序文Javasc...

MySQLデータベースインデックスの欠点と適切な使用

目次インデックスの適切な使用1. 通常のインデックスのデメリット2. 主キーインデックスの落とし穴3...

要素ツリーコントロールは、ドロップダウンメニューとアイコンを統合します(ツリー+ドロップダウン+入力)

目次要件:実装手順:この記事では主に以下について説明します: カスタムツリーコントロール<el...

http:// の代わりに // を使用する利点は何ですか (アダプティブ https)

//デフォルトプロトコル/ デフォルト プロトコルの使用は、リソース アクセス プロトコルが現在の...

MySQLの比較演算子正規表現マッチングREGEXPの使用の詳細な説明

1. データを初期化する `test_01` が存在する場合はテーブルを削除します。 テーブル「te...

MySQLバックアップとリカバリの実践に関する詳細な説明

1. mysqlbackup の紹介mysqlbackup は、MySQL Enterprise B...

MySQL MHA のセットアップと切り替えに関するいくつかのエラー ログの概要

1: masterha_check_repl レプリカ セット エラー レプリケートが構成ファイルで...