Dockerfileを作成するためのベストプラクティス

1.ミラー層を減らします

1つのRUNコマンドで新しいレイヤーが形成されます。ミラーリングレイヤーを減らすために、1行にシェルコマンドを記述してみてください。
例えば:

FROM centos:7
MAINTAINER www.aliangedu.com
RUN yum install epel-release -y 
RUN yum install -y gcc gcc-c++ make -y
RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz
RUN tar zxf php-5.6.36.tar.gz
RUN cd php-5.6.36
RUN ./configure --prefix=/usr/local/php 
RUN make -j 4 
RUN make install
EXPOSE 9000
CMD ["php-fpm"]

次のように書く必要があります:

FROM centos:7
MAINTAINER www.aliangedu.com
RUN yum install epel-release -y && \
    yum install -y gcc gcc-c++ make

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
    tar zxf php-5.6.36.tar.gz && \
    cd php-5.6.36 && \
    ./configure --prefix=/usr/local/php \
    make -j 4 && make install
EXPOSE 9000
CMD ["php-fpm"]

結果:12階-> 6階

2.画像​​サイズの最適化:不要なデータをクリーンアップします

1つのRUNが新しいレイヤーを形成します。同じレイヤーで削除されない場合、ファイルが最後に削除されたかどうかに関係なく、次のレイヤーに移動します。したがって、対応する残りのデータを各レイヤーでクリーンアップして、画像サイズ。

FROM centos:7
MAINTAINER www.aliangedu.com
RUN yum install epel-release -y && \
    yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
    libcurl-devel libjpeg-devel libpng-devel openssl-devel \
    libmcrypt-devel libxslt-devel libtidy-devel autoconf \
    iproute net-tools telnet wget curl && \
    yum clean all && \
    rm -rf /var/cache/yum/*

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
    tar zxf php-5.6.36.tar.gz && \
    cd php-5.6.36 && \
    ./configure --prefix=/usr/local/php \
    make -j 4 && make install && \
    cd / && rm -rf php*

少なくとも数十M、さらには数百Mを節約できます。

3.ネットワーク伝送時間を短縮します

上記の公式のPHPダウンロードアドレスと同様に、ソフトウェアパッケージを内部に保存する場所を用意することをお勧めしますhttp//docs.php.net/distributions/php-5.6.36.tar.gz、mavenを使用してこれを構築するネットワークの送信時間を短縮し、イメージ構築の速度を上げるために、操作もプライベートMavenウェアハウスに変更されます。

4.多段階画像構築

  • 上記のアプローチに従ってプロジェクトを実行する場合は、コードをベースイメージに直接コピーします。コードの事前コンパイルが必要なプロジェクトの場合はどうなりますか?たとえば、JAVA言語では、コードをコンパイルしてデプロイし、コードを完成させる方法を説明します。

  • 上記の方法では、プロジェクトのランタイム環境と依存ライブラリを含む基本的なイメージをDockerfileに事前に構築してから、Dockerfileを記述して、プロジェクトをランタイム環境にコピーする必要があります。これは少し複雑です。

    JAVAのような言語の場合、コードをDockerfileでコンパイルする場合、ソースコードを組み込む必要がありますが、実際の操作ではビルドされたパッケージのみが必要です。この種のソースコードを挿入すると、特定のセキュリティリスクが発生します。また、ミラーイメージボリュームを追加します。
    上記の問題を解決するために、Docker 17.05はマルチステージビルド(マルチステージビルド)のサポートを開始しました。これにより、Dockerfileを簡素化し、イメージサイズを縮小できます。

たとえば、JAVAプロジェクトミラーを構築
するには:デモとしてgithubでJAVAブログプロジェクトを見つけました。

# git clone https://github.com/b3log/solo.git
# cd solo
# vi Dockerfile
FROM maven AS build
ADD ./pom.xml pom.xml
ADD ./src src/
RUN mvn clean package

FROM tomcat-85
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY --from=build target/*.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh", "run"]
# docker container run -d -v /usr/local/jdk1.8:/usr/local/jdk solo:v1

まず、最初のFROMの後にASキーワードがあり、このステージに名前を付けることができます。
次に、FROMの2番目の部分は上記で作成したTomcatイメージを使用し、COPYキーワードは-fromパラメーターを追加します。これは、特定のステージから現在のステージにファイルをコピーするために使用されます。このようなDockerfileはすべて完了しています。

概要:小さなイメージには、迅速な展開や迅速なロールバックなど、多くの利点があります。サービスの中断時間が短縮され、ミラーウェアハウスが使用するディスク容量が少なくなります。

おすすめ

転載: blog.51cto.com/15127501/2657002