Come collegare i servizi Docker tra gli host?


115

Docker consente ai server di più container di connettersi tra loro tramite collegamenti e rilevamento dei servizi . Tuttavia, da quello che posso vedere, questa scoperta del servizio è locale dell'host. Vorrei implementare un servizio che utilizzi altri servizi ospitati su una macchina diversa.

Ci sono stati diversi approcci per risolvere questo problema in Docker, come CoreOSjumpers , servizi host locali che essenzialmente fanno il proxy per l'altra macchina e un intero gruppo di progetti GitHub per la gestione delle distribuzioni Docker che sembrano aver tentato di supportare questo caso d'uso .

Dato il ritmo di sviluppo, è difficile seguire quali sono le migliori pratiche attuali. Quindi la mia domanda è essenzialmente:

  1. Qual è (se presente) il metodo predominante corrente per il collegamento tra host in Docker e
  2. Esistono piani per supportare questa funzionalità direttamente nel sistema Docker?

Risposte:


58

Aggiornare

Docker ha recentemente annunciato un nuovo strumento chiamato Swarm per l'orchestrazione Docker.

Swarm ti consente di "unirti" a più demoni mobili: prima crei uno sciame, avvii un gestore di sciami su una macchina e fai in modo che i demoni mobili si uniscano al gestore dello sciame usando l'identificatore dello sciame. Il client docker si connette al gestore swarm come se fosse un normale docker server.

Quando un container viene avviato con Swarm, viene automaticamente assegnato a un nodo libero che soddisfa tutti i vincoli definiti. L'esempio seguente è tratto dal post del blog:

$ docker run -d -P -e constraint:storage=ssd mysql

Uno dei vincoli supportati è "node"che ti consente di aggiungere un contenitore a un nome host specifico. Lo sciame risolve anche i collegamenti tra i nodi.

Durante i miei test ho avuto l'impressione che Swarm non funzioni ancora molto bene con i volumi in una posizione fissa (o almeno il processo di collegamento non è molto intuitivo), quindi questo è qualcosa da tenere a mente.

Swarm è ora in fase beta.


Fino a poco tempo, l' Ambassador Pattern era l'unico approccio nativo di Docker alla scoperta del servizio di host remoto. Questo modello può ancora essere utilizzato e non richiede alcuna magia oltre al semplice Docker in quanto è costituito da uno o più contenitori aggiuntivi che agiscono come proxy.

Inoltre, ci sono diverse estensioni di terze parti per rendere compatibile con i cluster Docker. Le soluzioni di terze parti includono:


2
Quindi fondamentalmente non c'è ancora modo di collegare i container tra host che non coinvolgano il pattern ambasador o bypassando docker e parlando direttamente con lxc?
user3012759

@ user3012759 Ambassador Pattern è l'unico modo nativo stabilito, ma Swarm (in alpha) è un altro modo nativo che funziona sostituendo lo scheduler Docker. Scusa per la risposta in ritardo.
lyschoening

SkyDock non include (ancora: 03/2015) il supporto multi-host . Registrator (un progetto semplice che può funzionare con SkyDNS) sì, ma la configurazione è più manuale (i servizi devono avere le porte mappate sulle porte host).
turtlemonvh

6
La mia indagine superficiale sullo swarm suggerisce che si concentra sulla gestione dei cluster e non sulla connettività tra host. Questa lacuna è chiaramente indicata dalla demo di Docker youtube.com/watch?v=M4PFY6RZQHQ&t=3m37s
Bruno Bronosky

1
@lyschoening Docker ha annunciato una rete multi host nativa che potresti voler aggiornare la tua risposta
Thomasleveil,

15

AGGIORNAMENTO 3

Libswarm è stato rinominato swarm ed è ora un'applicazione separata.

Ecco la demo della pagina GitHub da utilizzare come punto di partenza:

# create a cluster
$ swarm create
6856663cdefdec325839a4b7e1de38e8

# on each of your nodes, start the swarm agent
#  <node_ip> doesn't have to be public (eg. 192.168.0.X),
#  as long as the other nodes can reach it, it is fine.
$ swarm join --token=6856663cdefdec325839a4b7e1de38e8 --addr=<node_ip:2375>

