Redis
 sql >> Database >  >> NoSQL >> Redis

Comunicazione tra due contenitori Docker su macOS 10.12

Ogni container ha il proprio localhost

Ogni servizio viene eseguito nel proprio contenitore. Dal punto di vista del contenitore Ubuntu, redis non è in ascolto su localhost.

Utilizza le reti Docker

Per far comunicare i tuoi container, dovrebbero trovarsi sulla stessa rete Docker. Si compone di tre passaggi:

  1. Crea una rete Docker
  2. Dai i nomi ai tuoi contenitori
  3. Collega i tuoi container alla rete che hai creato

Fatto ciò, i container possono parlare tra loro usando i loro nomi come se fossero nomi host.

C'è più di un modo per scuoiare questo gatto... Ne guarderò due in questa risposta, ma probabilmente ci sono altri modi per farlo che non conosco (come usare Kubernetes o Swarm, per esempio).

Fallo a mano

Puoi creare una rete per questa applicazione utilizzando docker network comandi.

# Show the current list of networks
docker network ls

# Create a network for your app
docker network create my_redis_app

Quando esegui il contenitore redis, assicurati che abbia un nome e sia su questa rete. Puoi esporre le porte esternamente (su macOS) se lo desideri (usando -p ), ma non è necessario solo per altri contenitori per parlare con redis.

docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>

Ora esegui il tuo contenitore Ubuntu. Puoi anche nominarlo se lo desideri, ma non mi preoccuperò in questo esempio perché questo non esegue alcun servizio.

docker run -it --network my_redis_app ubuntu bash

Ora dall'interno del contenitore Ubuntu, dovresti essere in grado di raggiungere redis usando il nome redis_server , come se fosse un nome DNS.

Farlo utilizzando Componi

Tendo a creare configurazioni come questa usando Compose, perché è più facile scriverlo in un file YAML (IMO). Ecco un esempio di quanto sopra, riscritto in formato docker-compose.yml:

version: '2'
services:
  redis:
    image: <IMAGE ID>
    networks:
      - my_redis_app
    ports: 6379:6379
  ubuntu:
    image: ubuntu:latest
    networks:
      - my_redis_app
networks:
  my_redis_app:
    driver: bridge

Con questo in atto, puoi eseguire docker-compose up -d redis e fai in modo che il tuo servizio redis sia online utilizzando una rete Docker specifica. Compose creerà la rete per te, se non esiste già.

Ha meno senso eseguire il container Ubuntu in questo modo... è interattivo, ovviamente. Ma presumo che una volta che hai ridistribuito, aggiungerai una sorta di contenitore di applicazioni e forse un proxy web come nginx... metti gli altri sotto services e puoi gestirli tutti insieme.

Da ubuntu è interattivo, puoi eseguirlo in modo interattivo:

# without -d, container is run interactively
docker-compose run ubuntu bash

E ora in Ubuntu dovresti essere in grado di connetterti a redis usando il suo nome, che in questo esempio è semplicemente redis .