Tutoriel | Installation, configuration et utilisation d’un Docker Registry

Article publié le 13 Août 2018

Ce tutoriel complet expliquera comment installer, configurer, et utiliser un Docker Registry.

Pour suivre ce tutoriel, Docker doit-être installé sur votre machine. Un tutoriel vous expliquant comment installer Docker est disponible ici.

Nous allons travailler dans le répertoire /srv/myrepo.com et pour servir d’exemple l’adresse de notre repository sera myrepo.com. Le fichier host sera renseigné de tel manière à ce que l’IP de ma machine soit associé au nom myrepo.com.

– Dans notre répertoire de travail, nous allons créer deux répertoires:

mkdir -p /srv/myrepo.com/certs

mkdir -p /srv/myrepo.com/auth

– Nous allons ensuite généré dans le répertoire /srv/myrepo.com/certs un certificat TLS:

cd /srv/myrepo.com/certs && openssl req -x509 -newkey rsa:4096 -nodes -keyout myrepo.com.key -out myrepo.com.crt -days 365 -subj /CN=myrepo.com

– En faisans un « ls » vous devriez voir la clé privée plus le certificat:

– Copiez ensuite le crt dans le répertoire /etc/docker/certs.d/myrepo.com (pour rappel myrepo.com correspond au nom de votre repo)

sudo mkdir -p /etc/docker/certs.d/myrepo.com:5000 && cp /srv/myrepo.com/certs/myrepo.com.crt /etc/docker/certs.d/myrepo.com\:5000/

– Faites un pull de l’image Docker registry:

docker pull registry:2

– Générez ensuite un fichier htpasswd contenant le login et le mot de passe qui permettra de vous authentifier:

docker run –entrypoint htpasswd registry:2 -Bbn votrelogin votrepassword > /srv/myrepo.com/auth/htpasswd

– Lancez le container Docker Registry:

docker run -d -p 5000:5000 -v /srv/myrepo.com/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/myrepo.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/myrepo.com.key -v /srv/myrepo.com/auth:/auth -e REGISTRY_AUTH_HTPASSWD_REALM= »Registry Realm » -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry:2

– Authentifiez-vous sur votre registry

docker login

Si l’authentification se déroule bien vous devriez avoir quelque chose comme ceci:

– Testez que votre repository fonctionne correctement.

  • Pour cela, on va faire un pull d’une image (busybox):

docker pull busybox

  • Taggez ensuite l’image pour la faire pointer vers votre registry

docker tag busybox myrepo.com:5000/testimage

  • Pushez l’image vers votre registry

docker push busybox myrepo.com:5000/testimage

 

 Dans ce tuto, le certificat utilisé est un certificat auto-signé. Si vous voulez utiliser votre registry depuis un autre serveur (ce qui, je pense, sera forcément le cas) il sera nécessaire de copier le répertoire /etc/docker/certs.d/myrepo.com\:5000/ sur chaque machine qui devra se connecter à votre registry et redémarrer le service Docker. Si vous ne faites pas cela,  vous risquez d’avoir un vilain message d’erreur vous indiquant que votre certificat TLS n’est pas bon…

Lister les images de votre repository:

Pour lister et connaître le contenu de votre repository, utiliser la commande curl suivante:

curl –insecure -u « login password » <URL de votre repository>

–insecure à utiliser si vous utilisez un certificat auto-signé

 




Migrer vos fichier docker compose vers kubernetes avec Kompose

Article publié le 24 Janvier 2018

Mini article rapide pour vous parler de Kompose, un outil fort bien pratique pour convertir vos fichiers docker-compose.yml en yaml Kubernetes. Ceci est fortement appréciable notamment pour ceux qui débutent avec l’écosystème Kubernetes.

Installation

Lancez la commande suivante (n’oubliez pas de checker le numéro de version dans le lien qui peut évoluer dans le temps depuis l’écriture de cet article):

curl -L https://github.com/kubernetes/kompose/releases/download/v1.7.0/kompose-linux-amd64 -o kompose && mv kompose /usr/local/bin && chmod 755 /usr/local/bin/kompose

