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

推薦する

ウェブデザインの概要

<br />1998年に最初の個人ページが誕生してから2008年の今日まで、デザイン業界...

MySQL 5.7 の一時テーブルスペースを使用して落とし穴を回避する方法

導入MySQL 5.7 は、SSL/TLS と全体的なセキュリティ開発におけるいくつかの重要な変更に...

JavaScript の基本変数

目次1. 変数の概要1.1 変数のメモリへの保存1.2 変数の使用1. 変数を宣言する2. 譲渡3....

弾幕効果を実現するためのjQuery

この記事では、弾幕効果を実現するためのjQueryの具体的なコードを参考までに共有します。具体的な内...

CSS変数を使用してダークモードを実装するためのサンプルコード

最近、WeChatはAppleによってダークモードの開発を強制されました。ますます多くのウェブサイト...

ベースタグとは何ですか? また、それは何をするのですか?

<base> タグは、ページ上のすべてのリンクのデフォルトのアドレスまたはデフォルトの...

MySQL で B+ ツリー インデックスを使用する利点は何ですか?

この問題を理解する前に、まず MySQL テーブルのストレージ構造を確認し、次にバイナリ ツリー、マ...

Vue3 トランジションアニメーションの落とし穴記録について

目次背景問題の場所さらなる分析要約する背景私のコース「Vue 3 エンタープライズレベルの音楽アプリ...

vue3 コンポーネントでの v-model の使用と詳細な説明

目次v-model 入力で双方向バインディングデータを使用するコンポーネント内の v-model他の...

Vue 仮想 DOM の問題について

目次1. 仮想DOMとは何ですか? 2. 仮想 DOM が必要な理由3. 仮想DOMはどのようにして...

Linux システムのユーザー管理コマンドの概要

ユーザーとグループの管理1. ユーザーとグループの基本概念ユーザーとグループ:システム上のすべてのプ...

MySQL での r2dbc の使用に関する詳細な理解

導入MySQL は、私たちが日常業務で使用する非常に一般的なデータベースです。MySQL は現在 O...

Vue.jsは9グリッド画像表示モジュールを実装します

Vue.js を使用して、クリックしてズームできる 9 グリッドの画像表示モジュールを作成しました。...

Vue でログインと登録テンプレートを実装するためのサンプルコード

テンプレート 1: ログイン.vue <テンプレート> <p class=&quo...

MySQLのレプリケーションの詳細な分析

1.MySQLレプリケーションの概念これは、プライマリ データベースの DDL および DML 操作...