2015-04-19 5 views
34

Hier ist mein Verständnis von Docker compose:Wie funktionieren Links und Skalierung in Docker zusammen?

  • Sie können „Skala“ ein Service in mehreren Containern auf einmal auszuführen.
  • Wenn Sie Service von A bis B Dienst verknüpfen, hat Service Ein Zugriff auf einen Container laufenden Dienst B.

Ist mein Verständnis richtig ist, und wenn ja, wo sich eine Verbindung herstellen, wenn es mehrere Container laufen die Bedienung?

Antwort

29

Zunächst würde ich klarstellen, dass standardmäßig, mit oder ohne Verknüpfung eines Containers mit anderen, alle Container Sichtbarkeit für andere Container haben, die auf demselben Host laufen (unter Verwendung der Container-IP). Sie können dieses Verhalten mithilfe des Flags icc=true im Docker-Dämon ändern.

In Bezug auf die Verknüpfungen mit docker-compose werden diese generiert, wenn der Container mit den Verknüpfungen erstellt wird. Lass es uns mit einem Beispiel sehen. Mit diesem Docker-compose.yml

web: 
    build: . 
    command: python app.py 
    ports: 
    - "5000:5000" 
    volumes: 
    - .:/code 
    links: 
    - redis 
redis: 
    image: redis 

Nach docker-compose up -d der web_1 Laufbehälter mit dem Behälter mit redis_1 verbunden:

 (...) 
     "Links": [ 
     "/compose_redis_1:/compose_web_1/compose_redis_1", 
     "/compose_redis_1:/compose_web_1/redis", 
     "/compose_redis_1:/compose_web_1/redis_1" 
    ], (...) 

Nun wollen wir den redis-Dienst docker-compose scale redis=2 skalieren. Nach dem Ausführen (und Erstellen eines neuen Containers redis_2), die Links in web_1 bleibt unverändert.

 (...) 
     "Links": [ 
     "/compose_redis_1:/compose_web_1/compose_redis_1", 
     "/compose_redis_1:/compose_web_1/redis", 
     "/compose_redis_1:/compose_web_1/redis_1" 
    ], (...) 

Es benötigt wird, zu stoppen, zu entfernen und web_1 führen diese Links erstellt, um zu sehen:

docker-compose stop web 
docker-compose rm web 
docker-compose run -d web 
docker inspect compose_web_run_2 
(...)  "Links": [ 
     "/compose_redis_1:/compose_web_run_2/compose_redis_1", 
     "/compose_redis_2:/compose_web_run_2/compose_redis_2", 
     "/compose_redis_1:/compose_web_run_2/redis", 
     "/compose_redis_1:/compose_web_run_2/redis_1", 
     "/compose_redis_2:/compose_web_run_2/redis_2" 
    ],(...) 

Und die /etc/hosts von web_1 Behälter:

172.17.0.24 7be2dabea910 
127.0.0.1 localhost 
::1 localhost ip6-localhost ip6-loopback 
fe00::0 ip6-localnet 
ff00::0 ip6-mcastprefix 
ff02::1 ip6-allnodes 
ff02::2 ip6-allrouters 
172.17.0.21 compose_redis_1 8a1297a5b3e4 
172.17.0.23 compose_redis_2 069dd46836aa 
172.17.0.21 redis 8a1297a5b3e4 compose_redis_1 
172.17.0.21 redis_1 8a1297a5b3e4 compose_redis_1 
172.17.0.23 redis_2 069dd46836aa compose_redis_2 

So die neue zu generieren Links, die Sie benötigen, um den Container zu stoppen, zu entfernen und erneut auszuführen.

+0

Wenn also Service A mit Service B verknüpft ist, hat Service A Zugriff auf ALLE Instanzen von Service B? – Gaelan

+0

Die Verwendung der Container-IPs hat immer Zugriff, aber wenn Sie den Zugriff wie bei '-Link' Option (d. H. Mit den Einträgen in/etc/hosts, globale Umgebungsvariablen ...) müssen Sie Service-A-Container neu erstellen. –

+1

Das ist nicht meine Frage. Ist Dienst A mit ALLEN Instanzen von Dienst B oder ONE-Instanz von Dienst B verknüpft? – Gaelan

Verwandte Themen