【Dockerシリーズ】Dockerfile紹介

Dockerfileの予備的な理解をすばやく得るために、最初に簡単な例を見てみましょう。

まず、ミラーウェアハウスからmysql:5.7イメージをプルし、コンテナーを起動してコンテナーに入りますが、特定のIPをpingする場合、pingコマンドがないことがわかります。
ここに画像の説明を挿入します

もし私たちがこの必要性を持っているとしたら、それは非常に恥ずかしいことですが、それを解決するために何ができるでしょうか?
mysql:5.7に基づいて新しいイメージを再構築し、必要なものを追加できます。次のDockerfileの内容を見てみましょう。

FROM mysql:5.7

RUN apt-get update \
&& apt install iputils-ping -y

RUN apt-get install vim -y

ここでは、pingツールとvimツールをインストールしました(cat / etc / issueからリリース情報を表示する必要があり、インストールツールのコマンドはバージョンごとに異なることに注意してください)

このDockerfileでビルドを始めましょうdocker build -t mysql:mumu .
ここに画像の説明を挿入します

ビルドプロセスが3つのステップに分割されていることがわかります。これは、Dockerfileの3つのコマンドに対応しています。
ビルドが完了すると、mysql:5.7より53MB大きいことがわかります。
ここに画像の説明を挿入します

画像が再生され
docker run -p 3306:3306 --name mysql -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:mumu
たら、コンテナを起動できます。起動後、www.baidu.comにpingを実行すると、ツールが通常どおり使用可能であることがわかります。
ここに画像の説明を挿入します

上記のケースを通じて、
Dockerfileの予備的な理解があります Dockerfileはミラーの構築に使用されるDockerfileです
。1つの命令はステップに対応します
。Dockerfileと基本ミラーを介して、より整合性のあるミラーを構築できます。私たちの要件。

別のDockerfileを使用して、画像の階層化の概念を理解します。

FROM debian
RUN apt-get update && apt-get -y -f install emacs
RUN apt-get update && apt-get -y -f install apache2

Dockerfileの各命令は、レイヤーごとに新しいレイヤーであり、最終的に必要なイメージを構成します
ここに画像の説明を挿入します

たとえば、上記のコマンドは3つのレイヤーを作成し、各レイヤーはこのレイヤーで行われた変更のみを記録し、これらは読み取り専用です。コンテナーが開始されると、Dockerは上部に読み取り/書き込みレイヤーを追加します。これは一般にコンテナーレイヤーと呼ばれます。
ここに画像の説明を挿入します

各コンテナには独自の独立したコンテナレイヤーがあるため、変更には独自のコンテナレイヤーのみが含まれ、コンテナ間の影響はありません。このようにして、異なるコンテナがミラーリングレイヤーを共有できます。
ここに画像の説明を挿入します

なぜ階層構造を使用するのですか?
最大の利点は、リソースを共有することです。たとえば、多くのミラーはベースミラーから構築されます。コピーをディスクに保存すると、すべてのミラーで共有できます。

しかし、たとえば、質問がある人もいます。たとえば、この画像派生コンテナがその中のファイルを変更した場合、たとえば/ optの下のファイルが変更された場合、他のコンテナの/ optも変更されますか?
コンテナレイヤーは各コンテナから独立していることを前述しました。変更されたデータはコンテナレイヤーに直接保存され、イメージレイヤーは変更されません。

Dockerfile命令の紹介

FROM:ベースイメージを指定します。最初のコマンドである必要があります
FROM:
FROM @
例:
FROM elasticsearch:7.6.0
注:タグとダイジェストはオプションです。空の場合、ベースイメージの最新バージョンが自動的に使用されます。

MAINTAINER:メンテナ情報
MAINTAINERの
例:
MAINTAINER MUMU
MAINTAINER [email protected]
MAINTAINER [email protected]

RUN:イメージのビルド時に実行されるコマンド
RUN
RUN ["executable"、 "param1"、 "param2"]
例:
RUN apk update
RUN ["./test"、 "dev"、 "offline"]
注:作成者RUN命令中間イメージはキャッシュされ、次のビルドで使用されます。これらのキャッシュイメージを使用したくない場合は、ビルドをビルドするときに–no-cacheパラメーターを使用できます。例:docker build --no-cache

追加:ローカルファイルをコンテナに追加します。tarファイルは自動的に解凍されます(ネットワーク圧縮リソースは解凍されません)。wgetと同様にネットワークリソースにアクセスできます。
追加
例:
ADD mumu.txt / mydir /
注:コピー:類似関数ADDですが、ファイルを自動的に解凍したり、ネットワークリソースにアクセスしたりすることはできません。

