Elke container heeft zijn eigen localhost
Elke service draait in zijn eigen container. Vanuit het perspectief van de Ubuntu-container luistert redis niet op localhost.
Gebruik Docker-netwerken
Om uw containers te laten communiceren, moeten ze zich op hetzelfde Docker-netwerk bevinden. Dit bestaat uit drie stappen:
- Maak een Docker-netwerk
- Geef de namen van je containers
- Bevestig uw containers aan het netwerk dat u heeft gemaakt
Als dit klaar is, kunnen de containers met elkaar praten door hun naam te gebruiken alsof het hostnamen zijn.
Er is meer dan één manier om deze kat te villen... Ik zal er in dit antwoord twee bekijken, maar er zijn waarschijnlijk een paar andere manieren om dit te doen waar ik niet bekend mee ben (zoals het gebruik van Kubernetes of Swarm, bijvoorbeeld).
Met de hand doen
U kunt een netwerk voor deze applicatie maken met behulp van docker network
commando's.
# Show the current list of networks
docker network ls
# Create a network for your app
docker network create my_redis_app
Wanneer u de redis-container uitvoert, moet u ervoor zorgen dat deze een naam heeft en zich in dit netwerk bevindt. U kunt de poorten extern vrijgeven (voor macOS) als u dat wilt (met behulp van -p
), maar dat is niet alleen nodig om andere containers met redis te laten praten.
docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
Voer nu uw Ubuntu-container uit. Je kunt het ook een naam geven als je wilt, maar ik zal in dit voorbeeld niet de moeite nemen omdat deze geen services uitvoert.
docker run -it --network my_redis_app ubuntu bash
Nu zou je vanuit de Ubuntu-container in staat moeten zijn om redis te bereiken met de naam redis_server
, alsof het een DNS-naam is.
Doen met Compose
Ik heb de neiging om dergelijke setups te bouwen met Compose, omdat het gemakkelijker is om het in een YAML-bestand (IMO) te schrijven. Hier is een voorbeeld van het bovenstaande, herschreven in docker-compose.yml-vorm:
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
Als dit op zijn plaats is, kun je docker-compose up -d redis
. uitvoeren en laat uw redis-service online via een specifiek Docker-netwerk. Compose zal het netwerk voor je maken, als het nog niet bestaat.
Het heeft minder zin om de Ubuntu-container op die manier te gebruiken... het is natuurlijk interactief. Maar ik neem aan dat als je eenmaal opnieuw werkt, je een soort applicatiecontainer zult toevoegen, en misschien een webproxy zoals nginx... plaats de anderen gewoon onder services
ook, en u kunt ze allemaal samen beheren.
Sinds ubuntu
interactief is, kunt u het interactief uitvoeren:
# without -d, container is run interactively
docker-compose run ubuntu bash
En nu zou je in Ubuntu verbinding moeten kunnen maken met redis met behulp van zijn naam, die in dit voorbeeld eenvoudig redis
is .