# start the manager on any machine or your laptop
$ swarm manage --token=6856663cdefdec325839a4b7e1de38e8 --addr=<swarm_ip:swarm_port>

# use the regular docker cli
$ docker -H <swarm_ip:swarm_port> info
$ docker -H <swarm_ip:swarm_port> run ... 
$ docker -H <swarm_ip:swarm_port> ps 
$ docker -H <swarm_ip:swarm_port> logs ...
...

# list nodes in your cluster
$ swarm list --token=6856663cdefdec325839a4b7e1de38e8
http://<node_ip:2375>

AGGIORNAMENTO 2

L'approccio ufficiale è ora quello di utilizzare libswarm, vedere una demo qui

AGGIORNARE

C'è una buona idea per la comunicazione degli host openvswitch in docker usando lo stesso approccio.

Per consentire la scoperta dei servizi esiste un approccio interessante basato sul DNS chiamato skydock .

C'è anche uno screencast .


Anche questo è un bell'articolo che usa gli stessi pezzi del puzzle ma aggiunge anche vlan in cima:

http://fbevmware.blogspot.it/2013/12/coupling-docker-and-open-vswitch.html

Il patching non ha nulla a che fare con la robustezza della soluzione. Docker è in realtà solo una sorta di DSL sui contenitori Linux ed entrambe le soluzioni in questi articoli ignorano semplicemente alcune impostazioni automatiche di Docker e ripiegano direttamente sui contenitori Linux.

Quindi puoi utilizzare le soluzioni in sicurezza e aspettare di poterlo fare in modo più semplice una volta che Docker lo implementerà.


2
Non c'è stata molta attività in libswarm ultimamente. Mi chiedo se la squadra portuale si stia muovendo in un'altra direzione?
Raman

12

Weave è una nuova tecnologia di rete virtuale Docker che funge da switch ethernet virtuale su TCP / UDP: tutto ciò di cui hai bisogno è un container Docker che esegue Weave sul tuo host.

Ciò che è interessante qui è

  • Invece dei collegamenti, usa IP / nomi host statici nella tua rete virtuale
  • Gli host non necessitano di una connettività completa, viene creata una mesh in base ai peer disponibili e i pacchetti verranno instradati multi-hop dove devono andare

Questo porta a scenari interessanti come

  • Crea una rete virtuale attraverso la WAN, nessuno dei contenitori Docker saprà o si preoccuperà della rete effettiva in cui si trovano
  • Sposta i tuoi contenitori su diversi host docker fisici, Weave rileverà il peer di conseguenza

Ad esempio, c'è una guida di esempio su come creare un cluster Cassandra multi-nodo sul tuo laptop e alcuni host cloud (EC2) con due comandi per host. Ho lanciato un cluster CoreOS con AWS CloudFormation, ho installato la trama su ogni in / home / core, più il mio portatile vagabondo Docker VM, e ho ottenuto un cluster in meno di un'ora. Il mio laptop è protetto da firewall, ma Weave sembrava essere d'accordo, si connette solo ai suoi colleghi EC2.


Da quello che ho capito, weave è un overlay di rete che funziona all'interno di container per la connettività dei servizi, mentre swarm è una tecnologia di clustering che estende la CLI docker per l'orchestrazione dell'infrastruttura. La connettività Infra deve essere eseguita al di fuori dello swarm (ad es. Utilizzando normali interruttori) e l'orchestrazione del servizio al di fuori di weave (utilizzando ad es. Mesos / Kubernetes). Questo corrisponde alla tua idea di come funziona?
Henrik

Ecco come lo vedrei: docker compose riguarda il collegamento e l'orchestrazione di container, docker swarm riguarda l'esecuzione di docker su molti host docker, socketplane (ora di proprietà di docker) e weave sono entrambe reti overlay. Socketplane è basato su openvswitch che è comunemente usato per gli overlay nelle VM (es. Openstack); Weave d'altra parte è solo docker. di tutti questi, Mesos / Kubernetes / Lattice sostituiscono docker swarm con esperienze utente e livelli di scalabilità leggermente diversi rispetto alla CLI docker.
Stuart Charlton

