Každý kontejner má svého vlastního localhost
Každá služba běží ve svém vlastním kontejneru. Z pohledu kontejneru Ubuntu redis neposlouchá na localhost.
Používejte sítě Docker
Aby vaše kontejnery mohly komunikovat, měly by být ve stejné síti Docker. Skládá se ze tří kroků:
- Vytvořte síť Docker
- Pojmenujte své kontejnery
- Připojte své kontejnery k síti, kterou jste vytvořili
Díky tomu mohou kontejnery mezi sebou mluvit pomocí svých jmen, jako by to byly názvy hostitelů.
Existuje více než jeden způsob, jak stáhnout tuto kočku z kůže... V této odpovědi se podívám na dva, ale pravděpodobně existuje několik dalších způsobů, jak to udělat, které neznám (jako například použití Kubernetes nebo Swarm).
Udělejte to ručně
Pro tuto aplikaci můžete vytvořit síť pomocí docker network
příkazy.
# Show the current list of networks
docker network ls
# Create a network for your app
docker network create my_redis_app
Když spustíte kontejner redis, ujistěte se, že má název a je v této síti. Pokud chcete, můžete porty vystavit externě (pro macOS) (pomocí -p
), ale to není nutné pouze pro to, aby ostatní kontejnery mluvily s redis.
docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
Nyní spusťte svůj kontejner Ubuntu. Pokud chcete, můžete jej také pojmenovat, ale v tomto příkladu se nebudu obtěžovat, protože tento neprovozuje žádné služby.
docker run -it --network my_redis_app ubuntu bash
Nyní z kontejneru Ubuntu byste měli být schopni dosáhnout redis pomocí názvu redis_server
, jako by to byl název DNS.
Jak to udělat pomocí Compose
Mám tendenci vytvářet nastavení pomocí Compose, protože je snazší je zapsat do souboru YAML (IMO). Zde je příklad výše uvedeného, přepsaný ve formě 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
S tímto na místě můžete spustit docker-compose up -d redis
a mít svou službu redis online pomocí konkrétní sítě Docker. Compose vytvoří síť za vás, pokud ještě neexistuje.
Dává méně smysl spouštět kontejner Ubuntu tímto způsobem... je samozřejmě interaktivní. Ale předpokládám, že jakmile spustíte redis, přidáte nějaký aplikační kontejner a možná webový proxy, jako je nginx... ostatní umístěte do services
také a můžete je spravovat všechny společně.
Od ubuntu
je interaktivní, můžete jej spustit interaktivně:
# without -d, container is run interactively
docker-compose run ubuntu bash
A nyní v Ubuntu byste měli být schopni se připojit k redis pomocí jeho názvu, který je v tomto příkladu jednoduše redis
.