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 関数の詳細な説明

推薦する

MySQL 5.7.17 zip インストールおよび設定チュートリアル MySQL 起動失敗の解決策

MySQL 5.7.17、現在最新バージョンのようです、ダウンロードアドレスここで、プラットフォーム...

MySQL Community Server 5.7.16 のグリーン バージョンをインストールしてリモート ログインを実装する方法

1. MySQL Community Server 5.7.16をダウンロードしてインストールします...

Windows システムに mysql5.7.21 をインストールするための詳細なチュートリアル

MySQL インストーラーは、MySQL ソフトウェアのあらゆるニーズに対応する、使いやすいウィザー...

Docker を使用した war パッケージ プロジェクトのデプロイの実装

Docker で war をデプロイするには、コンテナを使用する必要があります。ここでは tomca...

CSSはヒントボックス、バブルボックス、三角形を作成します

場合によっては、ページにプロンプ​​ト ボックスやバブル ボックスが必要になることがあります。CSS...

最新のウェブフロントエンドフレームワーク10選を紹介(翻訳)

Web 開発の世界では、フレームワークは非常に一般的です。新しいフレームワークやテンプレートが毎日の...

js を使用してファイルが UTF-8 でエンコードされているかどうかを判断する方法

従来の解決策FileReader を使用して UTF-8 形式のファイルを読み取り、ファイルの内容に...

MySQLの指定順序ソートクエリについての簡単な説明

最近、空港や駅でフライト情報を表示するものと似た大型スクリーンディスプレイのプロジェクトに取り組んで...

MySQLのint主キーの自己増分の問題を解決する

導入MySQL データベースを使用する場合、int を主キーとして使用し、自動インクリメントに設定す...

MySQL CHARとVARCHARの選択方法

目次VARCHAR 型と CHAR 型結論: VARCHAR 型と CHAR 型VARCHAR と ...

nginx でクロスドメイン障害修復を構成する方法の例

Nginxのクロスドメイン設定は次のようには機能しません サーバー{ 聞く 80; server_n...

テーブル設定の背景画像が100%表示されない解決策

開発中に以下の状況が発見されました。 (1) ファイルが.jspファイル拡張子で保存されている場合、...

Docker イメージ管理の一般的な操作コード例

ミラーリングも Docker のコアコンポーネントの 1 つです。ミラーリングはコンテナ操作の基盤で...

tomcat ログ ディレクトリ内のログ ファイルの分析 (概要)

tomcat が起動されるたびに、次のログ ファイルがログ ディレクトリに自動的に生成され、日付順...