BLOGS

Docker : optimisation de la taille des images

L’optimisation des containers et couches nécessaires aux containers peut faire gagner du disque et de la performance

Pour illustrer la démarche ci-dessous,j’ai pris pour exemple une images pour un server LAMP.

La version non optimisé du Dockerfile :

    FROM fedora:21
    MAINTAINER "Christophe Brun" <christophe.brun.cl194@gadz.org>

    RUN yum -y update 
    RUN yum -y install httpd supervisor php php-imap php-mcrypt php-gd php-pear-Net-Curl php-mysqlnd php-pear 
    RUN yum clean all

    ADD start.sh /start.sh
    RUN chmod -v +x /start.sh 
    RUN echo "Apache" >> /var/www/html/index.html

    EXPOSE 80
    ADD supervisord.conf /etc/supervisord.conf

    CMD ["/start.sh"]

On obtient une image de 750 Mo environ. Pour avoir le détail, on appel la commande history de docker ce qui donne :

    [cbrun@cbrun ]$ docker history chbrun/httpd
    IMAGE          CREATED             CREATED BY                        SIZE
    8f1fbd8c84a8   7 days ago   /bin/sh -c #(nop) CMD [/start.sh]         0 B
    e44fb1418d5d   7 days ago   /bin/sh -c chmod -v +x /start.sh         62 B
    8dd1e15e8253   7 days ago   /bin/sh -c #(nop) ADD file:c5f9cfa...    62 B
    96f6180b14c9   7 days ago   /bin/sh -c #(nop) ADD file:90677b7...    87 B
    5f27af7596ec   7 days ago   /bin/sh -c #(nop) EXPOSE map[80/tc...     0 B
    701479e0f2fb   7 days ago   /bin/sh -c echo "Apache" >> /var/w...     7 B
    f1669d567907   7 days ago   /bin/sh -c yum clean all                1.7 MB
    412b154452e6   7 days ago   /bin/sh -c yum -y install php php-...  60.0 MB
    0aca6c485149   7 days ago   /bin/sh -c yum -y install httpd ...    24.7 MB
    4622e0cdcf27   7 days ago   /bin/sh -c yum -y update              402.3 MB
    d66072620a80   7 days ago   /bin/sh -c #(nop) MAINTAINER "Chri...     0 B
    834629358fe2   3 weeks ago  /bin/sh -c #(nop) ADD file:1314084... 250.2 MB
    00a0c78eeb6d  10 weeks ago  /bin/sh -c #(nop) MAINTAINER Lokes...     0 B
    511136ea3c5a  19 months ago                                           0 B

Pour avoir une version optimisée, il suffit de mettre les commandes RUN sur une ligne pour limiter le nombre de layers. En effet, à chaque RUN docker va générer un nouveau layer pour stocker le delta avec le layer précédent. Du coup, plus on a de lignes avec un RUN, plus on va avoir de couches et donc plus la taille de l’image sera importante. Notre Dockerfile devient :

    FROM fedora:21
    MAINTAINER "Christophe Brun" <christophe.brun.cl194@gadz.org>
    
    RUN yum -y update && yum -y install httpd supervisor php php-imap php-mcrypt php-gd php-pear-Net-Curl php-mysqlnd php-pear && yum clean all
    
    ADD start.sh /start.sh
    RUN chmod -v +x /start.sh && echo "Apache" >> /var/www/html/index.html
    
    EXPOSE 80
    ADD supervisord.conf /etc/supervisord.conf
    
    CMD ["/start.sh"]

On obtient un gain de 140 Mo environ, l’history de l’image donne :

    [cbrun@cbrun ]$ docker history cbrun/httpd
    IMAGE          CREATED             CREATED BY                        SIZE
    8e2bf637b1fa   16 hours ago /bin/sh -c #(nop) CMD [/start.sh]         0 B
    6879b173dbf6   16 hours ago /bin/sh -c #(nop) ADD file:3caba19...    87 B
    cc8c459f4e45   16 hours ago /bin/sh -c #(nop) EXPOSE map[80/tc...     0 B
    dc307c2c13d9   16 hours ago /bin/sh -c chmod -v +x /start.sh &...    69 B
    39f2be03e8e3   16 hours ago /bin/sh -c #(nop) ADD file:b7948bb...    62 B
    6cf364c887be   16 hours ago /bin/sh -c yum -y update && yum -y... 304.4 MB
    088ae09b7a55    3 weeks ago /bin/sh -c #(nop) MAINTAINER "Chri...     0 B
    bfe0bb6667e4    6 weeks ago /bin/sh -c #(nop) ADD file:017c27e... 250.2 MB
    00a0c78eeb6d   10 weeks ago /bin/sh -c #(nop) MAINTAINER Lokes...     0 B
    511136ea3c5a   19 months ago                                          0 B

C’est déjà sympa, moins de layers, gaine en place et en téléchargement/chargement , gain en performances.

comments powered by Disqus