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

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

Dockerfile の紹介

Docker は、Dockerfile の内容を読み取ってイメージを自動的にビルドできます。Dockerfile は、ビルド プロセス中に実行する必要があるすべてのコマンドを含むテキスト ファイルです。 Dockerfile は Docker プログラムによって解釈されるスクリプトであり、1 つ 1 つの命令から構成されているとも言えます。各命令は Linux システムのコマンドに対応しています。Docker プログラムはこれらの Dockerfile 命令を実際の Linux コマンドに変換します。 Dockerfile には独自の記述形式とサポートされているコマンドがあります。Docker プログラムは Makefile と同様に、これらのコマンド間の依存関係を解決します。

Docker プログラムは Dockerfile を読み取り、指示に従ってカスタマイズされたイメージを生成します。イメージのようなブラックボックスと比較すると、Dockerfile のようなわかりやすいスクリプトは、イメージがどのように生成されるかを明確に示しているため、ユーザーに受け入れられやすくなります。 Dockerfile を使用すると、独自の追加要件をカスタマイズする必要がある場合、Dockerfile に指示を追加または変更してイメージを再生成するだけで済み、コマンドを入力する手間が省けます。

Docker イメージの構築方法: commit、dockerfile

1. commit を使用してイメージをビルドします。

コミットは、元のイメージに基づいて構築されたイメージです。この方法を使用してイメージを構築する目的は、イメージ内にいくつかの構成情報と変更された情報を保存することです。これはミラーのスナップショットに相当します。

2. dockerfile を使用してイメージをビルドします。

Dockerfile は、必要な (カスタム) イメージをすばやく構築するために使用されます。

Dockerfile の説明:

FROM: ベース イメージを指定します (FROM は必須の命令であり、最初の命令である必要があります)。

RUN: コマンドラインコマンドを実行するために使用されます。基本的な形式:

シェルの形式は、RUN <コマンド> です。bash 環境でコマンドを入力するだけです。Dockerfile では、最大 127 レイヤーまで RUN を使用できます。したがって、RUN を 1 回使用し、'\' を使用して行を折り返し、'&&' を使用して次のコマンドを実行します。一般的にはこの形式が使用されます。

exec 形式: RUN <"実行ファイル", "パラメータ 1", "パラメータ 2">、このメソッドは関数呼び出しの形式に似ています。

コピー: ファイルをコピーします。 基本的な形式:

形式 1: COPY <ソース パス>...<宛先パス>

形式 2: COPY [“<ソース パス 1>”,….”<宛先パス>”]

ADD: より高度なファイルコピー機能。COPY をベースにいくつかの機能を追加します。コピーされたファイルが圧縮ファイルの場合、RUN を使用して解凍せずに直接解凍されます。

CMD: コンテナの起動コマンド。基本的な形式:

シェル形式: CMD <コマンド>

exec 形式: CMD ["実行可能ファイル", "パラメータ 1", "パラメータ 2"...]

パラメータリストの形式は、CMD ["パラメータ1", "パラメータ2"...] です。ENTRYPOINT命令を指定した後、CMDを使用して特定のパラメータを指定します。

ENTRYPOINT: エントリポイント。基本的な形式は exec と shell に分かれています。

ENTRYPOINT の目的は CMD と同じで、コンテナの起動プログラムとパラメータを指定することです。 ENTRYPOINT は動作中に置き換えることができますが、CMD よりも面倒で、docker run の --entrypoint パラメータで指定する必要があります。 ENTRYPOINT が指定されると、CMD の意味が変わります。コマンドを直接実行するのではなく、CMD の内容が ENTRYPOINT 命令にパラメータとして渡されます。実行すると、次のようになります: <ENTRYPOINT> "<CMD>"

ENV: 環境変数を設定します。 (ここで使用されている変数を使用できます) 基本的な形式は次のとおりです。

フォーマット 1: ENV <キー> <値>

形式 2: ENV <key1>=<value1> <key2>=<value>...

ARG: ビルドパラメータ。ビルドパラメータの効果は ENV と同じで、どちらも環境変数を設定します。違いは、ARG によってビルドされた環境変数は、コンテナが将来実行されるときには存在しないことです。基本的な形式:

形式 1: ARG <パラメータ名> [=<デフォルト値>]

形式 2: このデフォルト値は、ビルド コマンド docker build で --build-arg <パラメータ名>=<値> を使用して上書きできます。

VOLUME: 匿名ボリュームを定義します。 基本的な形式:

形式 1: VOLUME ["<path1>", "<path2>"...]

形式 2: VOLUME <パス>

EXPOSE: ポートを公開します。 EXPOSE 命令は、ランタイム コンテナによって提供されるポートを宣言します。コンテナの起動時に、この宣言によりポートは開かれません。 基本的な形式:

