Aller au contenu

Registre Docker privé

Ce document ne contient que les étapes minimales pour la mise en place d'un registre Docker privé. Pour des raisons de simplicité, ce registre est configuré sans mot de passe. Cette mise en place n'est donc pas adaptées à un environnement de production.

Deux approches sont possibles pour accéder au registre :

  • Accès simple avec Nginx
  • Accès recommandé avec HAPRoxy

Dans le cadre de ce projet, il est recommandé de mettre un place un registre sur chaque load balancers pour y accéder via une l'addresse IP virtuelle.

Le terme registry_host correspond à la machine qui gère le registre Docker.

Accès via Nginx

Si HAProxy est déjà présent, cette section n'est pas à effectuer.

Note

L'architecture actuellement mise en place n'utilise pas Nginx.

Nginx doit être installé sur le registry_host afin de pouvoir accéder au registre Docker.

Bash
sudo apt update
sudo apt install nginx -y

Il faut ensuite modifier le fichier /etc/nginx/sites-available/default afin de rediriger les requêtes sur le port 5000 de notre registre ainsi qu'ajouter des headers.

Pour cela, il faut modifier le contenu du bloc location /

Nginx Configuration File
...
location / {
                proxy_pass                          http://localhost:5000;
                proxy_set_header  Host              $http_host;
                proxy_set_header  X-Real-IP         $remote_addr;
                proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
                proxy_set_header  X-Forwarded-Proto $scheme;
                proxy_read_timeout                  900;
        }
...

Il faut ensuite redémarrer le service nginx :

Bash
sudo systemctl restart nginx

Accès via HAProxy

Cette section est une configuration alternative pour une situation où l'on souhaite installer notre registre Docker sur la même machine qui gère HAProxy.

HAPRoxy peut être configuré afin d'accéder au registre Docker.

Modifier le fichier de configuration /etc/haproxy/haproxy.cfg pour y ajouter l'ACL et backend ci-dessous.

Unix/Linux Config Files
...
frontend default
        bind :80
        acl ACL_registry.bota-hepia.ch hdr(host) -i registry.bota-hepia.ch
        use_backend registry if ACL_registry.bota-hepia.ch

        default_backend traefik

backend registry
        balance roundrobin
        server registry1 localhost:5000 check
...

Il est techniquement recommandé de définir plusieurs serveur dans le backend registry afin de pouvoir toujours en accéder un si celui local n'est pas opérationnel. Néanmoins j'ai choisi de partir du principe que si HAProxy fonctionne alors le registre de la même machine fonctionne également.

Redémarrer le service HAProxy.

Bash
sudo systemctl restart haproxy

/etc/hosts

Il faut modifier le fichier /etc/hosts pour y ajouter le domaine registry.bota-hepia.ch requis pour accéder au registre Docker.

Bash
echo "10.136.26.70 registry.bota-hepia.ch" | sudo tee -a /etc/hosts

Vérification :

Bash
$ curl -v http://registry.bota-hepia.ch/v2/
*   Trying 10.136.26.70:80...
* Connected to registry.bota-hepia.ch (10.136.26.70) port 80 (#0)
> GET /v2/ HTTP/1.1
> Host: registry.bota-hepia.ch
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< content-length: 2
< content-type: application/json; charset=utf-8
< docker-distribution-api-version: registry/2.0
< x-content-type-options: nosniff
< date: Fri, 12 Jul 2024 09:36:55 GMT
<
* Connection #0 to host registry.bota-hepia.ch left intact

Docker

Le registry_host doit installer Docker et Docker compose.

Bash
# Install prerequisite packages
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

# Add the Docker GPG key to the system
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Add the repository to the APT sources
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Update the list of packages and install Docker
sudo apt update
sudo apt install -y docker-ce

# Add user to docker group to execute Docker without sudo
sudo usermod -a -G docker $USER
# Manually logout and login again to load the group change
# You can also use the following command
su - $USER

Vérifier que le service docker est démarré et activé

Bash
1
2
3
sudo systemctl start docker.service
sudo systemctl enable docker.service
systemctl status docker.service

Vérifier que Docker compose a également été installé

Bash
docker compose version
# Output: Docker Compose version v2.28.1

Daemon

Ajouter notre futur registre local à la configuration de Docker.

Bash
sudo nano /etc/docker/daemon.json
JSON
1
2
3
4
5
{
    "insecure-registries":[
        "localhost:5000"
    ]
}

Redémarrer les services

Bash
sudo systemctl daemon-reload
sudo systemctl restart docker

Registre

Mise en place du registre privé :

Bash
mkdir -p ~/docker-registry/data && cd ~/docker-registry

Dans le répertoire ~/docker-registry/, créer le fichier docker-compose.yml suivant :

YAML
services:
  registry:
    image: registry:latest
    ports:
    - "5000:5000"
    environment:
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - ./data:/data
    restart: always

Démarrer le registre :

Bash
docker compose up -d

Vérification

La requête curl suivante permet de s'assurer que le registre est accessible :

Bash
# The trailing '/' is required
$ curl -v http://localhost:5000/v2/
*   Trying 127.0.0.1:5000...
* Connected to localhost (127.0.0.1) port 5000 (#0)
> GET /v2/ HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Length: 2
< Content-Type: application/json; charset=utf-8
< Docker-Distribution-Api-Version: registry/2.0
< X-Content-Type-Options: nosniff
< Date: Fri, 12 Jul 2024 09:22:28 GMT
<
* Connection #0 to host localhost left intact

Botalista

Cette section explique comment récupérer les image du registre de Botalista (registry.computaceae-it.tech) et les stocker dans notre registre privé.

Pull, tag, push

Les commandes ci-dessous doivent être exécutées depuis le registry_host.

Note: le tag a utilisé est généralement latest.

Bash
1
2
3
docker pull <registry/image:tag>
docker tag <registry/image:tag> localhost:5000/<image:tag>
docker push localhost:5000/<image:tag>

Cleanup

Après avoir push une image, il est recommandé de la supprimer du serveur local.

Bash
docker rmi -f <image_id>

Ressources