2 juillet 2014

Docker - Réseau et Partage de fichiers - Conteneur avec serveur OpenSSH

Nous allons voir comment paramétrer les connexions réseaux et les partages de fichiers entre les conteneurs Docker, la machine virtuelle Linux et la machine physique Windows.

Nous prenons comme exemple un conteneur disposant d'un serveur SSH pour pouvoir s'y connecter depuis la machine virtuelle et depuis Windows. Nous créerons également un répertoire partagé entre Windows et la machine virtuelle et aussi avec le conteneur, ce qui permet de modifier les fichiers du répertoire du conteneur depuis le répertoire de Windows.

Pré-requis

Il est nécessaire d'avoir lu les articles suivants :

Installation

Il faut installer Vagrant et VirtualBox en suivant l'article suivant :
Nous avons la configuration suivante entre la machine virtuelle Linux et la machine physique Windows :
  • Répertoires partagés :
    • Le répertoire vagrant-docker\data dans Windows est mappé sur le répertoire /data de la machine virtuelle ce qui permet d'éditer et de copier les fichiers depuis Windows
  • Connexions réseaux :
    • L'adresse IP de la VM est : 192.168.33.10 sur Windows

Créer une image Docker contenant un serveur SSH

Le serveur OpenSSH va nous permettre de se connecter en SSH sur le conteneur démarré.

Démarrer la VM et y accéder en SSH via Vagrant

  • Ouvrir un terminal de commandes
  • Tapper la commande suivante pour démarrer la VM via Vagrant :
  • vagrant up
  • Tapper la commande suivante pour se connecter en SSH sur la VM via Vagrant :
  • vagrant ssh
    • A la question 'passphrase', appuyer sur Entrée sans rien saisir
    • Saisir le mot de passe : vagrant
  • Une fois connecté en SSH sur la VM, passer en utilisateur root :
  • sudo su

Création de l'image de conteneur SSH

  • Créer un répertoire images/ssh dans le répertoire /data
  • mkdir /data/images
    mkdir /data/images/ssh
  • Créer le fichier Dockerfile dans le répertoire /data/images/ssh :
  • nano /data/images/ssh/Dockerfile
  • avec le contenu suivant :
  • Se placer dans le répertoire /data/images :
    cd /data/images
  • Lancer la commande de création de l'image ssh :
    docker build -t ssh ssh
  • Vous devez avoir obtenu dans la sortie console la ligne suivante :
  • Successfully built [identifiant]
    • , avec [identfiant] : l'identifiant de l'image qui vient d'être créée.
  • Tapper la commande suivante pour vérifier que l'image a bien été créée :
  • docker images
  • Cette commande retourne la liste des images qui doit contenir l'image ssh :
  • REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    ssh                 latest              [identifiant]        3 minutes ago       322.2 MB
  • Recopier le numéro d'identifiant situé à la place de [identifiant] de l'exemple ci-dessus

Démarrer le conteneur SSH

  • Démarrer le conteneur à partir de l'image ssh :
  • docker run -d -p 10022:22 -v /data/ssh:/data  [identifiant]
    • , avec les options :
      • -p 10022:22 : indique que le port 10022 de la machine physique est mappé sur le port 22 du conteneur
      • -v /data/ssh:/data : indique que le répertoire /data/ssh de la machine virtuelle est monté en tant que répertoire /data dans le conteneur.

  • Nous obtenons l'organisation suivante :
    • Répertoires partagés :
      • Le répertoire /data/ssh de la machine virtuelle est monté en tant que répertoire /data dans le conteneur.
      • Comme le répertoire /data de la machine virtuelle est lui-même partagé sur la machine physique Windows, le contenu du répertoire /data du conteneur est disponible dans le répertoire vagrant-docker\data\ssh dans Windows, ce qui permet de modifier et d'y copier des fichiers depuis Windows afin qu'ils soient directement disponibles dans le conteneur
      • Nous pouvons ainsi imaginer avoir un serveur Apache dans un conteneur avec le répertoire www contenant le contenu des sites Web qui soient directement acessibles sous Windows en développement et ainsi tester les impacts en temps réel sur un serveur Apache tournant sur Linux
    • Connexions réseaux :
      • Le port 10022 de la machine physique est mappé sur le port 22 du conteneur
      • Ainsi, nous pouvons ouvrir une connexion SSH directe entre Windows et le conteneur via le port 10022 de la machine virtuelle

  • Tapper la commande suivante pour voir que le conteneur est cours de fonctionnement :
  • docker ps
  • , ce qui donne :
    • PORTS : 0.0.0.0:10022->22/tcp : ceci indique que le port 10022 de la machine hôte est redirigé vers le port 22 du conteneur

