Créer ses propres images de base pour Docker

Avertissement
Dernière modification de cet article le 2014-06-21, le contenu pourrait être dépassé/obsolète.

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)

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.

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

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”)

1
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).

1
tar -C ./jessie-fs  -c . | docker import - cduv/debian:jessie

Notez que j’en ai profité pour tagger “jessie” cette image Debian perso.

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.

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

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) :

1
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 :

1
2
3
4
5
6
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 :

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

Sources :