commit 635545cecc9201a359278fa7786f1d5ebd53b7cf Author: GregLebreton Date: Sat Jul 16 21:19:57 2022 +0200 push registry diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5c3710a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,2 @@ +FROM nginx:1.19 +COPY index.html /usr/share/nginx/html/index.html diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..546e597 --- /dev/null +++ b/README.MD @@ -0,0 +1,107 @@ +# DOCKER + +Une simple Dockerfile contenant un NGINX 1.19 pouvant accueillir un site web. + +## PROCESSUS + +### INSTALLATION DE DOCKER (DEBIAN 10): + +```bash +sudo apt-get update + +sudo apt-get install \ +apt-transport-https \ +ca-certificates \ +curl \ +gnupg \ +lsb-release + +curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + +echo \ +"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ +$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + +sudo apt-get update + +sudo apt-get install docker-ce docker-ce-cli containerd.io -y +``` + +### CREER UN COMPTE SUR DOCKER HUB: + + https://hub.docker.com + + * clonage du repo Docker: + +```bash +sudo git clone https://github.com/GregLebreton/docker.git +``` + +### CONSTRUCTION DE L'IMAGE: + +```bash +docker build . +``` + +### TAG DE L'IMAGE: + +```bash +docker tag /: +``` + + * ou on peux tagger l'image lors du docker run: + +```bash +docker run -d -p 80:80 -t : +``` + +### DEMARRER UN CONTENAIRE DE L'IMAGE EN Y MAPPANT LE PORT 80 DE LA MACHINE HÔTE: + +```bash +docker run -d -p 7000:80 /: +``` + +### VISITER SON NAVIGATEUR A L'ADRESSE: + +http://localhost:7000 + +### TIPS: + +* Docker sans sudo: + +```bash +sudo groupadd -f docker +sudo chown root:docker /var/run/docker.sock +sudo usermod -a -G docker "$(whoami)" +newgrp docker +sudo systemctl restart docker +``` + +* Autres commandes utiles: + + - push un conteneur sur son registre DockerHub: + +```bash +docker push +``` + - afficher les images docker: +```bash +docker ps +``` + - afficher les containers docker: +```bash +docker ls +``` + - Effacer une image: +```bash +docker rmi +``` + - Effacer un conteneur: +```bash +docker rm +``` + + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c6e1bb --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +# DOCKER REGISTRE AVEC UI + +Ce projet a pour but d'instancier un registre Docker sécurisé par mot de passe et +accessible via une UI. Votre Docker Hub! + +### CREATION D'UN PASSWORD: + +Ici, remplacer testuser et testpassword par le nom d'utilisateur et le mot de passe désiré. +```sh +sudo apt-get install apache2-utils +htpasswd -Bbn testuser testpassword > auth/htpasswd +``` + +### LANCER LA STACK +```sh +docker-compose up -d +``` + +### SE CONNECTER A L'ADRESSE: +http://locahost:8087 + +### POUSSER UNE IMAGE: + +Login au docker registry (nécessaire une fois): +```sh +docker login localhost:5000 +``` + +Entrer l'utilisateur et le mot de passe créés plus tôt, puis: +```sh +docker tag localhost/mon_image:tag +docker push localhost/mon_image:tag +``` +### MAINTENACE REGISTRE: + +Dans le dossier utils du projet, vous trouverez des scripts de maintenance de votre registre. Ils nécessitent des champs à renseigner tel que l'adresse du registre ou le chemin de stockage de votre volume contenant les images du registre. + +#### STACK-BACKUP-REGISTRY + +1) Renseigner lURL du registre + +2) Créer un crontab pour sauvegarde quotidienne: +```bash +crontab -e +``` + +3) Configurer l'heure de sauvegarde (ici, à 00h00 chaque jours): +```bash +0 0 * * * /path/docker/utils/stack-backup-registry.sh +``` + +#### REGISTRY-IMAGE-CLEANING + +1) Copier regctl: +```bash +sudo mv utils/regctl /usr/bin/ +``` + +2) Renseigner /path/docker/utils/registry-image-cleaning.sh + +3) Créer une crontab: +```bash +crontab -e +``` + +4) A la fin du fichier, y placer la fréquence de la crontab ainsi que le chemin du script: +```bash +0 0 * * * /path/docker/utils/registry-image-cleaning.sh +``` diff --git a/auth/htpasswd b/auth/htpasswd new file mode 100644 index 0000000..e69de29 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..af685f8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,36 @@ +version: '2.0' +services: + +# REGISTRY + registry: + image: registry:2.6.2 + container_name: registry + ports: + - "5000:5000" + environment: + REGISTRY_AUTH: htpasswd + REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm + REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd + volumes: + - ./auth:/auth + - ./registry-data:/var/lib/registry + - ./registry-config:/etc/docker/registry + networks: + - registry-ui-net + +# UI + ui: + image: joxit/docker-registry-ui:1.5-static + container_name: ui_registry + ports: + - 8087:80 + environment: + - REGISTRY_TITLE=DockerRegistry + - REGISTRY_URL=http://registry:5000 + depends_on: + - registry + networks: + - registry-ui-net + +networks: + registry-ui-net: diff --git a/index.html b/index.html new file mode 100644 index 0000000..9bdf44d --- /dev/null +++ b/index.html @@ -0,0 +1,5 @@ + + Hello Docker +

Hello le Garage numerique!

