Meilleures pratiques pour l'écriture de Dockerfile

1. Réduisez la couche miroir

Une commande RUN forme une nouvelle couche, essayez d'écrire les commandes Shell sur une ligne pour réduire la couche de mise en miroir.
Par exemple:

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"]

Doit être écrit comme suit:

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"]

Résultat: 12ème étage -> 6ème étage

2. Optimiser la taille de l'image: nettoyer les données inutiles

Un RUN forme un nouveau calque. S'il n'est pas supprimé sur le même calque, que le fichier soit supprimé en dernier ou non, il sera transféré au calque suivant. Par conséquent, les données résiduelles correspondantes doivent être nettoyées à chaque calque pour réduire la taille de l'image.

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*

Au moins des dizaines de M peuvent être sauvés, voire des centaines de M.

3. Réduisez le temps de transmission du réseau

Il est préférable d’avoir un emplacement pour stocker le progiciel à l’intérieur, similaire à l’adresse officielle de téléchargement PHP mentionnée ci-dessus: http://docs.php.net/distributions/php-5.6.36.tar.gz, si vous utilisez maven pour construire ceci L'opération est également transformée en un entrepôt privé de maven pour réduire le temps de transmission du réseau et augmenter la vitesse de construction d'image .

4. Construction d'image en plusieurs étapes

  • Si vous exécutez un projet, conformément à notre approche ci-dessus, copiez le code directement dans l'image de base. Que faire s'il s'agit d'un projet qui nécessite une compilation de pré-code? Par exemple, en langage JAVA, comment compiler et déployer le code ensemble pour le compléter!

  • La méthode ci-dessus doit créer une image de base dans un Dockerfile à l'avance, y compris l'environnement d'exécution du projet et les bibliothèques dépendantes, puis écrire un Dockerfile pour copier le projet dans l'environnement d'exécution, ce qui est un peu plus compliqué.

    Pour les langages comme JAVA, si le code est compilé dans un Dockerfile, le code source doit être intégré, mais seul le package construit est nécessaire pendant le fonctionnement réel. Ce type de code source présente un certain risque de sécurité, et il ajoute également un volume d'image miroir.
    Afin de résoudre les problèmes ci-dessus, Docker 17.05 a commencé à prendre en charge les versions en plusieurs étapes (versions en plusieurs étapes), ce qui peut simplifier le Dockerfile et réduire la taille de l'image.

Par exemple, pour créer un miroir de projet JAVA:
j'ai trouvé un projet de blog JAVA sur github en guise de démonstration:

# 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

Tout d'abord, il y a un mot-clé AS après le premier FROM, qui peut donner un nom à cette étape.
Ensuite, la deuxième partie de FROM utilise l'image Tomcat que nous avons créée ci-dessus, et le mot clé COPY ajoute le paramètre -from, qui est utilisé pour copier des fichiers d'une certaine étape vers l'étape actuelle. Un tel Dockerfile est terminé.

Résumé: les petites images présentent de nombreux avantages, tels qu'un déploiement rapide et une restauration rapide. Le temps d'interruption de service est réduit et l'entrepôt miroir occupe moins d'espace disque.

Je suppose que tu aimes

Origine blog.51cto.com/15127501/2657002
conseillé
Classement