Accéder au conteneur en SSH depuis la VM

  • Dans la VM, lancer la commande ifconfig pour récupérer l'adresse IP du conteneur :
  • $ ifconfig
    docker0   Link encap:Ethernet  HWaddr f6:ff:cc:dd:aa:a8
              inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
              inet6 addr: ff80::ee7d:eff:de44:eee0/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:21539 errors:0 dropped:0 overruns:0 frame:0
              TX packets:22509 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:943006 (943.0 KB)  TX bytes:41970172 (41.9 MB)
    • L'adresse IP du conteneur est dans cet exemple : 172.17.42.1
  • Lançons maintenant une connexion en SSH sur ce conteneur depuis la VM :
  • ssh docker@172.17.42.1 -p 10022
    • Le mot de passe est docker : c'est celui que nous avons défini pour l'utilisateur docker dans le fichier Vagrantfile
  • Une fois connecté en SSH, passer en root :
    su root
    • Le mot de passe est docker : c'est celui que nous avons défini pour l'utilisateur root dans le fichier Vagrantfile
  • Revenir en tant qu'utilisateur docker:
    exit

Partage de fichiers entre le conteneur, Windows et la VM

  • Nous allons maintenant ajouter un fichier dans le répertoire /data partagé avec la machine hôte :
  • echo "Hello" > /data/hello.txt
  • Le répertoire partagé vagrant-docker\data\ssh dans Windows contient maintenant ce fichier hello.txt
  • Modifier ce fichier via un éditeur dans Windows et enregistrer ce fichier
  • Dans la console SSH, lancer la commande suivante pour voir les modifications :
  • cat /data/hello.txt
    • => Nous voyons que le partage de fichiers fonctionne entre le conteneur, la machine virtuelle et la machine physique Windows
  • Nous nous déconnectons de la connexion SSH :
  • exit
  • Nous sommes revenu sur la console de la VM
  • Aller dans le répertoire /data/ssh qui contient maintenant le fichier hello.txt
  • Se déconnecter de la VM :
  • exit

Accès au conteneur en SSH depuis Windows

  • Nous sommes revenu sur le terminal de commandes de Windows
  • Tapper la commande suivante pour se connecter en SSH au conteneur depuis Windows :
  • ssh docker@192.168.33.10 -p 10022
    • Saisir le mot de passe docker
  • Nous sommes maintenant connecté en tant qu'utilisateur docker sur le conteneur via une connexion SSH ouverte depuis Windows vers la machine virtuelle
  • Tapper la commande suivante pour voir le contenu du fichier hello.txt :
  • cat /data/hello.txt
  • Quitter la connexion SSH :
  • exit

Arrêt et suppression du conteneur

  • Se reconnecter à la machine virtuelle :
  • vagrant ssh
    • A la question 'passphrase', appuer sur Entrée sans rien saisire
    • Le mot de passe est : vagrant
  • Passer en utilisateur root :
  • sudo su
  • Vérifier que le conteneur est en cours d'exécution :
  • docker ps
  • Arrêter le conteneur que nous venons de lancer
  • docker ps|sed "1 d"|grep "ssh:latest"|awk '{print $1}'|xargs docker stop
  • Vérifier que le conteneur a été supprimé :
  • docker ps -a
  • Supprimer le conteneur :
  • docker ps -a|sed "1 d"|grep "ssh:latest"|awk '{print $1}'|xargs docker rm

Conclusion

Nous venons de voir un exemple de conteneur dont le port est mappé sur un des ports de la machine hôte de Docker. Ainsi il est possible de communiquer avec ce conteneur depuis la machine virtuelle et depuis l'extérieur de la machine virtuelle.

Nous avons également vu le partage de fichiers entre le conteneur, la machine virtuelle Linux et la machine physique Windows.