Dockerfile を使用したカスタムイメージの構築の実装

Dockerfile を使用したカスタムイメージの構築の実装

序文

前回の記事では、docker でコンテナを実行するために使用するイメージを dockerhub からリモートで取得しましたが、独自のイメージを構築することはできるでしょうか?答えはイエスです。Dockerfile を通じて独自のイメージを構築できます。Dockerfile 自体は難しくなく、単なるコマンドの集まりです。難しいと感じるのは、Dockerfile のこれらのコマンドを使用して、より高いレベルの観点から独自のイメージをより適切に構築する方法です。見てみましょう。

Dockerfile の紹介

Dockerfile は実際にはファイルです。ファイルの名前は Dockerfile です。もちろん、この名前を使用して、イメージをビルドするときに名前を指定することもできます。ただし、一般的には Dockerfile を使用すると言われています。Dockerfile の主な機能は、カスタム イメージのビルドを支援することであるため、Dockerfile はイメージ ビルド ファイルまたはイメージ記述ファイルとも呼ばれます。

Dockerhub には基本的にすべてのサービスを満たした公式イメージが多数提供されているのに、なぜイメージをカスタマイズする必要があるのか​​と疑問に思う友人もいるかもしれません。 Dockerfile を使用して独自のイメージを構築することで、独自のアプリケーションをイメージにパッケージ化でき、そのイメージを実行すると、カスタマイズされた機能の一部を使用してサービスを直接実行できます。

例えば、dockerhubからcentos7イメージをダウンロードする場合、公式イメージにはvim機能がありません。そのため、公式centosイメージをベースに独自のイメージをビルドして、centosコンテナの実行時にvimを自動的にインストールすることができます。

Dockerfileはイメージプロセスを構築する

Dockerfile イメージ構築プロセスを紹介する前に、重要な概念であるコンテキスト ディレクトリについて知っておく必要があります。Dockerfile が配置されているディレクトリはコンテキスト ディレクトリと呼ばれます。

Docker は CS アーキテクチャです。Dockerfile を使用してイメージをビルドするために使用されるコマンドは docker build です。コマンドがクライアントのオペレーティング システムで実行されると、docker エンジンは Dockerfile が配置されているディレクトリ内のすべてのデータをパッケージ化し、docker サーバーに送信します。したがって、Dockerfile が配置されているディレクトリには、現在のイメージをビルドするために必要なファイルのみが含まれている必要があります。サーバーが Dockerfile 内のコマンド行を実行すると、docker キャッシュに一時イメージが生成されます (一時イメージを生成しない場合は、docker build の後に --no_cache パラメータを追加します)。最後の行まで実行すると、最終イメージが取得されます。次の図に示すように:

Dockerfile の使用

まず、イメージをビルドするための Dockerfile のコマンドについて説明します。

# コマンド形式: docker build -t イメージ名: タグ Dockerfile が配置されているパス docker build -t mycentos:01 .

以下は Dockerfile でよく使用されるコマンドの一部です。Dockerfile 内のすべてのコマンドは大文字で始まることに注意してください。

FROM イメージ名: タグ: Dockerfile の最初のコマンド。どのイメージに基づいてイメージを構築するかを示します。カスタム イメージがビルドされますが、このカスタム イメージも公式のベース イメージ上にビルドされます。

# Dockerファイル
FROM centos:7 # は、イメージが centos7 に基づいて構築されていることを示します。

RUN: イメージをビルドするときに実行する必要があるコマンド。その後にシェル コマンドを続けることができます。

# 最初の構文形式 RUN yum install -y vim

# 2番目の構文形式 RUN ["yum", "install", "-y", "vim"]

EXPOSE: 外部に公開されるポート。イメージ内でポートが公開されている場合にのみ、docker run コマンドを実行するときに -p パラメータを指定できます。

EXPOSE 9000 # はポート9000を公開することを示します

WORKDIR: コンテナに入るときのパスを指定します。パスは複数記述できます。コンテナ内に指定パスがない場合はパスが作成されます。パスは複数記述できます。次のパスは前のパスを基準とした相対パスです。

ワークディレクトリ /データ
ワークディレクトリ /a

COPY: コンテキスト ディレクトリ内の指定されたファイルをイメージ内の指定されたディレクトリにコピーします。

# コマンド形式: COPY 元のパス (絶対パスまたは相対パス) コンテナ内のターゲットパス# 構文形式 1 COPY /root/app/aa.txt /data 

# 構文形式 2 COPY ["<src>", ..., "<dest>"] --- 構文形式 2

ADD: コンテキスト ディレクトリ内の指定されたファイルをミラーの指定されたディレクトリにコピーします。URL を識別し、URL に対応する圧縮パッケージを自動的にダウンロードできます。また、ローカルの圧縮パッケージをミラーの指定されたディレクトリにコピーし、自動的に解凍することもできます。