CMD:コンテナーが構築された後に呼び出されます。つまり、コンテナーが開始されたときに呼び出されます。
CMD ["executable"、 "param1"、 "param2"]
CMD ["param1"、 "param2"]
CMDコマンドparam1param2(シェル内部コマンド)
例:
CMD ["java"、 "-jar"、 "/ opt / server / product.jar "]
注:CMDはRUNとは異なります。CMDはコンテナーの起動時に実行されるコマンドを指定するために使用され、RUNはイメージのビルド時に実行されるコマンドを指定するために使用されます。各Dockerfile CMDコマンドは1つしか持てません複数指定した場合は最後の1つだけが実行されますコンテナ起動時に実行コマンドを指定した場合、CMDで指定したコマンドは上書きされます。

ENTRYPOINT:コンテナーを構成して実行可能にします。CMDを使用すると、アプリケーションを省略でき、パラメーターのみが使用されます。
ENTRYPOINT ["executable"、 "param1"、 "param2"]
ENTRYPOINTコマンドparam1param2(シェル内部コマンド)
例:
ENTRYPOINT ["/ bin / echo"、 "hello"]
注:ENTRYPOINTはCMDと非常に似ていますが、docker run実行コマンドはENTRYPOINTを上書きしませんが、docker runが-entrypointオプションを使用する場合、このオプションのパラメーターを実行するプログラムとして使用して、ENTYPPOINT命令で指定されたプログラム、およびdockerrunで指定されたパラメーターをオーバーライドできます。コマンドはパラメーターとして扱われます。これをENTRYPOINTに再度渡します。DockerFileでは1つのENTRYPOINTコマンドのみが許可され、複数指定されている場合は、前のコマンドが上書きされ、最後のコマンドのみが実行されます。
ENTRYPOINTを指定すると、CMDの意味が変わります。直接実行コマンドではなくなりますが、CMDの内容はパラメータとしてENTRYPOINT命令に渡されます。つまり、実際に実行すると「」になります。

ここで少し混乱していませんか?CMDとENTRYPOINTの関係は何ですか?
Dockerfileでは、少なくとも1つのCMDとENTRYPOINTを指定する必要があります。Dockerを
実行可能プログラムとして使用する場合は、構成にENTRYPOINTを使用する必要が
あります。CMDはENTRYPOINTのデフォルトパラメーターとして、またはDockerのデフォルトコマンドとして使用できます。CMD

dockerrunによって渡されるパラメーターカバレッジ; docker runによって渡されるパラメーターは、exec形式が使用されている場合、ENTRYPOINTに追加されます。

たとえば、Dockerfileは次のとおりです
FROM nginx
ENTRYPOINT ["nginx"、 "-c"]
CMD ["/etc/nginx/nginx.conf"]
nginxを有効にすると:docker run nginx:mumuは
次の実行同等ですコマンド:nginx -c /etc/nginx/nginx.conf
起動コマンドを次のように変更すると:docker run nginx:mumu -c /etc/nginx/new.confは
、次のコマンドを実行するの同じです:nginx -c / etc / nginx/new。conf

LABEL:ミラーイメージにメタデータを追加するために使用されます
LABEL == =
例:
LABEL version =“ 1.0” descriptioin =“これはMumuのサービスです”
注:LABELを使用してメタデータを指定する場合、LABELはメタデータ、スペースで区切られます。中間画像が多すぎないように、LABELコマンドですべてのメタデータを指定することをお勧めします。

ENV:環境変数の設定
ENVは一度に1つの変数しか設定できず、キーの後の内容は値と見なされます
ENV =…複数の変数を設定できます。各変数は「=」キーと値のペアです(含まれている場合)スペース特殊文字。\を使用してエスケープできます。
例:
ENVユーザー名
adminENVパスワード123456ENV
ポート= 3306

EXPOSE:外部インタラクション用のポートを指定します
EXPOSE […]
例:
EXPOSE 80 443
EXPOSE 11221 / tcp 11221 / udp
注:EXPOSEコマンドは、指定しない場合、コンテナーが開く必要のあるポートが実際には開かれていないことを宣言するだけです。 -pなしでマップされるポート。コンテナはポートをマップしません。アクセス可能にするには、dockerrunのときに-pを使用してこれらのポートを指定する必要があります。

