エレガントDockerfileの書き方

REVIEW

コンテナの最初からKubernetes、と彼らはDockerfile開始から必要なコンテナ、この記事では、エレガントなDockerfileファイルを作成する方法について説明します。

この記事では、主に含まれています:

  • Docker容器
  • Dockerfile
  • 多段ビルドの使用

おかげで私たちは、私たちが練習できるように、このトピックに関するプロジェクトやスタッフのいくつかのサポートのおかげで練習を続けるマシンリソースと時間の多くを提供しています。

A、ドッカーコンテナ

特長1.1コンテナ

我々は、すべてのコンテナは、次のような特徴を持っている標準的なソフトウェアユニットであることを知っています:

  • どこでも実行します。コンテナは、どのような環境での動作は同じであることを確認するために、依存関係をパッケージ化する関連するコードと設定ファイルができます。
  • リソース使用率は:処理容器は、分離ステージを提供し、より細かくCPUとメモリ使用量を設定するので、サーバーのコンピューティングリソースのより良い利用することが可能です。
  • 急速な拡大:容器は、起動を高速化し、効率を停止することができるように、各容器は、別個のプロセスとして実行することができ、オペレーティング・システムの基礎となるシステム・リソースを共有することができます。

1.2 Docker容器

現在、その上、市場の主流のコンテナエンジンでドッカー、ロケット/ RKT、OpenVZの/オーディン、および、およびパーティ容器エンジンを支配する最も使用されるエンジンドッカーコンテナです。

ドッキングウィンドウコンテナは、Linuxコンテナの移植性と一貫性のある、別のミラーが提供するこれらのプロセスを実行するために必要なファイルのすべての生産をテストするための開発からプロセス全体、一連の処理をシステムの他の部分から隔離されていますセックス。チャネルの開発に関して繰り返し、容器の速度がはるかに高速で、かつクラウドプラットフォーム(PaaSの)上に展開主流の様々な、そしてローカルシステムをサポートしている実行している伝統的なテスト環境に依存します。ドッカーコンテナは恥ずかしい「オンライン崩壊の様々なを実行することができ、通常の開発環境」を解決します。

ドッカーコンテナの機能:

  • 軽量:ドッカー容器がもはやこの層の動作GuestOSを必要とするため、仮想マシンにドッカー容器に対しては、それは、より多くのリソースのオーバーヘッドを節約することができないので、仮想マシンは、オペレーティング・システム・レベルのリソースから分離されている間、容器は、リソース分離プロセスレベルでありますシステム。
  • 高速:でもミリ秒の開始を達成することができ、GuestOSを起動せずにコンテナを起動し、作成します。
  • ポータビリティ:ドッカーコンテナアプリケーションとテクノロジーの異なるプラットフォーム上で実行することができますコンテナに画像変換パケットの依存ライブラリおよびランタイム環境です。
  • オートメーション:(のような:Kubernetes)コンテナコンテナ生態振り付けの仕事は、コンテナの自動管理を実現するために私たちを助けることができます。

二、Dockerfile

Dockerfile構成はImageコマンドを呼び出すことができるすべてのユーザーの組み合わせを含むテキスト文書ファイルを、記述するために使用され、ユーザーは、連続ドッカーコマンドの実行を構築するには、自動的に次の行を使用して複数のラインを構築することを意味することができます。

磁気ミラーDockerfile書き込むことにより、操作やメンテナンスがより簡単にミラーサイトを管理することができますが、環境が均一ではなく必要と心配もはや、開発、テストチームの効率を高めるために、実質的に均一な環境を提供するために、テストチームを開発することはできません。

Dockerfile構文は、一般的にのみ11使用される非常に簡単です:

2.1書き込み優雅Dockerfile

エレガントDockerfileメインのノート次のことを書きます:

  • Dockerfileファイルは、画像のうち、最終的な生産の大きいよりレベルが長すぎるすべきではありません。
  • 一時ファイルをインストールし、ログなどの不要なコンテンツを構築画像を、含めないでください。
  • ランタイムベースの画像を使用してみてください、このプロセスは、建物のDockerfileランタイムに配置する必要はありません。

