79 votes

Comment configurer la liaison entre le panneau conteneurs de façon à ce que le redémarrage de ne pas le casser?

J'ai quelques dockers conteneurs en cours d'exécution comme

  • Nginx
  • Web app 1
  • Web app 2
  • PostgreSQL

Depuis Nginx doivent se connecte un serveur d'applications web à l'intérieur de web app 1 et 2, et les applications web besoin de parler à postgresql, j'ai donc des liens comme ceci

  • Nginx --- lien ---> Web app 1
  • Nginx --- lien ---> Web app 2
  • Web app 1 --- lien ---> PostgreSQL
  • Web app 2 --- lien ---> PostgreSQL

Cela fonctionne assez bien au début, cependant, quand je développe une nouvelle version de web app 1 et web app 2, j'ai besoin de les remplacer. Ce que je fais est de supprimer les conteneurs d'applications web, le programme d'installation de nouveaux conteneurs et de les démarrer.

Pour les conteneurs d'applications web, l'adresse IP à première serait quelque chose comme

  • 172.17.0.2
  • 172.17.0.3

Et après je les remplacer, ils ont de nouvelles adresses IP maintenant

  • 172.17.0.5
  • 172.17.0.6

En ce moment, ceux qui sont exposés les variables d'environnement dans Nginx conteneur sont encore pointés du vieux adresses IP. Ici vient le problème, comment faire pour remplacer un conteneur sans rupture de lien entre les autres conteneurs? Le même problème peut aussi se produire à PostgreSQL, si je veux mettre à jour PostgreSQL version de l'image, j'ai certainement besoin de l'enlever et exécuter la nouvelle, mais là j'ai besoin de reconstruire l'ensemble du conteneur graphique, ce n'est pas une bonne idée de la vie réelle de fonctionnement du serveur.

53voto

Abel Muiño Points 1416

L'effet de l' --link est statique, il ne fonctionnera pas pour votre scénario (il n'y a actuellement pas de re-lier, même si vous pouvez supprimer les liens).

Nous avons été à l'aide de deux approches différentes à la dockerize.pour résoudre ce problème, sans liens ou des ambassadeurs (bien que vous pourriez ajouter des ambassadeurs de trop).

1) l'Utilisation de DNS dynamique

L'idée générale est que vous spécifiez un nom unique pour votre base de données (ou de tout autre service) et de mettre à jour une courte durée serveur DNS avec l'adresse IP actuelle que vous commencez et arrêtez de conteneurs.

Nous avons commencé avec SkyDock. Il fonctionne avec deux conteneurs docker, le serveur DNS et un moniteur qui maintient à jour automatiquement. Plus tard, nous avons déménagé à quelque chose de plus personnalisé à l'aide de Consul (également à l'aide d'un dockerized version: docker-consul).

Une évolution de cette (dont nous n'avons pas essayé) serait à l'installation etcd ou similaires, ainsi que l'utilisation de son API pour apprendre les adresses ip et les ports. Le logiciel devrait soutenir la reconfiguration dynamique.

2) Utilisez le panneau de pont ip

En exposant les ports à conteneurs, vous pouvez simplement lier à l' docker0 pont, qui a (ou peut avoir) une adresse bien connue.

Lors du remplacement d'un conteneur avec une nouvelle version, il suffit de faire le nouveau conteneur de publier le même port sur la même IP.

C'est plus simple mais aussi plus limitée. Vous pourriez avoir des conflits de port si vous exécutez un logiciel similaire (par exemple, les deux récipients ne pouvez pas écouter sur le port 3306 sur l' docker0 pont), etc... donc notre favori actuel est l'option 1.

10voto

Swen Thümmler Points 31

Vous pouvez utiliser un ambassadeur conteneur. Mais ne pas le lien entre l'ambassadeur conteneur à votre client, car cela crée le même problème que ci-dessus. Au lieu de cela, utilisez l'exposé port de l'ambassadeur du conteneur sur le panneau d'accueil (généralement 172.17.42.1). Exemple:

postgres volume:

$ docker run --name PGDATA -v /data/pgdata/data:/data -v /data/pgdata/log:/var/log/postgresql phusion/baseimage:0.9.10 true

postgres-conteneur:

$ docker run -d --name postgres --volumes-from PGDATA -e USER=postgres -e PASS='postgres' paintedfox/postgresql

ambassadeur-conteneur pour postgres:

$ docker run -d --name pg_ambassador --link postgres:postgres -p 5432:5432 ctlc/ambassador

Maintenant, vous pouvez commencer à un client postgresql conteneur sans la lier à l'ambassadeur de conteneurs et d'accéder à postgresql sur la passerelle de l'hôte (généralement 172.17.42.1):

$ docker run --rm -t -i paintedfox/postgresql /bin/bash
root@b94251eac8be:/# PGHOST=$(netstat -nr | grep '^0\.0\.0\.0 ' | awk '{print $2}')
root@b94251eac8be:/# echo $PGHOST
172.17.42.1
root@b94251eac8be:/#
root@b94251eac8be:/# psql -h $PGHOST --user postgres
Password for user postgres: 
psql (9.3.4)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

postgres=#
postgres=# select 6*7 as answer;
 answer 
--------
     42
(1 row)

bpostgres=# 

Maintenant, vous pouvez redémarrer l'ambassadeur conteneur sans avoir à redémarrer le client.

1voto

user3757286 Points 21

avec OpenSVC approche, vous pouvez contourner ce problème en :

  • l'utilisation d'un service avec sa propre adresse ip/dns (nom de l'un de vos utilisateurs finaux pourront se connecter)
  • dire docker pour exposer les ports de cette adresse ip spécifique ("--ip" docker option)
  • configurer vos applications pour se connecter à l'adresse ip de service

chaque fois que vous remplacez un conteneur, vous êtes sûr qu'il va se connecter à l'adresse ip correcte.

Tutoriel ici => Panneau Multi Conteneurs avec OpenSVC

ne manquez pas le "orchestration complexe" à la fin de tuto, qui peut vous aider à démarrer/arrêter des conteneurs dans le bon ordre (1 postgresql sous-ensemble + 1 webapp sous-ensemble + 1 nginx sous-ensemble)

le principal inconvénient est que vous exposez webapp et PostgreSQL ports à l'adresse publique, et en fait, que la nginx port tcp doivent être exposés en public.

1voto

Gekkie Points 588

Vous pouvez également essayer de l'ambassadeur de la méthode d'avoir un contenant intermédiaire juste pour garder le lien intact... (voir https://docs.docker.com/articles/ambassador_pattern_linking/ ) pour plus d'info

0voto

ivant Points 2120

Vous pouvez lier les ports de connexion de vos images et de ports fixes sur l'hôte et de configurer les services pour les utiliser à la place.

Cela a ses inconvénients, mais il pourrait fonctionner dans votre cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X