Dockerfileを使用してDockerイメージを構築する

Dockerfileを使用してDockerイメージを構築する

今日は、Dockerfile を作成する方法を見ていきます。

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

1. 1つはdocker commitコマンドを使うことです

2. もう1つはdocker buildコマンドとdockerfileファイルに基づいています

一般的に、Dockerfile を使用してイメージをビルドする方が、Docker commit コマンドを使用してイメージをビルドするよりも柔軟性が高いため、後者の方が一般的に使用されます。

Dockerfileを使用してDockerイメージを構築する

1. Dockerfile とは何ですか?

dockerfile は DSL 構文を使用して記述されたファイルであり、docker build コマンドを使用して、dockerfile ファイル内の指示に基づいて新しいイメージを構築します。

コードが次の通りだとします:

mkdir テスト

CDテスト

Dockerfileに触れる

テスト ディレクトリを作成し、そのディレクトリに入って dockerfile_test ファイルを作成したことを理解するのは難しいことではありません。このディレクトリはビルド環境と呼ばれます。Docker はこの環境をコンテキストまたはビルド コンテキストと呼びます。Docker はイメージをビルドするときに、ビルド コンテキストとコンテキスト内のファイルとディレクトリを Docker デーモンにアップロードします。これにより、Docker デーモンはイメージに保存されているコード、ファイル、その他のデータに直接アクセスできるようになります。

Docker ファイルの内容を見てみましょう。

# バージョン: 0.0.1
ubuntu:14.04から
メンテナー Yeyz '[email protected]'
apt-get updateを実行する
apt-get install -y nginxを実行します
RUN echo 'こんにちは、私はあなたのコンテナです' > /root/test.html
エクスポーズ80

上記のファイルの内容から、Dockerfile に一連のコマンドが含まれており、各コマンドを大文字のキーワードでマークする必要があることが簡単にわかります。 # で始まるコンテンツはコメントとして認識されます。

Docker は通常、Dockerfile 内のコマンドを次の順序で実行します。

1. Docker はベース イメージからコンテナを実行します。各 DockerFile の最初のコマンドは From である必要があります。From はベース イメージを指定し、後続の命令はこれに基づいて実行されます。

2. コンテナを変更する命令を実行する

3. docker commitと同様の操作を実行して新しいイメージレイヤーを送信します。

4. Dockerイメージは、送信されたイメージに基づいてコンテナを実行します。

5. すべてのコンテナ命令が実行されるまで、Dockerfile内の次の命令を実行します。

上記のプロセスで、いずれかのステップが実行に失敗した場合、ターゲット イメージの作成に失敗したことを意味します。ただし、ターゲット イメージはイメージを次々に積み重ねた結果であるため、実際には実行可能なイメージが得られますが、まだ最終イメージには達していません。この機能は、イメージのデバッグにとって非常に重要です。

上記の画像について説明します。

バージョン: バージョンを示すコメントを表します

From命令では、ベースイメージubuntuを指定し、操作がベースイメージubuntu上で実行されることを示します。

メンテナーディレクティブ。画像の作成者と作成者のメールアドレスを表します。

RUN 命令は、現在のイメージで指定されたコマンドを実行します。3 つの命令は、apt リポジトリの更新、nginx パッケージのインストール、指定されたファイルへのコマンドの出力です。各コマンドはイメージレイヤーを作成します。コマンドが成功すると、イメージ レイヤーがコミットされ、DockerFile 内の次の命令が指定されます。デフォルトでは、RUN コマンドはシェルで /bin/bash -c を使用して、次の命令を実行します。

Expose 命令は、コンテナ内のアプリケーションにコンテナの指定されたポートを使用するように指示します。もちろん、複数の EXPOSE を使用して複数のポートを外部に公開することもできます。

2. Dockerfileを実行してイメージをビルドする

今 Dockerfile を実行すると、次の結果が得られます。