ただ、上記の3つのポイントが良いDockerfileを書くことができるようになります覚えておいてください。

理解を容易にするために、我々は2つのDockerfile例との単純な比較を行いました。

FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install -y apt-utils libjpeg-dev \     
python-pip
RUN pip install --upgrade pip
RUN easy_install -U setuptools
RUN apt-get clean
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y apt-utils \
  libjpeg-dev python-pip \
           && pip install --upgrade pip \
      && easy_install -U setuptools \
    && apt-get clean

私たちは、それはかなり良いようだ、一見明確で、合理的な構造で、最初Dockerfileを見てください。読みやすい、二Dockerfile、コンパクトを見て、あなたが書いた理由は?

  • すでに完成し、実行層が再び実行されませんように、プロセスは、再びビルド後にそれらを修正し、層のミスを実行しているとき:第1の利点はDockerfileということです。これは、大幅にビルド次の時間を短縮することができますが、その問題は、ミラーによって占めマルチレベルのスペースが大きくなるになることによるものです。
  • 修正されたビルド同等物は再びやり直すように、第2 Dockerfileすべてのコンポーネントは、ある程度ので、少ないスペースミラーを行うことを決議一階のすべてのですが、基本イメージの生産におけるこれらのグループのコンパイラエラーの1つが、1つの層に、コンパイル要素の前に、より多くの時間がかかり、また改めて再コンパイルする必要があります。

これは、次の表から2つのDockerfileコンパイルされた画像の大きさの外に見ることができます。

$ docker images | grep ubuntu      
REPOSITORY      TAG     IMAGE ID    CREATED     SIZE                                                                                                                                   
ubuntu                   16.04       9361ce633ff1  1 days ago 422MB
ubuntu                   16.04-1   3f5b979df1a9  1 days ago  412MB

特別な効果かのように、しかしDockerfileが非常に長い場合にのみ127 Dockerfile最高レベルがあるので、ええと、あなたは、レベルを減らすことを検討することができます。

第三に、多段階のビルドを使用します

ドッカードッカーは、私たちがパッケージ化され、ミラーを構築するために、多段階の方法を使用して、画像をよりコンパクトにするために、17.05の後にマルチレベルの建物をサポートするためにアップグレードすることができます。多段ビルドの建設前に、我々は通常Dockerfile以上Dockerfileを使うミラーリングするように見えます。

単一ファイルの3.1建設

マルチステージは増築前に構築するために単一のファイルを使用して、単一のファイルには、すべてのビルドプロセスすべてにDockerfile下含まれる(プロジェクトの依存関係、コンパイル、テスト、パッケージ工程を含む)です。

