sql >> Database >  >> NoSQL >> Redis

Communicatie tussen twee Docker-containers op macOS 10.12

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:

  1. Maak een Docker-netwerk
  2. Geef de namen van je containers
  3. 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 .




  1. Lijst met geneste sleutels opnieuw weergeven

  2. MongoDB ontspant meerdere arrays

  3. Hoe maak je een gedistribueerd slot aan met Redis?

  4. Hoe kan ik alle sets in redis krijgen?