Varje behållare har sin egen lokala värd
Varje tjänst körs i sin egen container. Ur Ubuntu-behållarens perspektiv lyssnar inte redis på localhost.
Använd Docker-nätverk
För att få dina containrar att kommunicera bör de vara på samma Docker-nätverk. Detta består av tre steg:
- Skapa ett Docker-nätverk
- Ge dina behållare namn
- Koppla dina behållare till nätverket du skapade
När detta är gjort kan behållarna prata med varandra med sina namn som om de vore värdnamn.
Det finns mer än ett sätt att flå den här katten... Jag kommer att titta på två i det här svaret, men det finns förmodligen några andra sätt att göra det på som jag inte är bekant med (som att använda Kubernetes eller Swarm, till exempel).
Gör det för hand
Du kan skapa ett nätverk för den här applikationen med docker network
kommandon.
# Show the current list of networks
docker network ls
# Create a network for your app
docker network create my_redis_app
När du kör redis-behållaren, se till att den har ett namn och är på det här nätverket. Du kan exponera portarna externt (för macOS) om du vill (med -p
), men det är inte nödvändigt bara för andra behållare att prata med redis.
docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
Kör nu din Ubuntu-behållare. Du kan också namnge den om du vill, men jag tänker inte bry mig i det här exemplet eftersom den här inte kör några tjänster.
docker run -it --network my_redis_app ubuntu bash
Nu från insidan av Ubuntu-behållaren bör du kunna nå redis med namnet redis_server
, som om det vore ett DNS-namn.
Gör det med Compose
Jag tenderar att bygga sådana här inställningar med Compose, eftersom det är lättare att skriva in det i en YAML-fil (IMO). Här är ett exempel på ovanstående, omskrivet i 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
Med detta på plats kan du köra docker-compose up -d redis
och ha din redis-tjänst online med ett specifikt Docker-nätverk. Compose skapar nätverket åt dig, om det inte redan finns.
Det är mindre vettigt att köra Ubuntu-behållaren på det sättet... den är interaktiv, förstås. Men jag antar att när du väl har startat om kommer du att lägga till någon form av applikationsbehållare, och kanske en webbproxy som nginx... lägg bara de andra under services
också, och du kan hantera dem alla tillsammans.
Sedan ubuntu
är interaktiv kan du köra den interaktivt:
# without -d, container is run interactively
docker-compose run ubuntu bash
Och nu i Ubuntu bör du kunna ansluta till redis med dess namn, som i det här exemplet helt enkelt är redis
.