FROM golang:1.11.4-alpine3.8 AS build-env
ENV GO111MODULE=off
ENV GO15VENDOREXPERIMENT=1
ENV BUILDPATH=github.com/lattecake/hello
RUN mkdir -p /go/src/${BUILDPATH}
COPY ./ /go/src/${BUILDPATH}
RUN cd /go/src/${BUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install –v

CMD [/go/bin/hello]

このアプローチは、いくつかの問題をもたらすでしょう。

  • ファイルは特に長くなりDockerfileより多くの物事は時間を必要とするよう、保守性が指数関数的に減少します。
  • ミラーリング、ミラーボリュームの過剰レベルは徐々に展開はますますゆっくりになり、増加します。
  • コード漏洩リスクがあります。

Golangの例には、それだけで、実際のランタイムでこのコンパイル環境は、タスクの役割ではない、ビルド環境を持って、任意の実行環境に依存しない、コンパイルが完了し、ソースコードコンパイラは、それのない任務を使用していないこと鏡画像に滞在する必要はありません。

あなたが見ることができるテーブルの上に、最終ビルド単一ファイルには、スペースの312メガバイトを占めます。

以上の3.2ビルドファイル

多段が出てビルドする前に、良い解決策はありませんか?そこ複数ファイルのビルドには、例えば、あるか、ビルドサーバー上のコンパイラをインストールしますが、この方法では、ビルドサーバーコンパイラのインストールは非常に肥大化したビルドサーバーにつながるので、我々が推奨されていないビルドサーバー上のコンパイラをインストールすることで、アダプターは、各言語、依存性、エラーが発生しやすく、高いメンテナンスコストの複数のバージョンを必要としていました。だから我々は唯一のマルチファイルを構築する方法について説明します。

マルチファイルの建設、複数Dockerfileの実際には、使用、それらを組み合わせることで、スクリプト。3つの文書があると仮定します:Dockerfile.run、Dockerfile.build、build.sh。

  • いくつかのDockerfileコンポーネントDockerfile.runが必要なプログラムを実行する必要があり、それが最も合理化されたライブラリが含まれています。
  • Dockerfile.buildしか役に立たない、完全なを構築するために、構築するために使用されます。
  • build.sh機能はDockerfile.runとDockerfile.buildにディスパッチャ役割と考え、良いものを構築し、その後Dockerfile.runを行うDockerfile.buildで構成されています。

Dockerfile.build

FROM golang:1.11.4-alpine3.8 AS build-env
ENV GO111MODULE=off
ENV GO15VENDOREXPERIMENT=1
ENV BUILDPATH=github.com/lattecake/hello
RUN mkdir -p /go/src/${BUILDPATH}
COPY ./ /go/src/${BUILDPATH}
RUN cd /go/src/${BUILDPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install –v

Dockerfile.run

FROM alpine:latest
RUN apk –no-cache add ca-certificates
WORKDIR /root
ADD hello .
CMD ["./hello"]

Build.sh

#!/bin/sh
docker build -t –rm hello:build . -f Dockerfile.build
docker create –name extract hello:build
docker cp extract:/go/bin/hello ./hello
docker rm -f extract
docker build –no-cache -t –rm hello:run . -f Dockerfile.run
rm -rf ./hello

プロジェクトを完了するために実行build.shの構築。

あなたは、複数のファイルが大幅にミラーの設置面積を減少させ、それは3つの文書を管理する必要があり、メンテナンスコストも高くなって構築するために、表から見ることができます。

以上の3.3ビルド順序

最後に、我々は待望のマルチレベルの建物を見てください。

我々は唯一のDockerfileにFORM声明を数回使用する必要があり、多段階のビルドを完了し、命令FROMそれぞれが異なる基本イメージを使用することができ、そして新たな始まりを構築するコマンドFROMそれぞれ、我々は別の建物のフェーズの結果をコピーすることもできますあなたは簡単に上記の問題を解決し、そして唯一のDockerfileファイルを作成する必要がありますすることができますので、左の最終画像でのステージは、最後のビルドになります。それは注目に値する:17.05以上にバージョンドッカーを確認する必要があります。私たち以下は、その具体的な操作。

「ビルド-ENV」の別名をステージングするDockerfileのように使用することができます。

FROM golang:1.11.2-alpine3.8 AS build-env

そして、ステージミラーからファイルをコピー、ミラーはまたのいずれかにファイルをコピーすることができます。

COPY –from=build-env /go/bin/hello /usr/bin/hello 

簡単な例を見てください:

FROM golang:1.11.4-alpine3.8 AS build-env
 
ENV GO111MODULE=off
ENV GO15VENDOREXPERIMENT=1
ENV GITPATH=github.com/lattecake/hello
RUN mkdir -p /go/src/${GITPATH}
COPY ./ /go/src/${GITPATH}
RUN cd /go/src/${GITPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -v
 
FROM alpine:latest
ENV apk –no-cache add ca-certificates
COPY --from=build-env /go/bin/hello /root/hello
WORKDIR /root
CMD ["/root/hello"]

ドッカーは、実行ドッキングウィンドウの画像の後に-t -rm hello3実行を構築し、その後、私たちは鏡の大きさを見てみましょう。

マルチレベルの建物は私たちに利便性の多くをもたらした、最大の利点は、メンテナンスの負担Dockerfileを軽減するために十分に小さいランタイムイメージの場合にはそれを確保することであるので、我々は強くドッカーイメージにパッケージ化するためにあなたのコードをビルドする多段階の使用をお勧めします。

著者:コング

コンテンツソース:テクノロジーのCreditEase研究所

おすすめ

転載: yq.aliyun.com/articles/709431