Dockerfile を作成するときは、次のベスト プラクティスを考慮してください。
-
イメージ サイズを最小化する: 軽量のベース イメージを使用し、ビルド プロセス中に不要なレイヤーを最小限に抑えるようにしてください。
-
キャッシュを賢く使用する: Docker はキャッシュされたレイヤーを再利用しようとするため、1 つのステップが変更されると、後続のステップでキャッシュが失われます。したがって、キャッシュを最大限に活用するには、頻繁に変更するステップを最後に配置します。
-
不要なファイルを削除する: イメージを構築するときに、不要なファイルとキャッシュを削除してイメージのサイズを削減します。
-
セキュリティ: イメージ内のソフトウェア パッケージと構成が安全であり、適時に更新されていることを確認します。
-
ドキュメント: Dockerfile にコメントとドキュメントを追加して、他の人がビルド プロセスを理解できるようにします。
Dockerfile を作成するときは、各コマンドの動作を理解することが重要です。関連する Dockerfile コマンドとその説明は次のとおりです。
-
FROM :
FROM
このコマンドはベース イメージ、つまりコンテナーを構築するイメージを指定します。これは Dockerfile の最初のコマンドであり、他の命令の前に指定する必要があります。例:FROM ubuntu:20.04
Ubuntu 20.04 イメージに基づいて構築されていることを意味します。 -
WORKDIR :
WORKDIR
このコマンドは、コンテナ内でコマンドを実行するときのデフォルトのディレクトリである作業ディレクトリを設定するために使用されます。たとえば、WORKDIR /app
作業ディレクトリを に設定します/app
。 -
RUN :
RUN
コマンドはコンテナ内でコマンドを実行するために使用されます。ソフトウェア パッケージのインストール、環境の構成、その他の操作に使用できます。例: を実行してRUN apt-get update && apt-get install -y nginx
コンテナ内でNginx をインストールします。apt-get update
apt-get install
-
COPYおよびADD :
COPY
およびADD
コマンドは、ホストからコンテナー内にファイルをコピーするために使用されます。例:COPY app.py /app/
ホスト上のapp.py
ファイルを/app/
コンテナ内のディレクトリにコピーします。 -
EXPOSE :
EXPOSE
このコマンドは、コンテナー内のリスニング ポートを宣言するために使用されます。これはポートをホストに自動的にマッピングしませんが、他の人がコンテナ内のポート構成を理解するのに役立ちます。例:EXPOSE 80
コンテナがポート 80 でリッスンすることを宣言します。 -
CMD :
CMD
コマンドは、コンテナーの起動時に実行されるコマンドを定義するために使用されます。通常、コンテナのデフォルトのコマンドを定義するために使用されます。例:スクリプトCMD ["python", "app.py"]
を実行するデフォルトの起動コマンドを定義します。app.py
-
ENTRYPOINT :
CMD
ENTRYPOINT と同様に、ENTRYPOINT
command はコンテナーの起動時に実行されるコマンドを定義するために使用されます。違いは、CMD
のパラメータはオーバーライドできるのに対し、ENTRYPOINT
のパラメータはオーバーライドできないことです。通常、コンテナのエントリ ポイントを定義するために使用されます。
例えば:ENTRYPOINT ["python", "app.py"]
-
ENV :
ENV
環境変数を設定するコマンドです。これらの環境変数はコンテナ内で使用できます。例:という名前の環境変数ENV MY_ENV_VAR=value
を設定しますMY_ENV_VAR
。 -
USER :
USER
このコマンドは、コンテナ内でコマンドを実行するときに使用するユーザー名または UID を指定するために使用されます。これを使用すると、コンテナのセキュリティを向上させ、root 権限でアプリケーションを実行することを回避できます。
例えば:USER appuser
-
VOLUME :
VOLUME
コマンドは、コンテナ間で共有できるボリュームを作成するために使用されます。通常、データを永続化するか、ホストとファイルを共有するために使用されます。
例えば:VOLUME /data
-
ARG :
ARG
このコマンドは、ビルド プロセス中に Dockerfile に渡すことができるビルド時パラメーターを定義するために使用されます。これにより、ビルド時にいくつかの値を動的に設定できます。
例えば:ARG APP_VERSION=latest
上記の一般的な Dockerfile コマンドに加えて、Docker イメージの構築プロセスをさらにカスタマイズおよび最適化するために使用できるコマンドとテクニックがいくつかあります。
-
LABEL :
LABEL
このコマンドは、イメージにメタデータ ラベルを追加するために使用され、通常はイメージの説明情報、管理者情報などを提供するために使用されます。これらのタグはdocker inspect
コマンドを使用して表示できます。
例えば:LABEL maintainer="[email protected]"
-
HEALTHCHECK :
HEALTHCHECK
コマンドは、コンテナーのヘルスチェックを定義するために使用されます。このコマンドを使用すると、Docker がコンテナーの健全性を監視し、コンテナーが異常な場合にアクションを実行できるようになります。
例えば:HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1
具体解释如下:
-
--interval=5m
: ヘルスチェックの間隔を設定します。この例では、コンテナーは 5 分ごとにヘルスチェックを実行します。設定されていない場合--interval
、デフォルトで 30 秒ごとにチェックが実行されます。 -
--timeout=3s
: この部分では、各ヘルスチェックのタイムアウトを設定します。ヘルス チェック コマンドが 3 秒以内に結果を返さない場合、ヘルス チェックは失敗したとみなされます。 -
CMD curl -f http://localhost/ || exit 1
: この部分は実際のヘルスチェックコマンドです。curl
コマンドを使用してアクセスを試行しhttp://localhost/
、フラグを使用し-f
て、HTTP リクエストが成功 (ステータス コード 2xx) を返した場合にのみcurl
コマンドが成功を返すようにします。アクセスが失敗した場合 (たとえば、コンテナー内のアプリケーションが応答しない場合)、コマンドはcurl
失敗し、コンテナーのヘルスチェックも失敗します。この場合、コンテナーのステータスは異常としてマークされます。
-
-
マルチステージ ビルド: マルチステージ ビルドを使用すると、イメージ サイズを大幅に削減できます。Dockerfile で複数のビルド フェーズを定義し、あるフェーズから別のフェーズにビルド結果をコピーできます。
例えば:# 第一阶段:构建应用程序 FROM golang:1.16 AS builder WORKDIR /app COPY . . RUN go build -o myapp # 第二阶段:构建最终镜像 FROM debian:bullseye-slim COPY --from=builder /app/myapp /usr/local/bin/myapp CMD ["myapp"]
これらのコマンドとテクニックを使用すると、Docker イメージをより柔軟に構築し、特定のニーズに応じてカスタマイズおよび最適化することができます。実際のアプリケーションでは、プロジェクトの複雑さと要件に基づいて、適切な Dockerfile コマンドと戦略の使用を選択できます。