Utilisation

Dans l’exemple ci-dessous, je vais convertir le docker-compose de jenkins.

Contenu du docker-compose.yml:

version: « 2 »
volumes:
data-jenkins:
driver: « local »
services:
jenkins:
image: « jenkins:2.60.3 »
ports:
– « 8080:8080 »
restart: « always »
volumes:
– « /srv/jenkins:/var/jenkins »

 

Convertissez votre fichier docker-compose avec la commande suivante:

kompose convert -f docker-compose.yml

Dans mon exemple cela donne ceci:

Kompose a créé les fichiers Kubernetes.

Nous allons ensuite tester les fichiers yaml généré en créant un pod Kubernetes avec le service associé:

Nous allons vérifier que tout est déployé correctement:

enjoy 😉




Tutoriel | Répartition de charge en fonction des ressources disponibles sur vos machines avec HAPROXY

Article publiée le 23 Septembre 2017

Il y a quelque temps, je suis tombé sur la problématique suivante: comment faire en sorte que mon LoadBalancer HAProxy répartisse les connexions sur les machines ayant le moins de charge CPU?

Un collègue m’a alors fait suivre une doc qui m’a apporté la solution.

Ci-dessous un petit tuto vous expliquant comment procéder en prenant comme exemple la répartition d’un flux SSH sur 2 machines. Rien ne vous empêche d’adapter ce tuto  pour rediriger d’autres type de connexion (HTTP, etc…)

1) Configuration de votre serveur HAPROXY

  • Installez HAPROXY:

Sous Debian/Ubuntu:

apt-get install haproxy

Sous RedHat/Centos

yum install haproxy

Éditez le fichier /etc/haproxy/haproxy.cfg (pensez à faire une sauvegarde avant) et écrasez le contenu avec la configuration ci-dessous:

global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

 

# turn on stats unix socket

stats socket /var/lib/haproxy/stats

 

defaults
mode tcp
log global
option dontlognull
option http-server-close
#option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

 

 

listen haproxy_servers

#bind correspond au port d’écoute de votre HAPROXY

bind *:2222
mode tcp
option tcplog
timeout client 10800s
timeout server 10800s
#balance leastconn
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 200 maxqueue 250 weight 100 error-limit 10 on-error mark-down on-marked-down shutdown-sessions agent-port 9707 agent-inter 30s
server monserveur1.mondomaine.net monserveur1.mondomaine.net:22 check agent-check observe layer4
server monserveur2.mondomaine.net monserveur2.mondomaine.net:22 check agent-check observe layer4
server localhost 127.0.0.1:22 maxconn 500 backup weight 1

 

backend servers

mode tcp
option tcplog
#balance roundrobin
server monserveur1.mondomaine.net monserveur1.mondomaine.net:22
server monserveur2.mondomaine.net monserveur2.mondomaine.net:22

2) Installation de l’agent sur les machines hôtes

Déployez l’agent en suivant les instructions ci-dessous sur chacune des machines qui recevra la charge.

  • Créez le fichier /usr/local/bin/haproxy-agent-check et insérez le script ci-dessous

#!/bin/bash
LMAX=90

