An English version of this post is available.

Moby Dock, la baleine mascotte de Docker

Je voulais tirer des images Docker depuis ma propre registry privée pour les utiliser sur mon Synology DiskStation DS918+.

J'ai donc ajouté une nouvelle registry dans l'application Synology Docker:

  • Choisir l'onglet Registry
  • Configurer le nom et l'URL de la registry (ie : https://registry.onsen.lan:5000)
  • Cocher Trust SSL Self-Signed Certificate
  • Renseigner les informations de connexion
  • Commencer à l'utiliser

L'application Synology Docker peut lister le catalogue et remplir la liste de la registry lorsque je clique sur le bouton de rafraîchissement. Cependant, quand j'essaye de tirer une des images de ma registry, l'erreur suivante m'est présentée:

Docker image registry.onsen.lan:5000/lenain/lenain_info download failed. Please visit Docker Log for more information

Forcément, la log Docker ne contient aucune information à propos du problème.

Docker sans Sudo

Pour permettre à un utilisateur normal d'utiliser Docker sans faire de sudo à chaque fois, on se connecte en SSH au Syno et en passe en root. Puis on ajoute l'utilisateur au groupe docker et on modifie le fichier de la socket docker pour donner les permissions au groupe docker:

# synogroup --add docker lenain
# chown root:docker /var/run/docker.sock

Registries Docker sécurisées

J'essaye à nouveau de tirer l'image, cette fois via le CLI Docker. Je me retrouve face à une erreur bien connue:

$ docker pull registry.onsen.lan:5000/my-alpine
Using default tag: latest
Error response from daemon: Get https://registry.onsen.lan:5000/v2/: x509: certificate signed by unknown authority

Comme indiqué dans la documentation Docker:

A secure registry uses TLS and a copy of its CA certificate is placed on the Docker host at /etc/docker/certs.d/myregistry:5000/ca.crt. An insecure registry is either not using TLS (i.e., listening on plain text HTTP), or is using TLS with a CA certificate not known by the Docker daemon. The latter can happen when the certificate was not found under /etc/docker/certs.d/myregistry:5000/, or if the certificate verification failed (i.e., wrong CA).

Traduction:

Une registry sécurisée utilise TLS et une copie du certificat de son Autorité de Certification est placée sur l'hôte Docker à /etc/docker/certs.d/myregistry:5000/ca.crt. Une registry et considérée comme non sécurisée si elle n'utilise pas TLS (i.e., elle écoute en HTTP en clair), ou si elle utilise TLS avec un certificat d'une CA inconnue du démon Docker. Ce dernier cas peut survenir si le certificat n'est pas trouvé sous /etc/docker/certs.d/myregistry:5000/, ou si la vérification du certificat échoue (i.e., mauvaise CA).

D'habiture, il suffit de mettre ma CA à l'endroit correct (/etc/docker/certs.d/registry.onsen.lan:5000/ca.crt). Docker compare le certificat de la registry avec celui de la CA et m'autorise à tirer l'image. Mais sur le Synology, la vérification x509 est encore en échec.

Où est le repertoire certs.d ?

Trouvons où l'on doit placer les fichiers ca.crt de nos registries. On va vérifier avec strace où le démon Docker s'attend à les lire.

Synogear

Synology fourni des outils de diagnostic via l'utilitaire synogear. C'est de cette manière que l'on installe l'outil strace susmentionné.

# synogear list
Tools are not installed yet. You can run this command to install it:
   synogear install
# synogear install
# synogear list
All tools:
[...] strace [...]

Utiliser strace

Maintenant que l'on a strace, traçons les appels systèmes du démon Docker. On identifie le processus dockerd, on y attache strace, et on utilise l'option -f pour suivre d'éventuels forks du processus. On redirige la sortie d'erreur de strace vers sa sortie standard et on filtre pour les appels système open(2).

# pgrep dockerd
25214
# strace -f -p 25214 2>&1|grep open
[pid 25225] openat(AT_FDCWD, "/var/packages/Docker/etc/certs.d/registry.onsen.lan:5000", O_RDONLY|O_CLOEXEC <unfinished ...>
[pid 25225] <... openat resumed> )      = 27

La solution

Vous n'avez qu'à placer vos fichiers ca.crt de vos registries dans les répertoires certs.d suivants en tant qu'utilisateur root:

# mkdir -p /var/packages/Docker/etc/certs.d/
# mkdir /var/packages/Docker/etc/certs.d/registry.onsen.lan:5000/
# cp [...]/ca.crt /var/packages/Docker/etc/certs.d/registry.onsen.lan:5000/.

Voilà, vous n'avez même pas à recharger le démon Docker. Vous pouvez désormais tirer des images de votre registry privée via le CLI ou l'IHM de l'application Docker.