形式 1: EXPOSE <port1> [<port2>...]

WORKDIR: 作業ディレクトリを指定します。基本的な形式:

形式 1: WORKDIR <作業ディレクトリのパス>

USER: 現在のユーザーを指定します。 USER は、指定されたユーザーに切り替えるのに役立ちます。 基本的な形式:

形式 1: USER <ユーザー名>

HEALTCHECK: コンテナの状態が正常かどうかを判断するためのヘルスチェック。 基本的な形式:

フォーマット1: HEALTCHECK [オプション] CMD <コマンド> : コンテナの健全性をチェックするコマンドを設定します

形式 2: HEALTCHECK NONE: ベース イメージにヘルス チェックの指示がある場合は、この形式を使用してヘルス チェックの指示をブロックします。

nginx イメージをビルドします。

ディレクトリを作成し、その中に Dockerfile を書き込みます。

[root@docker ~]# mkdir mynginx
[root@docker ~]# cd mynginx/
[root@docker mynginx]# pwd
/root/mynginx
[ルート@docker mynginx]#

作成したディレクトリ (mynginx ディレクトリ) に nginx ソース パッケージをダウンロードします。

[root@docker ~]# wget -P /root/mynginx/ http://nginx.org/download/nginx-1.15.2.tar.gz

Dockerfile を記述します。

[root@docker mynginx]# vi Dockerfile

その内容は次のとおりです。

Centosより
ping -c 1 www.baidu.com を実行します。
実行 yum -y install gcc make pcre-devel zlib-devel tar zlib
nginx-1.15.2.tar.gz /usr/src/ を追加します。
実行cd /usr/src/nginx-1.15.2 \
  && mkdir /usr/local/nginx \
  && ./configure --prefix=/usr/local/nginx && make && make install \
  && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ \
  && nginx
rm -rf /usr/src/nginx-1.15.2 を実行します。
エクスポーズ80

docker コマンドを実行してイメージをビルドします。

[root@docker mynginx]# docker build -t nginx:v3 .
ビルド コンテキストを Docker デーモンに送信 1.029MB
ステップ 1/7: Centos から
 ---> 5182e96772bf
ステップ 2/7: ping -c 1 www.baidu.com を実行します。
 ---> キャッシュの使用
 ---> 2f70f8abaf2a
ステップ 3/7: yum -y install gcc make pcre-devel zlib-devel tar zlib を実行します。
 ---> キャッシュの使用
 ---> dbdda4b7ae6f
ステップ 4/7: nginx-1.15.2.tar.gz /usr/src/ を追加します。
 ---> キャッシュの使用
 ---> 18ace6285668
ステップ 5/7: 実行 cd /usr/src/nginx-1.15.2 && mkdir /usr/local/nginx && ./configure --prefix=/usr/local/nginx && make && make install && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ && nginx
 ---> キャッシュの使用
 ---> 99629488ede9
ステップ 6/7: rm -rf /usr/src/nginx-1.15.2 を実行します。
 ---> キャッシュの使用
 ---> 869fbad71879
ステップ 7/7: EXPOSE 80
 ---> キャッシュの使用
 ---> 384ベッド72ea6f
384bed72ea6f の構築に成功しました
nginx:v3 のタグ付けに成功しました

「Successfully」が 2 つ出力された場合、ビルドは成功です。

カスタムイメージを起動します。

ビルドされたイメージを表示するには、docker イメージを使用します。

カスタムイメージを起動します。

[root@docker ~]# docker run -dit -p 80:80 --name nginx nginx:v3
ecaafe1190447878b98dfb0198e92439db60ff7dab57a1674e0e9e7282a9c858
[root@docker ~]# docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート名
ecaafe119044 nginx:v3 "/bin/bash" 3 秒前 2 秒前にアップ 0.0.0.0:80->80/tcp nginx

注: この時点では、コンテナをどのように起動しても、コンテナは常に終了状態になります。

さまざまな解決策を試した後、ようやく問題がどこにあるのかが分かりました。 コンテナを起動すると、スレッドに対応したバックグラウンドで起動されることがわかりました。起動時にはすでに起動していますが、コマンドを実行した後は終了し、バックグラウンドでは実行されません。そのため、-dit パラメータを使用してバックグラウンドで実行できるようにします。

[root@docker ~]# docker run -dit -p 80:80 --name nginx nginx:v3
ecaafe1190447878b98dfb0198e92439db60ff7dab57a1674e0e9e7282a9c858
[root@docker ~]# docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート名
ecaafe119044 nginx:v3 "/bin/bash" 3 秒前 2 秒前にアップ 0.0.0.0:80->80/tcp nginx

しかし.......

