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 ソースコードのコンパイル、インストール、および構成方法のグラフィックチュートリアル

推薦する

docker-compose を使用して Apollo カスタム環境をデプロイする詳細なチュートリアル

目次アポロ コンフィギュレーション センターとは何ですか?アポロの特徴クライアントアーキテクチャアー...

JavaScript でアルゴリズムの複雑さを学ぶ方法

目次概要Big O 表記法とは何ですか?オー(1)の上) (n^2) O(logn) ですの上!)結...

一般的な nginx コマンドをシェル スクリプトに組み込む方法の詳細な説明

1. nginxシェルスクリプトを保存するフォルダを作成する /usr/local/タスク/ngin...

NginxにLuaモジュールを追加する方法

luaをインストールする http://luajit.org/download/LuaJIT-2.0...

MySQL学習エンジンの詳細な説明、説明、権限

エンジン導入InnodbエンジンInnodb エンジンは、データベース ACID トランザクションを...

sshとは何ですか?使い方は?どのような誤解があるのでしょうか?

目次序文SSHとは何かssh は何に使用されますか? sshの使い方ssh 再修正要約する序文ssh...

要素 ui の el-table の列にさまざまなスタイルのデータを動的に実装する例

問題の説明Ele.me UI のフレームワークでは、入力データは el-form であり、出力データ...

MySQL 演算子の具体的な使用法 (and、or、in、not)

目次1. はじめに2. 本文2.1 および演算子2.2 または演算子2.3 オペレーター2.4 no...

JavaScript リフレクション学習のヒント

目次1. はじめに2. インターフェース3. 簡単な例4. 結論1. はじめにMDN の公式 Web...

MySQL 5.x 以降を使用している場合のエラー #1929 列 ''createtime'' の日付時刻値が正しくありません: '''' の簡単な解決方法

MySQL をインストールした後、テーブル データを保存および削除しようとすると、常にエラー メッセ...

表示しているページのスナップショットを Baidu が保存できないように設定する方法

今日、Baidu でページを検索したところ、ページが削除されていたため、当然 Baidu スナップシ...

ブラウザ間の hr 区切り文字の違い

Webページを作るときに、区切り線hrを使うことがありますが、IE6やIE7で表示するのは非常に苦痛...

JSを使用して画像を効果的に圧縮する方法

目次序文変換関係具体的な実装file2DataUrl(ファイル、コールバック) file2Image...

テキストエリアの disabled 属性と readonly 属性の具体的な使用法

障害者の定義と使用法disabled 属性はブール属性です。 disabled 属性は、テキスト領域...

WebプロジェクトのDockerデプロイメントの実装

前回の記事では、docker サービスをインストールしました。引き続き、Web プロジェクトのデプロ...