[ルートテスト]# docker build -t='yeyz:test0' 。
ビルド コンテキストを Docker デーモンに送信しています 2.048 kB
ステップ 1/6: ubuntu:14.04 から
リポジトリ docker.io/library/ubuntu をプルしようとしています...
 14.04: docker.io/library/ubuntu からプル
2e6e20c8e2e6: ダウンロード中 [> ] 539.1 kB/70.69 MB
95201152d9ff: ダウンロードが完了しました
 5f63a3b65493: ダウンロードが完了しました

-t オプションはイメージとウェアハウス名を指定するために使用され、yeyz はウェアハウス名、test0 はイメージ名です。コマンド内の . は現在のディレクトリを表します。Docker はデフォルトでローカル ディレクトリで DockerFile を検索します。また、指定された Git リポジトリ ソース アドレスに置き換えて、DockerFile の場所を指定することもできます。次のように:

docker build -t='yeyz/test0' xxxx.com:yeyz/test0

バージョン情報を保持したい場合は、次のようにタグを指定できます。

docker build -t='yeyz/test0:v1' .

特定のディレクトリの下にあるいくつかのファイルのみをアップロードしたい場合は、各行がファイル フィルターの一致パターンである .dockerignore ファイルを作成できます。このようにして、イメージを生成するときに、不要なファイルが自動的にフィルターされます。

最終的な戻り値はイメージ ID です。イメージ ID を取得したら、docker run コマンドを使用してイメージを実行できます。

3. Dockerfileビルドキャッシュ

Dockerfile を最初にビルドするときに問題が発生した場合、再度ビルドする必要があり、今回は同じ命令が実行されます。Dockerfile の 4 行目のコンテンツを変更すると、Docker はキャッシュによって最初の 3 行を自動的にロードするため、多くの時間を節約できます。

Dockerfile キャッシュを使用しない場合は、--no-cache パラメータを追加することで Dockerfile キャッシュの使用を回避できます。

4. イメージのビルド履歴を表示する

Docker 履歴では、ビルドされたイメージのビルド履歴と、ビルドされたイメージの各レイヤーを表示できます。

[root@VM-16-13-centos test]# docker イメージ mysql
リポジトリ タグ イメージ ID 作成 サイズ
docker.io/mysql 最新 4f1413420360 7 週間前 545 MB