7

Aggiornare

Docker 1.12 contiene la cosiddetta modalità swarm e aggiunge anche serviceun'astrazione. Probabilmente non sono abbastanza maturi per ogni caso d'uso, ma ti consiglio di tenerli sotto osservazione. La modalità swarm aiuta almeno in una configurazione multi-host, il che non rende necessariamente il collegamento più semplice. Il server DNS interno a Docker (dalla 1.11) dovrebbe aiutarti ad accedere ai nomi dei contenitori, se sono ben noti, il che significa che i nomi generati in un contesto Swarm non saranno così facili da indirizzare.


Con la versione Docker 1.9 sarai integrato in una rete multi host . Forniscono anche uno script di esempio per eseguire facilmente il provisioning di un cluster funzionante.

Avrai bisogno di un negozio K / V (ad esempio Consul) che permetta di condividere lo stato tra i diversi motori Docker su ogni host. Ogni motore Docker deve essere configurato con quel negozio K / V e puoi quindi utilizzare Swarm per connettere i tuoi host.

Quindi crei una nuova rete overlay come questa:

$ docker network create --driver overlay my-network

I contenitori possono ora essere eseguiti con il nome della rete come parametro di esecuzione:

$ docker run -itd --net=my-network busybox

Possono anche essere collegati a una rete quando sono già in esecuzione:

$ docker network connect my-network my-container

Maggiori dettagli sono disponibili nella documentazione .


6

Il seguente articolo descrive bene come connettere i contenitori Docker su più host: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/


1
Questa è davvero una bella soluzione; Anch'io l'ho visto. Quello che mi preoccupa è che l'articolo è stato pubblicato solo ieri e che richiede una patch Docker. (Dato quanto recentemente è stato pubblicato, aspetterei un po 'per vedere se uniscono quella patch in Docker).
lyschoening

Docker è in una fase di sviluppo iniziale, forse non tutti i requisiti sono ancora chiari e i requisiti definiti non sono tutti implementati. Quindi patch necessario.
paweloque

2
Questa è una non risposta. Copia la risposta dall'articolo collegato. Questo è lo standard SO.
Bruno Bronosky

6

È possibile collegare più subnet Docker insieme utilizzando Open vSwitch o Tinc. Ho preparato Gist per mostrare come farlo:

Il vantaggio che vedo utilizzando questa soluzione al posto --linkdell'opzione e del pattern ambassador è che lo trovo più trasparente: non è necessario disporre di contenitori aggiuntivi e, cosa più importante, non è necessario esporre le porte sull'host. In realtà penso --linkall'opzione di essere un hack temporaneo prima che Docker riceva una storia più carina sulle configurazioni multi-host (o multi-daemon).

Nota: so che c'è un'altra risposta che punta al mio primo Gist, ma non ho abbastanza karma per modificare o commentare quella risposta.


Come faresti il ​​rilevamento del servizio? Supponiamo che se ho Redis su una macchina e un'applicazione client su un'altra macchina, in che modo l'applicazione client otterrebbe l'IP del servizio Redis?
lyschoening

Allo stesso modo lo faresti su un singolo host: fornendoti l'IP / la porta ai servizi appena avviati, o usando un archivio chiave / valore (es. Etcd) o usando un DNS che i servizi possono interrogare. Mi piace usare il DNS perché molti servizi esistenti possono usarlo senza modifiche.
noteed

1

Come accennato in precedenza, Weave è sicuramente una soluzione praticabile per collegare i container Docker tra gli host. Sulla base della mia esperienza con esso, è abbastanza semplice impostarlo. Ora ha anche un servizio DNS che puoi indirizzare ai contenitori tramite i suoi nomi DNS.

D'altra parte, c'è Flannel di CoreOS e Opencontrail di Juniper per il cablaggio dei container attraverso gli host.


1

Sembra che Docker Swarm 1.14ti permetta di:

  • Assing hostname to container, usando --hostnametag, ma non sono stato in grado di farlo funzionare, i container non sono in grado di eseguire il ping a vicenda tramite nomi host assegnati.

  • assegnazione di servizi alla macchina utilizzando --constraint 'node.hostname == <host>'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.