load=$(uptime | grep -E -o ‘load average[s:][: ].*’ | sed ‘s/,//g’ | cut -d’ ‘ -f3-5)
cpus=$(grep processor /proc/cpuinfo | wc -l)

while read -r l1 l5 l15; do {
l5util=$(echo « $l5/$cpus*100″ | bc -l | cut -d ». » -f1);
[[ $l5util -lt $LMAX ]] && echo « up 100% » && exit 0;
[[ $l5util -gt $LMAX ]] && [[ $l5util -lt 100 ]] && echo « up 50% » && exit 0;
echo « down#CPU overload »;
}; done < <(echo $load)

exit 0

  • Ajustez les droits pour que le script soit exécutable:

chmod +x /usr/local/bin/haproxy-agent-check

  • Installez xinetd (apt-get install xinetd ou yum install xinetd en fonction de votre distribution)
  • Éditez le fichier /etc/services et ajoutez y la ligne suivante:

haproxy-agent-check 9707/tcp                # haproxy-agent-check

  • Créez le fichier xinetd /etc/xinetd.d/haproxy-agent-check avec le contenu suivant:

# default: on
# description: haproxy-agent-check
service haproxy-agent-check
{
disable         = no
flags           = REUSE
socket_type     = stream
port            = 9707
wait            = no
user            = nobody
server          = /usr/local/bin/haproxy-agent-check
log_on_failure  += USERID
per_source      = UNLIMITED

}

  • Ajustez les droits:

chmod +x /etc/xinetd.d/haproxy-agent-check

  • Redémarrez le service xinetd

service xinetd restart

  • Une fois cette manipulation effectuée sur chacune de vos machine testez la connectivité entre votre serveur HAProxy et vos hôtes via le port 9707

telnet <DNS ou IP de votre machine> 9707

  • Redémarrez ensuite le service HaProxy sur la machine prévue à cet effet:

service haproxy restart

  • Enfin, depuis votre machine HAproxy, vérifiez que vos agents répondent correctement grâce à la commande suivante:

echo « show stat » | socat stdio unix-connect:/var/lib/haproxy/stats  | cut -d ‘,’ -f1,2,18,19 | grep haproxy

Vous devriez avoir un retour de ce type:

haproxy_servers,FRONTEND,OPEN,
haproxy_servers,<monserveur1>,UP,100
haproxy_servers,<monserveur2>,UP,100
haproxy_servers,localhost,no check,1
haproxy_servers,BACKEND,UP,200

Voila il ne vous reste plus qu’à vous connecter sur votre machines HAPROXY (via la port 2222 dans notre cas) et vous constaterez que votre LoadBalancer répartira la charge sur la machine ayant la charge CPU la plus faible!

Enjoy 😉

 




Tuto Docker | Démarrer avec Docker

Article publié le 09/02/2017

Mis à jour le 22/08/2018

Après pas mal de temps, j’ai enfin décidé à me mettre à étudier Docker. Étant très hésitant au départ, je me suis vite aperçu que Docker est un outil extrêmement puissant, flexible avec un potentiel Devops incroyable.

La question que se posent beaucoup de personnes est: qu’est-ce que c’est Docker? Contrairement à la virtualisation classique ou vous virtualisez l’intégralité de la machine et tout se qu’elle héberge, Docker n’héberge  que les applications et les librairies!

I) Installation

Sous Debian: 

On ajoute les dépôts docker et on installe:

sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add –
sudo add-apt-repository « deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable »
sudo apt-get update
sudo apt-get install docker-ce

systemctl enable docker
systemctl start docker

Sous Centos:

On ajoute les dépôts docker et on installe:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce
systemctl enable docker
systemctl start docker
Afin de nous faciliter la vie, on attribue les droits à notre utilisateur pour éviter de bosser avec root.
usermod -a -G docker  <votre user>

 II) Création d’un container

Dans l’exemple ci-dessous, on va chercher une image nginx:

docker search nginx

On rapatrie l’image sur notre machine :

docker pull nginx

On vérifie notre liste d’images:

docker images

On s’aperçoit que notre image nginx a bien été rapatrié:

On installe le container

docker run -d –name=ServeurNginx nginx:latest

On vérifie que le container est bien installé:

docker ps  -a

On démarre notre container:

docker start <container id>

docker start 1f8b15c5b642

Nous allons maintenant inspecter la configuration de notre container afin de déterminer l’adresse IP local du container:

docker inspect <id du container>

Vous verrez toutes les informations de votre container et notamment un élément qui nous intéresse:

  « IPAddress »: « 172.17.0.2 »,
« IPPrefixLen »: 16,

L’IP ci-dessus correspond à l’interface virtuel  de votre container. Si vous tentez de vous connecter en HTTP via l’adresse de votre container, le serveur nginx hébergé dans votre container va répondre:

elinks 172.0.0.2