VOLUME:永続ディレクトリを指定するために使用されます
VOLUME ["/ path / to / dir"]
例:
VOLUME ["/ect/nginx/con.d"]
VOLUME ["/ etc / nginx / con.d"、 "/ etc / nginx / logs”]
注:コンテナーの実行中は、コンテナーのストレージレイヤーが書き込まれないようにしてください。ユーザーが実行時に動的ファイルがボリュームとして保存されているディレクトリをマウントするのを忘れないようにするには、事前にDokcerfileで特定のディレクトリを指定できます。マウントは匿名ボリュームであるため、ユーザーがマウントを指定しなくても、コンテナストレージレイヤーに大量のデータを書き込むことはありません。対応するものを指定することはできません。ホスト上のディレクトリであり、自動的に生成されます。
注:ボリュームは他のコンテナーと共有でき、そのライフサイクルはコンテナーに依存しません。コンテナーが削除された後、Dockerはデータボリュームを自動的に削除しません。また、によって参照されるデータボリュームを処理するガベージコレクションメカニズムはありません。コンテナ(必要に応じて)コンテナを削除するときにデータボリュームを削除します。コンテナーを削除するときは、docker rm-vコマンドを使用できます。
マウントするものに焦点を当てます。

WORKDIR: cdコマンドと同様の作業ディレクトリ
WORKDIR / path / to / dir
例:
WORKDIR / etc(作業ディレクトリはetc)
WORKDIR nginx(作業ディレクトリは/ etc / nginxになります)
注:WORKDIRを介してディレクトリを設定した後、戻るDockerfile内コマンドは指定されたディレクトリで実行されます。コンテナを実行するときに、-wを渡してDockerfileの作業ディレクトリを上書きできます。

USER:コンテナーの実行時にユーザー名またはUIDを指定すると、後続の一連のコマンドでこのユーザーが使用されます。
USER user
USER uid
USER uid:gid
USER user:gid
USER uid:group
USEr user:group
例:
USER mumu
注:USERを使用してユーザーを指定した後、Dockerfileに続くコマンドはこのユーザーを使用しますが、コンテナーを実行する場合、uパラメータを渡して、指定したユーザーを上書きできます。

ARG: EVN
ARG [= <default value]と同様に、ビルドランタイムに渡される変数を指定するために使用されます
例:
ARGサイト
ARG user = mumu
注:ARGがデフォルト値を指定し、ビルド中に値が渡されない場合、Justデフォルト値を使用します。

ONBUILD:ミラーリングトリガーを設定するために使用されます
ONBUILD [INSTRUCTION]
例:
ONBUILDADD。/Etc/ nginx
ONBUILD RUN
注:パラメーターは、現在のミラーに実質的な影響を与えない任意のDockerfile命令にすることができます(現在のミラーを変更します。 A)ただし、ミラーBがミラーAに基づいている場合、その命令はミラーBの構築中に実行されますが、CがBに基づいている場合、命令は実行されません(継承できないことが理解できます)。世代から世代へ、ハハ)。

別のケースでレビューしてみましょう:
nginx:latestバージョンのDokcerfileを見てみましょう。コメント部分が削除されています

FROM debian:buster-slim

LABEL maintainer="NGINX Docker Maintainers <[email protected]>"

ENV NGINX_VERSION   1.19.6

ENV NJS_VERSION     0.5.0

ENV PKG_RELEASE     1~buster

RUN set -x \

COPY docker-entrypoint.sh /

COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d

COPY 20-envsubst-on-templates.sh /docker-entrypoint.d

ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 80

STOPSIGNAL SIGQUIT

CMD ["nginx", "-g", "daemon off;"]

ベースイメージを参照してください:debian:buster-slimそして
ソースデータ追加します:maintainer = "NGINX Docker Maintainers [email protected]"
は3つの環境変数を導入します:NGINX_VERSION 1.19.6 NJS_VERSION 0.5.0
PKG_RELEASE 1〜buster
はコマンドを実行しますset -x、これはコマンドを画面に出力するためのシェル内のコマンドです。
3つのファイルを指定された場所にコピーします
。ENTRYPOINTとCMDの組み合わせは次のとおりです。/docker-entrypoin.shnginx-gデーモンオフ
ポート80を指定します
。STOPSIGNAL:これはdocker1.9の後に導入され、この命令は起動されたシステムに送信されます。コンテナによってシステムを終了する前に何をすべきかなどのシグナルを呼び出します。

おすすめ

転載: blog.csdn.net/qq_41979344/article/details/113405668