#コンテキストディレクトリ内の指定されたファイルをミラーの指定されたディレクトリにコピーします ADD bb.txt /data

# URL を自動的に識別し、コンテナ内の指定されたディレクトリにダウンロードします ADD https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz /data

# 圧縮されたパッケージは指定されたディレクトリに自動的に解凍されます ADD xxx.tar /data

ENTRYPOINT: コンテナの起動時に実行するコマンドを指定するために使用されます。CMD と同様に、コンテナの起動後の最初のコマンドを設定するためによく使用されます。複数のコマンドを記述でき、上書きすることもできます。

# ENTRYPOINT シェル スクリプトまたは ENTRYPOINT ["tail", "-f"...]
エントリポイント tail -f bb.txt
# 上書き docker run --entrypoint=cat mycentos:08 /data/bb.txt

CMD: 最後の CMD が標準として使用されます。上書き可能で、ENTRYPOINT にパラメータを渡すことができ、ENTRYPOINT と組み合わせて使用​​できます (json 配列の形式でのみ使用できます)

# 最後のCMDのみ実行
コマンド ls $BASEDIR
CMD 猫 bb.txt

# 上書き可能。docker run の後のコマンドは、Dockerfile の CMD の後のコマンドを直接上書きします。docker run mycentos:09 ls /data

# ENTRYPOINT と組み合わせて使用​​して、ENTRYPOINT にパラメータを渡します。パラメータは動的に渡すことができます。たとえば、プロジェクト パスは変更されませんが、プロジェクト名は変更されます。この 2 つを組み合わせて使用​​する場合は、json 配列形式を使用する必要があることに注意してください。
エントリポイント ["ls", "/data"]
コマンド [/data/bb"]

または

docker 実行 mycentos:10 /data/bb/aa

Dockerfile でカスタムイメージを構築する実装についてはこれで終了です。Dockerfile でイメージを構築する方法については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

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

<<:  IE8互換表示(IE7モード)とスタンドアロンIE7の違いの詳細な説明

>>:  CSS は Alibaba ベクター ライブラリを使用して、対応する位置に見栄えの良いアイコン効果をすばやく追加します (サンプル コード)

推薦する

MySQLインデックスに関する詳細を共有する

数日前、同僚からMySQLのインデックスについて質問を受けました。大体わかっているのですが、まだ練習...

ウェブサイトのデザインでは色の階層感覚に注意を払う必要があります

最近、私はデザインには階層感覚が必要だと言っています。この階層感覚には、色の重ね合わせや要素の重ね合...

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

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

Linuxにおけるselinuxの基本設定チュートリアルの詳細な説明

selinux ( Security-Enhanced Linux)は、Linux カーネル モジュ...

画像の盗難を防ぐために Nginx で Referer を設定する方法

サーバーの画像が他のウェブサイトからホットリンクされると、サーバーの帯域幅とアクセス速度に影響します...

MySQLワームレプリケーションの基本知識

ワームは、その名前が示すように、自ら複製し、その数は倍増、つまり指数関数的に増加します。 MySQL...

ボタンに醜い灰色の枠線が付いています。これを削除するにはどうすればよいですか?

ダイアログをクロージャで使用し、右上隅の向こう側に閉じるボタンがあるダイアログを描画しました。ボタン...

Tomcatディレクトリ構造の詳細な説明

目次ディレクトリ構造binディレクトリconfディレクトリlibディレクトリwebapps ディレク...

必見の JavaScript 面接質問 10 選のまとめ (おすすめ)

1.これは1. 誰が誰に電話をかけますか?例: 関数foo(){ console.log(&quo...

MySQLでホワイトリストアクセスを設定する方法

MySQLでホワイトリストアクセスを設定する手順1. ログイン mysql -uroot -pmys...

MySQL Order By 複数フィールドのソートルールのコード例

事前に言っておく気まぐれですが、MySQL の order by sorting にどのようなルール...

XHTML 入門チュートリアル: よく使われる XHTML タグ

<br />記事と同様に、Web ページにも明確な段落と重要度の異なるタイトルが必要です...

MySQL クエリの重複データ (重複データを削除し、ID が最も小さいデータのみを保持します)

開発の背景:最近、私はバッチ データを MySQL データベースにインポートする機能に取り組んでいま...

Linux コマンド クエリ アプレットでの WePY クラウド開発の実践

みなさんこんにちは。今日は Linux コマンド クエリ アプレットでの WePY クラウド開発の実...

MySQL データベース SELECT クエリ式分析

データ管理の大部分は検索であり、SELECT はその大部分を占めています。 SELECT selec...