Każdy kontener ma swój własny host lokalny
Każda usługa działa we własnym kontenerze. Z perspektywy kontenera Ubuntu redis nie nasłuchuje na hoście lokalnym.
Użyj sieci Dockera
Aby kontenery mogły się komunikować, powinny znajdować się w tej samej sieci Docker. Składa się z trzech kroków:
- Utwórz sieć Dockera
- Nadaj nazwy swoim kontenerom
- Dołącz swoje kontenery do utworzonej sieci
Po wykonaniu tej czynności kontenery mogą komunikować się ze sobą, używając swoich nazw, tak jakby były nazwami hostów.
Jest więcej niż jeden sposób na oskórowanie tego kota... W tej odpowiedzi przyjrzę się dwóm, ale jest prawdopodobnie kilka innych sposobów, których nie znam (na przykład użycie Kubernetes lub Swarm).
Robię to ręcznie
Możesz utworzyć sieć dla tej aplikacji za pomocą docker network
poleceń.
# Show the current list of networks
docker network ls
# Create a network for your app
docker network create my_redis_app
Po uruchomieniu kontenera redis upewnij się, że ma on nazwę i znajduje się w tej sieci. Możesz ujawnić porty zewnętrznie (dla macOS), jeśli chcesz (używając -p
), ale nie jest to konieczne tylko dla innych kontenerów, aby komunikować się z redis.
docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
Teraz uruchom kontener Ubuntu. Możesz go również nazwać, jeśli chcesz, ale nie będę się tym przejmował, ponieważ ten nie obsługuje żadnych usług.
docker run -it --network my_redis_app ubuntu bash
Teraz z wnętrza kontenera Ubuntu powinieneś być w stanie uzyskać dostęp do redis, używając nazwy redis_server
, jakby to była nazwa DNS.
Wykonywanie tego za pomocą tworzenia
Zwykle buduję takie konfiguracje za pomocą Compose, ponieważ łatwiej jest zapisać je w pliku YAML (IMO). Oto przykład powyższego, przepisany w formie 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
Mając to na miejscu, możesz uruchomić docker-compose up -d redis
i mieć usługę redis w trybie online za pomocą określonej sieci Docker. Compose utworzy dla Ciebie sieć, jeśli jeszcze nie istnieje.
Nie ma sensu uruchamiać kontenera Ubuntu w ten sposób... jest to oczywiście interaktywne. Ale zakładam, że po ponownym uruchomieniu dodasz jakiś kontener aplikacji i być może serwer proxy, taki jak nginx... po prostu umieść pozostałe w services
jak również i możesz nimi wszystkimi zarządzać razem.
Od ubuntu
jest interaktywny, możesz go uruchomić interaktywnie:
# without -d, container is run interactively
docker-compose run ubuntu bash
A teraz w Ubuntu powinieneś być w stanie połączyć się z redis przy użyciu jego nazwy, która w tym przykładzie to po prostu redis
.