Hver container har sin egen lokale vært
Hver service kører i sin egen container. Set fra Ubuntu-beholderens perspektiv lytter redis ikke på localhost.
Brug Docker-netværk
For at få dine containere til at kommunikere, skal de være på det samme Docker-netværk. Dette består af tre trin:
- Opret et Docker-netværk
- Giv dine containere navne
- Vedhæft dine containere til det netværk, du har oprettet
Når dette er gjort, kan containerne tale med hinanden ved at bruge deres navne, som om de var værtsnavne.
Der er mere end én måde at flå denne kat på... Jeg vil se på to i dette svar, men der er sikkert et par andre måder at gøre det på, som jeg ikke er bekendt med (som f.eks. at bruge Kubernetes eller Swarm).
Gør det i hånden
Du kan oprette et netværk til denne applikation ved hjælp af docker network
kommandoer.
# 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ører redis-beholderen, skal du sørge for, at den har et navn og er på dette netværk. Du kan eksponere portene eksternt (til macOS), hvis du vil (ved hjælp af -p
), men det er ikke nødvendigt kun for andre containere at tale med redis.
docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
Kør nu din Ubuntu-beholder. Du kan også navngive det, hvis du vil, men jeg gider ikke i dette eksempel, fordi denne ikke kører nogen tjenester.
docker run -it --network my_redis_app ubuntu bash
Nu inde fra Ubuntu-beholderen burde du være i stand til at nå redis ved at bruge navnet redis_server
, som om det var et DNS-navn.
Gør det med Compose
Jeg har en tendens til at bygge opsætninger som denne ved hjælp af Compose, fordi det er nemmere at skrive det ind i en YAML-fil (IMO). Her er et eksempel på ovenstående, omskrevet 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 dette på plads kan du køre docker-compose up -d redis
og få din redis-tjeneste online ved hjælp af et specifikt Docker-netværk. Compose vil oprette netværket for dig, hvis det ikke allerede eksisterer.
Det giver mindre mening at køre Ubuntu-beholderen på den måde... den er selvfølgelig interaktiv. Men jeg går ud fra, at når du har genoptaget, vil du tilføje en form for applikationscontainer og måske en webproxy som nginx... bare læg de andre under services
også, og du kan administrere dem alle sammen.
Siden ubuntu
er interaktiv, kan du køre den interaktivt:
# without -d, container is run interactively
docker-compose run ubuntu bash
Og nu i Ubuntu burde du være i stand til at oprette forbindelse til redis ved hjælp af dets navn, som i dette eksempel blot er redis
.