[root@VM-16-13-centos テスト]# docker 履歴 4f1413420360
画像作成者 サイズ コメント
4f1413420360 7 週間前 /bin/sh -c #(nop) CMD ["mysqld"] 0 B
                 <欠落> 7 週間前 /bin/sh -c #(nop) EXPOSE 3306 33060 0 B
                 <missing> 7 週間前 /bin/sh -c #(nop) ENTRYPOINT ["docker-ent... 0 B
                 <欠落> 7 週間前 /bin/sh -c ln -s usr/local/bin/docker-entr... 34 B
                <欠落> 7 週間前 /bin/sh -c #(nop) COPY ファイル:f9202f6b715c0e... 13.1 kB
             <欠落> 7 週間前 /bin/sh -c #(nop) COPY dir:2e040acc386ebd2... 1.12 kB
             <欠落> 7 週間前 /bin/sh -c #(nop) VOLUME [/var/lib/mysql] 0 B
                 <欠落> 7 週間前 /bin/sh -c { echo mysql-community-server... 410 MB
              <欠落> 7 週間前 /bin/sh -c echo "deb http://repo.mysql.com... 55 B
                <欠落> 7 週間前 /bin/sh -c #(nop) ENV MYSQL_VERSION=8.0.2... 0 B
                 <欠落> 7 週間前 /bin/sh -c #(nop) ENV MYSQL_MAJOR=8.0 0 B
                 <欠落> 7 週間前 /bin/sh -c set -ex; key='A4A9406876FCBD3C... 2.61 kB
             <不足> 7 週間前 /bin/sh -c apt-get update && apt-get insta... 52.2 MB
             <欠落> 7 週間前 /bin/sh -c mkdir /docker-entrypoint-initdb.d 0 B
                 <欠落> 7 週間前 /bin/sh -c set -eux; savedAptMark="$(apt-... 4.17 MB
             <欠落> 7 週間前 /bin/sh -c #(nop) ENV GOSU_VERSION=1.12 0 B
                 <欠落> 7 週間前 /bin/sh -c apt-get update && apt-get insta... 9.34 MB
             <欠落> 7 週間前 /bin/sh -c groupadd -r mysql && useradd -r... 329 kB
              <欠落> 7 週間前 /bin/sh -c #(nop) CMD ["bash"] 0 B
                 <不足> 7 週間前 /bin/sh -c #(nop) ADD file:d2abb0e4e7ac177... 69.2 MB

以上が、Dockerfile を使用して Docker イメージを構築する方法の詳細です。Dockerfile を使用して Docker イメージを構築する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Dockerfile ファイルの書き込みとイメージ構築コマンドの分析
  • Dockerfile を使用したカスタムイメージの構築の実装
  • Dockerfileを使用してDockerイメージを構築する手順
  • Dockerfile に基づいて Tomcat イメージを構築する方法
  • Dockerfile を使用して Docker でイメージを構築する方法
  • Dockerfile を使用して nginx イメージを構築する例
  • Dockerfileを使用してイメージを構築する方法
  • dockerfile命令を使用してdockerイメージを構築するためのサンプルコード

<<:  MySQL Routerのインストールと展開

>>:  シームレスなトークンリフレッシュを実現する方法

推薦する

Linux 脆弱性スキャンツール lynis の使用分析

はじめに: Lynis は、徹底的なセキュリティ スキャンを実行できる Unix システム用のセキュ...

WeChatミニプログラムのすべてのページがログインされていることを確認する方法

目次現状解決さらなる解決策やっと現状WeChat ミニプログラムには、ホームページ、個人ページ、いく...

HTML ハイパーリンク スタイル (4 つの異なる状態) の設定例

コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...

JavaScript es6 における var、let、const の違いの詳細な説明

まず、よくある質問は、ECMAScript と JavaScript の関係は何ですか? ECMAS...

MySQL 8.0 のタイムゾーン問題を解決する手順

ソフトウェアバージョンウィンドウズ: ウィンドウズ10 MySQL: mysql-8.0.16-wi...

MySQL 5.7 スレーブノードからマルチスレッド マスター スレーブ レプリケーションを構成する方法の詳細な説明

序文MySQL は MySQL 5.6 からマルチスレッド レプリケーションをサポートしていますが、...

::before/:before と ::after/:after の使用に関する深い理解

パート1: 基礎1. :active や :hover などの疑似クラスとは異なり、これらはすべて疑...

MySQLインデックスの詳細

1. インデックスの原則インデックスは、列内の特定の値を持つ行をすばやく見つけるために使用されます。...

Docker Desktop で rocketmq をインストールするための非常に詳細なチュートリアル

Dockerデスクトップをインストールするダウンロード先: Docker Desktop for M...

フェッチネットワークリクエストのカプセル化例の詳細な説明

エクスポートデフォルト({ URL、 メソッド = 'GET'、 データ = nu...

Vue2.x における双方向バインディングの原理と実装

目次1. 実施プロセス2. オブザーバーを表示する3. ウォッチャーを実装する4. コンパイルを実装...

CSS3はブラウザのスクロールバーのスタイルを変更します

注意: この方法は、Webkit ベースのブラウザにのみ適用されます。ブラウザのスクロールバーが広す...

Nginx ログ管理の概要

Nginx ログの説明アクセス ログを通じて、ユーザーの地理的起源、ジャンプ元、使用端末、特定の U...

React-vscode で jsx 構文を使用する際の問題と解決策

問題の説明プラグインをインストールした後、ES7 React/Redux/GraphQL/React...

Web2.0製品と機能の簡単な紹介

<br />Web2.0とは何ですか? Web2.0にはソーシャルネットワーク製品とその...