このとき、別の問題が発生しました。立ち上がっているのに、nginx の Web ページ インターフェースにアクセスできず、接続が拒否されたと表示されました。 ! ! !

[root@docker ~]# カール 192.168.100.22
curl: (7) 192.168.100.22:80 への接続に失敗しました。接続が拒否されました [root@docker ~]# elinks --dump 192.168.100.22
ELinks: 接続が拒否されました

その後、Baiduに問い合わせ、FQで検索し、Googleで調べた結果、ようやく問題が見つかりました。コンテナに入り、nginx を起動するには、exec を使用するだけでよいことがわかりました。

[root@docker ~]# docker exec -it nginx bash
[root@ecaafe119044 /]# nginx
[root@ecaafe119044 /]# 終了
出口
[root@docker ~]# カール 192.168.100.22
<!DOCTYPE html>
<html>
<ヘッド>
<title>nginx へようこそ!</title>
<スタイル>
  体 {
    幅: 35em;
    マージン: 0 自動;
    フォントファミリー: Tahoma、Verdana、Arial、sans-serif;
  }
</スタイル>
</head>
<本文>
<h1>nginx へようこそ!</h1>
<p>このページが表示されたら、nginxウェブサーバーは正常にインストールされており、
動作しています。さらに設定が必要です。</p>

<p>オンラインドキュメントとサポートについては、
<a href="http://nginx.org/" rel="external nofollow" >nginx.org</a>。<br/>
商用サポートは以下からご利用いただけます。
<a href="http://nginx.com/" rel="external nofollow" >nginx.com</a> です。</p>

<p><em>nginx をご利用いただきありがとうございます。</em></p>
</本文>
</html>

それで! nginx イメージの購入に成功しました! ! ! !

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

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

<<:  要素 el-table テーブルの二次カプセル化 (テーブルの高さの調整付き)

>>:  MySQL 5.7.13 ソースコードのコンパイル、インストール、および構成方法のグラフィックチュートリアル

推薦する

Vue の echarts ツールチップにクリック イベントを追加する詳細な説明

目次必要回避策1. ツールチップを設定する2. hookToolTip変数を定義する3. メソッド内...

MySQL の完全なデータベース バックアップからデータベースとテーブルを復元する方法

公式の MySQL ダンプ ツールで、特定のデータベースのみを復元するにはどうすればよいですか?完全...

nginx アンチホットリンクおよびアンチクローラー設定の詳細な説明

新しい設定ファイルを作成します (たとえば、nginx インストール ディレクトリの下の conf ...

JS でパブリッシュ サブスクライブ モデルを作成する

目次1. シーン紹介2 コードの最適化2.1 ファンを増やす問題を解決する2.2 作品追加の問題を解...

CocosCreator Huarongdaoデジタルパズルの詳しい説明

目次序文文章1. パネル2. 華容島ソリューション3. コード4. 注記序文華容路とは何ですか? 誰...

Python スクリプトを Ubuntu で直接実行する方法

翻訳プログラムを例に挙げてみます。前回はWindowsでのアプリケーションのパッケージ化についてお話...

Dockerコンテナ内にkibanaトークナイザーをインストールする方法

ステップ: 1. 仮想マシンディレクトリに新しいdocker-compose.ymlファイルを作成し...

ファイル共有サーバーを構築するための samba + OPENldap の詳細な説明

ここでは、samba (ファイル共有サービス) v4.9.1 + OPENldap (バックエンド ...

CentOS 6.4 MySQL 5.7.18 のインストールと設定方法のグラフィックチュートリアル

Centos6.4 で mysql5.7.18 をインストールするための具体的な手順が全員に共有され...

Vue3 の ref toRef と toRefs の違いを理解する方法

目次1. 基本1.参照2. 参照3. 参照4. 最適な使い方2. 詳細な1. なぜrefが必要なのか...

要素を中央に配置するための配置方法 (Web ページ レイアウトのヒント)

ブラウザウィンドウの中央に要素を配置する方法まず、コード ブロックを示します。すでにコードを理解して...

標準SQL更新ステートメントの3つの用途についての簡単な理解

1. 環境: MySQL-5.0.41-win32 Windows XP プロフェッショナル2. テ...

光るテキストとちょっとしたJS特殊効果を実現するCSS

実装のアイデア: CSSでtext-shadowを使用してテキストの光る効果を実現します効果画像: ...

Hadoop におけるネームノードとセカンダリネームノードの動作メカニズムの説明

1) プロセス 2) FSImageと編集NodeNode は HDFS の頭脳です。ファイルシステ...

CentOS 7 で NFS ファイル共有ストレージ サービスを構築するための完全な手順

序文NFS (Network File System) は、ネットワーク ファイル システムを意味し...