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のインストールと展開

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

推薦する

Vueのフロントエンドとバックエンドのポートの不一致の問題を解決する

Vue のフロントエンドとバックエンドのポートが一致していませんconfig index.jsファイ...

CentOS 7.3 で Nginx 仮想ホストを設定する方法

実験環境最小限にインストールされた CentOS 7.3 仮想マシン基本環境を構成する1. ngin...

HTML の入力の readonly 属性と disabled 属性の違いについて簡単に説明します。

「読み取り専用」と「無効」はどちらも、ユーザーがフォーム フィールドの内容を変更できないようにしま...

jQuery でダイナミックなパーティクル効果を実現

この記事では、動的なパーティクル効果を実現するためのjQueryの具体的なコードを参考までに紹介しま...

vue + Electron でデスクトップ アプリケーションを作成するためのサンプル コード

1.vueパッケージングここでは、vueネイティブパッケージングコマンドを使用してvueプロジェクト...

画像のフェードインとフェードアウト効果を実現する js

この記事では、画像のフェードインとフェードアウトを実現するためのjsの具体的なコードを参考までに紹介...

Linux でプロセスを隠す方法と、遭遇する落とし穴

序文1. この記事で使用したツールは、https://github.com/gianlucabore...

html 内の絶対パス URL と相対パス URL、サブディレクトリ、親ディレクトリ、ルート ディレクトリ

絶対 URL は、インターネット上の特定のファイルに必要なすべてのコンテンツを表すために使用されます...

js のプロトタイプ、プロトタイプ オブジェクト、プロトタイプ チェーンの包括的な分析

目次プロトタイプを理解するプロトタイプオブジェクトを理解するインスタンスプロパティとプロトタイププロ...

JavaScript におけるセミコロンの詳細

序文JavaScript ではセミコロンはオプションであり、使用するかどうかは主にコーディング スタ...

広告を閉じる効果を実現するJavascript

参考までに、Javascript を使用して広告を閉じる方法に関するケース スタディを示します。詳細...

Dockerコンテナ間で通信する3つの方法

Docker コンテナは互いに分離されており、相互にアクセスできないことは誰もが知っていますが、依存...

Vueルータールーティングの詳細な説明

目次1. 基本的な使い方2. 注意すべき点3. マルチレベルルーティング(マルチレベルルーティング)...

CocosCreatorでリストを作成する方法

CocosCreator バージョン: 2.3.4 Cocos には List コンポーネントがない...

vue-pdf はオンラインファイルプレビューを実現します

この記事では、参考までに、ファイルのオンラインプレビューを実現するためのvue-pdfの具体的なコー...