21 Juin 2014

Créer ses propres images de base pour Docker

Category: Administration de serveur,Tutorielscduv @ 03:37

Si vous utilisez Docker, il y a de fortes de chances que les images de bases présentes sur le Hub Docker vous convienne (debian, ubuntu, centos, etc.).
Mais il se peut également que vous ne trouviez pas l'image avec l'OS dont vous avez besoin (Mandrake, . Ou alors que les normes de sécurité de votre activité vous impose de construire vous même vos images afin d'être sûr du contenu.

Je vais vous montrer comment créer sa propre image Docker à partir de rien (sans FROM)

La commande "docker import"

Les concepteurs de Docker ont prévu ce besoin et le client possède la commande "docker import" :

Usage: docker import URL|- [REPOSITORY[:TAG]]

Create an empty filesystem image and import the contents of the tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then optionally tag it.

Elle accepte un tarball et place son contenu dans une image vierge.
Comme je veux créer une image d'un OS basique, il me faut juste le contenu de cet OS (sous la forme d'un tarball). Le contenu tel que celui que je pourrais avoir suite à l'installation classique via un CD/DVD.

Obtenir le tarball de l'OS et construire l'image de base

Il existe plusieurs façons d'obtenir un tarball d'OS et ça dépends de l'OS désiré.

Pour Debian

Il est possible d'utiliser debootstrap pour récupérer le système Debian de base depuis les serveur de Debian et le placer dans un dossier (ici "jessie-fs")

debootstrap jessie ./jessie-fs
Attention, la commande "debootstrap" refusera de fonctionner sur une partition mountée avec "noexec" ou "nodev"

Une fois les fichiers téléchargés, on utilise tar pour filer tout ça à docker import (c'est la forme qu'il attend).

tar -C ./jessie-fs  -c . | docker import - cduv/debian:jessie
Notez que j'en ai profité pour tagger "jessie" cette image Debian perso.

Depuis une ISO

Cette méthode devrait fonctionner pour plusieurs distributions car elle utilise bêtement l'ISO d'installation que vous utiliseriez pour installer l'OS sur une machine physique.

mkdir ./point_montage_iso
mount -o loop ./distribution_linux.iso ./point_montage_iso
tar -C ./point_montage_iso  -c . | docker import - cduv/distribution_linux

Avec FROM et des ADD

Une autre possibilité est d'utiliser une image totalement vierge que Docker propose sous le nom scratch mais qu'on peut également faire soit même (toujours pour des questions de sécurité par exemple) :

tar cv --files-from /dev/null | docker import - cduv/scratch

Il suffit ensuite de l'utiliser comme n'importe quelle image de base via un fichier Dockerfile comme suit :

FROM cduv/scratch
# On ajoute des dossiers leur fichiers (qu'on aura préparés/compilés nous même)
ADD ./fs/bin /bin
ADD ./fs/boot /boot
# ...
CMD ["/bin/sh"]

Et de créer une image personnalisée avec docker build :

docker build -t="cduv/handmade:1.0" ./Dockerfile

Sources :

Étiquettes :

2 Réponses à “Créer ses propres images de base pour Docker”

  1. PCOUAS a dit:

    Bonjour

    Je suis sous Windows7, et je compte creer ma propre image Docker comprenant
    Oracle11 XE, JBOSS, JASPER,SONAR, LUTECE, POSTGRESQL.
    Quel est la meilleure méthode selon vous ?

    Merci

    • cduv a dit:

      Je n'ai jamais testé Docker sous Windows mais d'une manière générale il faut éviter de mettre plusieurs applications dans la même image.
      La philosophie Docker demande de en créer autant d'image qu'il y a d'application. Docker Compose (https://docs.docker.com/compose/) permet d'organiser plusieurs images pour travailler de concert.

Laisser une réponse à cduv