Un exemple d'utilisation de Vagrant pour provisionner une VM et d'ansible pour installer Docker à l'intérieur pour permettre une utilisation de docker en simple utilisateur.
if needed set standard proxy variables (http_proxy, ...) and run :
source <(curl -s https://raw.githubusercontent.com/ebpro/demomavenarchetype/develop/src/main/resources/archetype-resources/wrappers.sh)export VAGRANT_HTTP_PROXY=${http_proxy}
export VAGRANT_HTTPS_PROXY=${https_proxy}
export VAGRANT_NO_PROXY=${no_proxy}install-dockerclient-vagrantprovision-docker-enginegit clone https://github.com/ebpro/VagrantDockerProvisioningUsage.git && \
cd VagrantDockerProvisioningUsage && \
vagrant upmkdir -p ~/bin && \
export PATH=~/bin:$PATH && \
wget -qO- https://releases.hashicorp.com/vagrant/2.3.3/vagrant_2.3.3_linux_amd64.zip|gunzip - \
> ~/bin/vagrant && \
chmod +x ~/bin/vagrantSi besoin, il est possible de stocker les images des VM dans un autre répertoire par défaut :
VBoxManage list systemproperties | grep "Default machine folder:" && \
mkdir -p /scratch/${USER} && \
vboxmanage setproperty machinefolder /scratch/${USER}/VirtualBox\ VMs && \
echo -n "New " && VBoxManage list systemproperties | grep "Default machine folder:" Installer le plugin vagrant pour les proxy :
vagrant plugin install vagrant-proxyconfDéfinir les adresses des proxies et URLEncoder si besoin le password dans les variables standards :
export http_proxy=http://<login>:<password>@proxy.univ-tln.fr:3128
export https_proxy=http://<login>:<password>@proxy.univ-tln.fr:3128
export no_proxy=127.0.0.1puis définir celles utilisées par Vagrant pour régler la VM :
export VAGRANT_HTTP_PROXY=${http_proxy}
export VAGRANT_HTTPS_PROXY=${https_proxy}
export VAGRANT_NO_PROXY=${no_proxy}Dans l'hôte ajouter le fichier ~/.docker/config.json pour le variable du proxy soient fixée dans chaque container dans la VM.
{
"proxies": {
"default": {
"httpProxy": "http://username:password@proxy.univ-tln.fr:3128",
"httpsProxy": "http://username:password@proxy.univ-tln.fr:3128",
"noProxy": "127.0.0.1"
}
}
}NOTE: ATTENTION wget fourni dans busybox en semble pas suporter le CONNECT de HTTP, il faut donc installer explicitement wget dans vos container.
Pour démarrer un VM contenant docker :
-
Cloner ce repository
-
Editer si besoin le fichier
Vagrantfilepour configurer la VM (redirection de ports de l'hôte vers la VM, montage de répertoires de l'hôtes vers la VM, ...). -
Lancer Vagrant depuis le répertoire créé.
vagrant up
Une fois la VM lancée, il est possible d'afficher l'adresse IP de cette VM :
vagrant ssh --command "ip -4 -oneline -color addr show"et de s'y connecter avec ssh depuis le répertoire du projet :
vagrant sshDocker est disponible dans la VM.
Pour utiliser Docker depuis l'hôte, il faut installer un client docker sur l'hôte:
curl -sL https://download.docker.com/linux/static/stable/x86_64/docker-20.10.19.tgz | \
tar --directory=${HOME}/bin/ --strip-components=1 -zx docker/docker &&\
chmod +x ~/bin/docker
mkdir -p ${HOME}/.docker/cli-plugins/ &&
curl -SL https://github.com/docker/compose/releases/download/v2.13.0/docker-compose-linux-x86_64 -o ${HOME}/.docker/cli-plugins/docker-compose && \
chmod +x ${HOME}/.docker/cli-plugins/docker-composePuis définir le point de connexion de Docker, enlever les clés publiques existantes et ajouter la nouvelle (dans des variables d'environement). Le script suivant fait tout cela.
. ./set-docker-env.shEn ajoutant la fonction suivante dans le .bashrc ou le .zshrc, la connexions vers le docker engine sera faite dans chaque shell en invoquant eval $(use-vagrant-docker).
use-vagrant-docker () ( VAGRANT_dockerNode1Path=`vagrant global-status | \
grep docker-node-1|\
grep "running"| \
cut -f 6 -d ' ' ` && \
[[ -f "$VAGRANT_dockerNode1Path/set-docker-env.sh" ]] && \
cd ${VAGRANT_dockerNode1Path}\
&& . ./set-docker-env.sh \
&& cd ~
) Il est alors possible d'utiliser les commandes docker depuis l'hôte et qu'elles s'éxecutent dans la VM :
mkdir -p data/my-web-site
echo "Hello Docker" > data/my-web-site/index.html
docker run \
--rm -\
p 8080:80 \
-v /vagrant/data/my-web-site:/usr/share/nginx/html nginxL'exemple suivant exécute le serveur Web Nginx dans un container de la VM. Le port 80 du container est associé au port 8080 de la VM, qui est à son tour associé au port de l'hôte (a priori 8080 aussi cf. Vagrantfile). Le répertoire courant du projet est monté dans le répertoire /vagrant de la VM. Donc le sous-répertoire data/my-web du projet est donc monté la VM puis dans le répertoire /usr/share/nginx/html du conteneur.
Le site web du répertoire du l'hôte data/my-web est donc accessible depuis l'hôte à l'adresse http://localhost:8080 via un serveur nginx exécuté dans un conteneur de la VM.