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:
- Erstellen Sie ein Docker-Netzwerk
- Geben Sie Ihren Containern Namen
- 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 .