
Deployer des containers Docker en Ssh avec Gitlab
Le pré requis :
- avoir un compte et un projet sur Gitlab.
- Avoir une clé Ssh privée et publique.
- Connaître les commandes Docker.
- Une machine hôte pour l’application avec Docker installé.
Création de l’accès Ssh sur la machine hôte
Créer un utilisateur sur le serveur distant et déployer la clé publique sur le compte avec les commandes suivantes :
1 2 3 4 5 6 7 8 9 10 11 12 |
sudo adduser gitlabuser sudo groupadd docker sudo usermod -aG docker gitlabuser sudo su gitlabuser cd ~ mkdir .ssh cd .ssh touch known_hosts ssh-keyscan gitlab.com >> known_hosts touch authorized_keys chmod 700 authorized_keys vim authorized_keys #copier la clé publique |
Ouvrez la configuration de serveur Ssh :
1 |
sudo vim /etc/ssh/sshd_config |
Modifiez le fichier avec les règles suivantes :
1 2 3 4 5 |
Port 22 PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no UseDNS no |
Configuration du déploiement Gitlab
Créer un fichier .gitlab-ci.yml à la racine de votre projet. Nous commençons ce fichier par déclarer les stages :
1 2 3 4 |
stages: - test - build - deploy |
Ces stages représentent les étapes du déploiement. Chaque étape peut avoir plusieurs tâches. Une étape n’est valide que lorsque l’ensemble des tâches sont bien réalisées. Ensuite nous allons déclarer une variable :
1 2 |
variables: DOCKER_DRIVER: overlay2 |
Cela va indiquer le driver par défaut d’accès au stockage. Ce driver overlay2 est plus performant pour gérer les fichiers des images Docker. Ensuite, nous allons mettre en place notre première tâche :
1 2 3 4 5 6 7 8 9 10 |
test_app: stage: test image: node:12 script: - yarn install --quiet --frozen-lockfile - yarn run test cache: key: "$CI_JOB_STAGE-$CI_COMMIT_REF_NAME" paths: - node_modules/ |
Ici on build une application NodeJS. On commence par indiquer à quelle étape se situe cette tâche. On précise par la suite l’image dans laquelle on veut exécuter les commandes. Ainsi dans l’exemple, chaque ligne de « script » est lancée dans le container NodeJS en version 12. On peut imaginer rajouter une autre tâche, il faudra juste préciser le stage à test. Nous passons ensuite à l ‘étape suivante, la création du container :
1 2 3 4 5 6 7 8 9 |
build_staging: stage: build image: docker:latest services: - docker:dind script: - docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME . - docker push $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME |
Ici nous utilisons l’image docker pour créer un image et l’envoyer sur le registre de Gitlab. On voit ici un des multiples avantages de Gitlab : un registre Docker privé ! le service docker:dind permet d’avoir un environnement propre pour le build de l’image docker ( pour avoir plus de détail, c’est par ici ). Enfin nous terminons par l’étape du déploiement sur la machine hôte :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
deploy_master: image: debian:jessie stage: deploy script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" > ~/key && chmod 600 ~/key - ssh-add ~/key - mkdir -p ~/.ssh - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' - ssh gitlabuser@XX.XXX.XXX.XX docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY - ssh gitlabuser@XX.XXX.XXX.XX docker pull $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME - ssh gitlabuser@XX.XXX.XXX.XX docker stop $CI_PROJECT_NAME && echo 'stop done' || echo 'pass' - ssh gitlabuser@XX.XXX.XXX.XX docker rm $CI_PROJECT_NAME && echo 'stop done' || echo 'pass' - ssh gitlabuser@XX.XXX.XXX.XX docker run --name $CI_PROJECT_NAME -p 8000:8080 -d $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME || exit 1 |
La variable $SSH_PRIVATE_KEY est déclarée dans Gitlab dans la section Settings > CI/CD > Variables de votre projet . Dans l’exemple, le port 8080 est choisi de manière complètement arbitraire, à vous d’en définir un pour votre application. Ici l’application écoute sur le port 8000 dans le container et sera accessible à l’adresse XX.XXX.XXX.XX:8080.
Enjoy !
Voilà il ne vous reste plus qu’à personnaliser le fichier .gitlab-ci.yml pour l’adapter à vos besoins en déploiements. Attention, cette configuration est très basique et va lancer le déploiement de votre application à chaque fois que vous poussez un commit dans le dépôt Git.
Je vous encourage donc à configurer plus finement le lancement du déploiement. La documentation complète du fichier .gitlab-ci.yml est accessible ici. Enfin, pour en savoir plus sur les variables propres à Gitlab CI, comme $CI_REGISTRY_IMAGE, vous pouvez trouver la documentation complète ici.