Questo post illustra tre metodi per collegare i contenitori Docker.
Esponi le porte e il collegamento delle porte
Esponi le porte
Questo metodo viene utilizzato all'interno della stessa rete o dell'host Docker. I container sulla stessa rete possono comunicare tra loro sulle porte esposte e tu puoi esporre le porte con uno dei metodi seguenti.
– Inserisci EXPOSE 80 (o qualsiasi porta che desideri) nel tuo Dockerfile che dirà a Docker che il servizio del tuo container può essere connesso alla porta 80.
– Esponi una porta usando '–expose [port number]' dal contenitore docker per 'run –expose [port number]':
# docker run --expose=[port number] test
Collegamento alla porta
Questo metodo viene utilizzato all'esterno della stessa rete. Per consentire la comunicazione tramite le porte definite ai container al di fuori della stessa rete, è necessario pubblicare le porte utilizzando il flag -p su docker run per pubblicare e mappare una o più porte, oppure il flag -P per pubblicare tutte le porte esposte e mappare loro verso porti di ordine superiore. Puoi eseguire il porting delle porte in uno dei seguenti modi:
-Esponi una porta tramite Dockerfile di –espone e pubblicalo con la -P bandiera. Associa la porta esposta all'host Docker su una porta casuale.
-Esponi una porta tramite Dockerfile di –espone e pubblicalo con il -p 21:21 flag, questo legherà la porta di esposizione all'host Docker su una determinata porta 21 con il guest 21.
– Associa la porta tramite il comando di esecuzione del contenitore Docker:
# docker run -p [port number on docker host]:[port number on container]/tcp -p [port number on docker host]:[port number on container]/udp test
Esempio:
# docker run -p 80:80/tcp -p 500:500/udp test
Socket di dominio Unix all'interno di un singolo host
Per comunicare tra container all'interno di un singolo host, puoi utilizzare i meccanismi IPC su Linux utilizzando lo stesso socket. Avvia le due finestre mobili dall'host della finestra mobile condividendo un volume che dovrebbe essere creato nella macchina host:
# docker run -d -it --name dvc1 -v /var/tmp:/host oraclelinux:7 /bin/bash # docker run -d -it --name dvc2 -v /var/tmp:/host oraclelinux:7 /bin/bash
Dopo il comando precedente, i container dvc1 e dvc2 possono utilizzare socket come /var/tmp/SocketX all'interconnessione.
Utilizza il meccanismo di collegamento Docker per impostare un collegamento tra i container
Docker può creare un tunnel tra due contenitori usando le variabili di ambiente per passare le informazioni dal contenitore padre al contenitore figlio. Per creare un collegamento, utilizzi il –link bandiera:
# docker run -itd --name=[child container] --link [parent container] [child container image] /bin/bash
Esempio:
-Controlla la rete del contenitore principale:
# docker ps|grep dvc 7d5ad19de678 j_web:v1 "/bin/sh -c '/usr/bi…" 2 days ago Up 5 hours dvc1
# docker exec -it dvc1 /bin/bash # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:04 inet addr:172.17.0.4 Bcast:172.17.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
-Collega i due nuovi contenitori con il contenitore padre:
# docker run -it --name dvc1_dup1 --rm --link dvc1 j_web:v1 /bin/bash
-Ispeziona il contenitore collegato:
# docker inspect -f "{{ .HostConfig.Links }}" dvc1_dup1 [/dvc1:/dvc1_dup1/dvc1]
-Controlla il file host del nuovo contenitore, contiene le informazioni del contenitore padre:
# docker exec -it dvc1_dup1 /bin/bash
[root@b56d465976bc /]# cat /etc/hosts 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.4 dvc1 7d5ad19de678 172.17.0.5 b56d465976bc [root@b56d465976bc /]#Avviso :il flag –link è una caratteristica legacy di Docker. Potrebbe eventualmente essere rimosso. A meno che tu non debba assolutamente continuare a usarlo, ti consigliamo di utilizzare reti definite dall'utente per facilitare la comunicazione tra due contenitori invece di usare –link. Una funzionalità che le reti definite dall'utente non supportano e che puoi fare con –link è la condivisione delle variabili di ambiente tra i contenitori. Tuttavia, puoi utilizzare altri meccanismi come i volumi per condividere le variabili di ambiente tra i contenitori in modo più controllato.