Bon j’imagine que vous allez me poser la question suivante: « comment on fait pour que notre container soit accessible de l’extérieur? »

Pour cela rien de plus simple, nous allons créer un deuxième container depuis l’image nginx avec quelques arguments en plus:

 docker run -d -p 9876:80 –name=Webserver3 nginx:latest

Votre container sera joignable via le port 9876 depuis l’extérieur:

Allons encore un peu plus loin en mappant des répertoires internes de votre container directement sur un répertoire de votre serveur (par exemple pour mettre à jour le contenu d’un site web hébergé dans votre container).
docker run -d -p 9876:80 –name=WebServer4 -v /home/usr/www:/usr/share/nginx/html nginx:latest

III) DockerFile

Il est possible avec Docker de créer un container  à partir d’un fichier de configuration nommé Dockerfile.

Pour cela créer un fichier nommé Dockerfile.

Dans notre fichier nous allons créer un container Debian et installer un serveur apache2 accessible depuis l’extérieur.

Ci-dessous le contenu du Dockerfile

# Image
FROM debian:stable
#Information sur le propriétaire du container
MAINTAINER [email protected]
# Commande RUN utilisé uniquement lors de la creation du container (necessite un docker build)
RUN apt-get update && apt-get upgrade -y && apt-get install -y apache2 telnet  elinks openssh-server
# Creation variable
ENV VARIABLE ma-variable
# PORT 80 Ouvert
EXPOSE  80
# On expose le port SSH pour pouvoir se connecter sur la machine
EXPOSE 22
# Commande passé une fois le container créé (ne neccessite pas un docker build juste un run)
#     Commande               1er arg 2eme arg
CMD [« /usr/sbin/apache2ctl », »-D », »FOREGROUND »]
Reste plus qu’à créer notre container depuis le Dockerfile.
On crée notre image Docker:
docker build -t myapache .
On installe notre container:
docker run -d -P 9999:80 –name=Debianapache myapache:latest
Il ne reste plus qu’à vérifier via l’IP de votre serveur Docker si le serveur apache est accessible:

IV) Autre commandes utiles

Supprimer tout les container actifs:
docker rm `docker ps -a -q`
Démarrer ou arrêter un container :
docker start <container>
docker stop <container>
Supprimer tout les container actif:
docker rm `docker ps -a -q`
Supprimer une image docker (vérifier qu’aucun container n’est actif):
docker rmi <image>
Vous connecter directement sur votre container:
docker run -it <votre container> /bin/bash

VI) Repository

Le repository docker https://hub.docker.com/explore/ contient toutes les images dockers possible et imaginable. Vous pouvez aussi bien trouver des container apache que nginx voir même des images de distributions Linux comme Centos ou Debian. Je vous suggère de créer un compte et d’y  aller faire un tour.

Un tuto pour créer votre propre Registry Docker est disponible ici

VII) Docker Compose

Docker-compose est un outil officiel Docker  absolument génial qui permet de gérer à 100% vos container uniquement un fichier de configuration yml. Cet outil est d’autant plus pratique si vos applications nécessite l’installation de plusieurs containers pour fonctionner.

Le tutoriel sur docker-compose est disponible ici:

Tuto Docker | Gérer vos container avec Docker compose

VIII) Docker Swarm

Docker swarm est l’orchestrateur de container officiel Docker. Un tutoriel sur son déploiement est disponible:

Tutoriel | Installer et utiliser DockerSwarm

IX) Registry Privé

Un tutoriel sur l’installation d’un registry privé Docker est disponible:

Tutoriel | Installation, configuration et utilisation d’un Docker Registry

X) Kubernetes

Kubernetes est un puissant orchestrateur de container extrêmement utilisé aujourd’hui. Un tutoriel sur son déploiement est disponible:

Tutoriel | Installez facilement un cluster Kubernetes sous Debian ou Centos

XI) Portainer

Portainer est un outil puissant permettant de gérer vos environnement Docker via une interface Web extrêmement simple d’utilisation:

Tutoriel | Gérez vos container docker avec Portainer