Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Kommunikation zwischen zwei Docker-Containern unter macOS 10.12

Jeder Container hat seinen eigenen Localhost

Jeder Dienst wird in einem eigenen Container ausgeführt. Aus der Perspektive des Ubuntu-Containers lauscht redis nicht auf localhost.

Verwenden Sie Docker-Netzwerke

Damit Ihre Container kommunizieren können, sollten sie sich im selben Docker-Netzwerk befinden. Dies besteht aus drei Schritten:

  1. Erstellen Sie ein Docker-Netzwerk
  2. Geben Sie Ihren Containern Namen
  3. Hängen Sie Ihre Container an das von Ihnen erstellte Netzwerk an

Wenn dies erledigt ist, können die Container über ihre Namen miteinander kommunizieren, als wären sie Hostnamen.

Es gibt mehr als eine Möglichkeit, diese Katze zu häuten ... Ich werde mir in dieser Antwort zwei ansehen, aber es gibt wahrscheinlich ein paar andere Möglichkeiten, dies zu tun, mit denen ich nicht vertraut bin (wie zum Beispiel die Verwendung von Kubernetes oder Swarm).

Handgemacht

Sie können mit docker network ein Netzwerk für diese Anwendung erstellen Befehle.

# Show the current list of networks
docker network ls

# Create a network for your app
docker network create my_redis_app

Stellen Sie beim Ausführen des Redis-Containers sicher, dass er einen Namen hat und sich in diesem Netzwerk befindet. Sie können die Ports extern (für macOS) verfügbar machen, wenn Sie möchten (mit -p ), aber das ist nicht notwendig, nur damit andere Container mit redis kommunizieren können.

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

Führen Sie nun Ihren Ubuntu-Container aus. Sie können es auch benennen, wenn Sie möchten, aber ich werde mich in diesem Beispiel nicht darum kümmern, da dieses keine Dienste ausführt.

docker run -it --network my_redis_app ubuntu bash

Jetzt sollten Sie aus dem Ubuntu-Container heraus redis mit dem Namen redis_server erreichen können , als wäre es ein DNS-Name.

Mit Compose

Ich neige dazu, solche Setups mit Compose zu erstellen, da es einfacher ist, sie in eine YAML-Datei (IMO) zu schreiben. Hier ist ein Beispiel für das Obige, neu geschrieben in docker-compose.yml-Form:

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

Wenn dies vorhanden ist, können Sie docker-compose up -d redis ausführen und Ihren Redis-Dienst über ein bestimmtes Docker-Netzwerk online haben. Compose erstellt das Netzwerk für Sie, falls es noch nicht existiert.

Es macht weniger Sinn, den Ubuntu-Container auf diese Weise auszuführen ... er ist natürlich interaktiv. Aber ich nehme an, sobald Sie Redis am Laufen haben, werden Sie eine Art Anwendungscontainer und vielleicht einen Web-Proxy wie nginx hinzufügen ... fügen Sie die anderen einfach unter services ein auch, und Sie können sie alle zusammen verwalten.

Seit ubuntu interaktiv ist, können Sie es interaktiv ausführen:

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

Und jetzt sollten Sie in Ubuntu in der Lage sein, sich mit redis über seinen Namen zu verbinden, der in diesem Beispiel einfach redis ist .