+ + diff --git a/utils/regctl b/utils/regctl new file mode 100755 index 0000000..d79e660 Binary files /dev/null and b/utils/regctl differ diff --git a/utils/registry-image-cleaning.sh b/utils/registry-image-cleaning.sh new file mode 100755 index 0000000..eeeb086 --- /dev/null +++ b/utils/registry-image-cleaning.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +#//// GREG POUR LE GARAGE NUMERIQUE \\\\# + +# Ce script fonctionne avec le docker-compose.yml du projet https://gitlab.com/greglebreton/docker.git -> branche docker-registry +# Ce script maintient un registre privée accueillant des sauvegardes de conteneurs quotidiennement de manière automatisée. +# Le delta est exprimé en jour et est effectué par comparaison entre la date du jour et la date d'enregistrement de l'image. + +date=$(date +"%Y-%m-%d") + +# A RENSEIGNER +## chemin vers le dossier docker cloné sans le dernier / +registryPath="" +## exemple monRegistreDocker.monDomaine.com +dockerRegistryAdress="" +## nombre de jours de sauvegarde à conserver par rapport à la date du jour (à ajuster si les sauvegardes ne sont pas quotidiennes) +max="" +## registres à ignorer +exceptions=( "container1" "container2" ) + +################################################################################################### + +echo "docker clean start..." + +## DOCKER LIST IMG REGISTRY +registry=$(ls $registryPath/registry-data/docker/registry/v2/repositories/) + +## DOCKER LIST TAGS FOR EACH REPO +for repo in $registry +do + for ex in ${exceptions[@]} + do + if [ $repo == $ex ] + then + break + else + tags=$(ls $registryPath/registry-data/docker/registry/v2/repositories/$repo/_manifests/tags/) + + for tag in $tags + do + datebackup=$(stat -c '%w' $registryPath/registry-data/docker/registry/v2/repositories/$repo/_manifests/tags/$tag) + gooddatebackup="${datebackup:0:10}" + + echo $gooddatebackup + + if [ ${tag:0:2} == "01" ] + then + break + else + let delta=($(date +%s -d $date)-$(date +%s -d $gooddatebackup))/86400 + + if [ $delta -gt $max ] + then + echo "$dockerRegistryAdress/$repo:$tag deleted!" + regctl tag rm $dockerRegistryAdress/$repo:$tag + fi + fi + done + fi + done +done + +echo "registre nettoyé" diff --git a/utils/stack-backup-registry.sh b/utils/stack-backup-registry.sh new file mode 100755 index 0000000..9abef60 --- /dev/null +++ b/utils/stack-backup-registry.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +#//// GREG POUR LE GARAGE NUMERIQUE \\\\# + +# Script automatisant le push de conteneur vers un registre privé de backups ainsi que les volumes correspondants. +# Le docker login au registre doit être effectué au moins une fois manuellement. +# Configurer l'adresse du registre ainsi que les informations sur le serveur de backups +# Les volumes et labels sont archivés et transférés par ssh vers le serveur de backup une fois par mois (le 1er). + +############################## CONFIG ############################## + +date=`date +%d-%m` +# dockerregistry="monregistre.mondomaine.com" +dockerregistry="" +# sshHost="user@server-IP" +sshHost="" +# sshPort=9999 +sshPort= +backupFolder="~/docker-volumes-backup/" +# exceptions=( "container1" "container2") +#exceptions=( "" ) + +############################## CONTAINERS BACKUP ############################## + +# LISTING DES CONTAINERS +stack=$(docker ps -aq) + +for container in $stack +do + echo "backup du conteneur $container" + # GET CONTAINER NAME + docker inspect --format='{{.Name}}' $container > containers.txt + containerName=$(sed 's/[/]*//' containers.txt) + + for exception in ${exceptions[@]} + do + if [ $container == $exception ] + then + break + else + # COMMIT AND PUSH TO REGSTRY + docker container commit $container $dockerregistry$containerName-backup:$date + docker push $dockerregistry$containerName-backup:$date + fi + done +done + +# CLEANING +rm -rf containers.txt + +############################## VOLUMES & LABELS BACKUP ############################## + +if [ ${date:0:02} == "01" ] +then + # LISTING DES VOLUMES + volumes=$(docker volume ls -q) + + for volume in $volumes + do + echo "backup du volume $volume" + + # GET CONTAINER ID + containerId=$(docker ps -a -q --filter volume=$volume) + # GET CONTAINER NAME + docker inspect --format='{{.Name}}' $containerId > volumes.txt + container=$(sed 's/[/]*//' volumes.txt) + + # STOP THE CONTAINER (FOR VOLUMES INTEGRITY) + docker stop $container + # BACKUP VOLUME IN ARCHIVE + docker run -v $volume:/volume -v $(pwd)/backup:/backup --rm loomchild/volume-backup backup volumes/$container-volume:$date + # BACKUP DOCKER VOLUMES LABELS + docker inspect $volume -f "{{json .Labels}}" > backup/labels/$container-labels.json + # RESTART THE CONTAINER + docker start $container + + # CLEANING + rm -rf volumes.txt + done + + # MV VOLUMES & LABELS BACKUP TO BACKUP HOST + scp -r -P $sshPort $(pwd)/backup/* $sshHost:$backupFolder + # CLEANING + rm -rf containers.txt; rm -rf $(pwd)/backup/volumes/*; rm -rf $(pwd)/backup/labels/* + + echo "copie des archives de volumes vers le serveur de backup ok" +fi + +echo "backup des containers terminée"