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

推薦する

CSS における z-index: 0 と z-index: auto の違い

最近、スタック コンテキストについて学習しています。学習の過程で、z-index が 0 の場合と ...

HTML+CSS3+JSで実装されたドロップダウンメニュー

成果を達成する html <div class="コンテナ"> &l...

中国語でのNginx設定パラメータの詳細な説明(負荷分散とリバースプロキシ)

PS: 最近、nginx を詳細に紹介している <<High-Performance ...

MySQL がデュアルマスターで構成されている場合にデータループの競合を回避する方法

あなたはこの質問について考えたことがあるでしょうか?デュアルアクティブが構成されている場合、データル...

Nginxドメイン名転送のhttpsアクセスの実装

事前に一言:突然、複数のドメイン名のアクセスを https に転送するというタスクを受け取りました。...

JSでES6クラスの使い方をすぐにマスター

1. どのように構築しますか? es5 でクラスを構築する一般的な方法を確認しましょう。まず、es5...

Vue+flaskで動画合成機能を実現(ドラッグ&ドロップアップロード)

目次ドラッグアンドドロップアップロードについては以前の記事で書きました。ファイルをアップロードするF...

左右の幅を固定し、中央の幅を適応させたHTMLレイアウトのソリューションの詳細な説明

この記事では、次のように、誰にでも共有できる左右幅固定のミドルアダプティブ HTML レイアウトソリ...

CSSを使用して、頻繁に表示される奇妙なボタンを簡単に実装します。

背景グループでは、CSS を使用してインセット コーナー ボタンを実装する方法や、矢印付きのボタンを...

Dockerデータ管理とネットワーク通信の使用

Docker をインストールし、Docker コアとインストールを通じて簡単な操作を実行できます。 ...

Vueはソースコード付きのリファレンスライブラリのメソッドを使用します

monaco-editor-vueの公式ソースコードは次のとおりです。インデックス 'mon...

MySQLの高可用性アーキテクチャの詳細な説明

目次導入MySQL 高可用性マスター 1 つとバックアップ 1 つ: MySQL マスター スレーブ...

Nginx のインストールと設定ルールの詳細な紹介

目次1. nginxのインストールと操作(Mac OS環境) 2. nginxルールの設定3. コマ...

mysql5.7 のエンコーディングを utf8mb4 に設定する方法

最近、問題に遭遇しました。モバイル端末の絵文字や一部の絵文字は 4 バイトですが、UTF-8 は 3...

Docker で Python スクリプトを実行する方法

まず、Docker イメージ用の特定のプロジェクト ディレクトリを作成します。例: mkdir /h...