[NOOB] Créer un container Docker

création 22 sept. 2019

Cet article n’a pas la prétention d’être poussé mais d’expliquer les bases de la création d’un container Docker au travers d’un exemple (très) simple : mon ntopng.

Pour créer un Docker il faut indiquer une base d’OS, Ubuntu ici sinon ce que vous voulez. Alpine est souvent utilisé car très léger, le but d’un container étant de gagner du temps en déploiement mais pas au détriment de l’espace disque occupé pour -souvent- 1 seul service.

Il faut ensuite ajouter les commandes telles que nous les exécuterions en temps normal : update/upgrade (ou pas), installation d’un service, de ses dépendances éventuelles, configuration etc.

Puis on ajoute des variable selon les besoins comme par exemples des ports à publier et encore des volumes qui pourront être montés localement sur l’hôte pour la persistance des données.

Enfin on indique à Docker ce qu’il doit exécuter comme commande lorsqu’il se lance (en gros on lui dit comment lancer le dit service).

Tout commence avec un fichier Dockerfile (nano dockerfile), voici celui de mon exemple :

FROM ubuntu:18.04
MAINTAINER Aerya <[email protected]>

RUN apt-get update
RUN apt-get -y -q install wget software-properties-common
RUN wget http://apt-stable.ntop.org/18.04/all/apt-ntop-stable.deb
RUN apt install ./apt-ntop-stable.deb
RUN rm -rf apt-ntop-stable.deb

RUN apt-get update
RUN apt-get -y -q install ntopng redis-server libpcap0.8 libmysqlclient-dev

RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

VOLUME /etc/ntopng
VOLUME /var/lib/ntopng

EXPOSE 3000

RUN echo '#!/bin/bash\n/etc/init.d/redis-server start\nntopng "$@"' > /tmp/run.sh
RUN chmod +x /tmp/run.sh

ENTRYPOINT ["/tmp/run.sh"]
  • FROM : OS servant de base au container
  • MAINTAINER : nom/coordonnées du créateur (qui est sensé le tenir à jour)
  • RUN apt-get update : mise à jour des sources de l’OS, je parlerais de l’absence d’upgrade ensuite
  • RUN apt-get -y -q install wget software-properties-common : installation silencieuse des dépendances du service
  • RUN wget http://apt-stable.ntop.org/18.04/all/apt-ntop-stable.deb : téléchargement de la dernière version stable de ntop pour ubuntu 18.04
  • RUN apt install ./apt-ntop-stable.deb : installation
  • RUN rm -rf apt-ntop-stable.deb : suppression du .deb une fois installé (gain de place et de toute manière inutile)
  • RUN apt-get update : mise à jour des sources de l’OS
  • RUN apt-get -y -q install ntopng redis-server libpcap0.8 libmysqlclient-dev : installation de ntopng et des dépendances nécessaires (Redis étant -pour simplifier- une base de données dynamique qui permet de mettre en cache des variables pour un accès plus rapide et simple)
  • RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* : on nettoie tout ce qui a servi pendant l’installation
  • VOLUME /etc/ntopng : volume qui pourra être monté localement sur l’hôte, cela permettant de conserver des données malgré une suppression/MàJ du container
  • VOLUME /var/lib/ntopng : volume qui pourra être monté localement sur l’hôte, cela permettant de conserver des données malgré une suppression/MàJ du container
  • EXPOSE 3000 : port publié du container
  • RUN echo ‘#!/bin/bash\n/etc/init.d/redis-server start\nntopng “$@”‘ > /tmp/run.sh : création d’un script de lancement de ntopng via Redis
  • RUN chmod +x /tmp/run.sh: on le rend exécutable
  • ENTRYPOINT [“/tmp/run.sh” : à chaque lancement du container, Docker exécutera cette commande, donc le script de lancement de ntopng

Pourquoi je n’ai pas ajouté la commande upgrade ? Parce qu’il peut arriver qu’une MàJ d’un système casse des dépendances et cela pourrait alors rendre caduque ce container. Via la commande FROM on installe un OS à jour. Je compte suivre ce container selon les nouvelles versions stables de ntopng et je referai donc un container “à jour” à chaque push (publication).

Maintenant que nous avons notre dockerfile il faut créer le container Docker final. On lui indique au passage le nom à donner et le tag de version. Après quelques minutes tout est publié sur DockerHub (sur lequel il faut préalablement se faire un compte évidemment…).

docker build  -t aerya/ntopng:3.8 .

Dockerhub permettant d’avoir le détail de la création d’un container on peut donc vérifier ce qu’il contient.

Mots clés