Всеки контейнер има свой собствен локален хост
Всяка услуга работи в собствен контейнер. От гледна точка на контейнера Ubuntu, redis не слуша на localhost.
Използвайте Docker мрежи
За да накарате вашите контейнери да комуникират, те трябва да са в една и съща мрежа на Docker. Това се състои от три стъпки:
- Създайте мрежа на Docker
- Дайте имената на контейнерите си
- Прикачете вашите контейнери към мрежата, която сте създали
След това контейнерите могат да говорят помежду си, като използват имената си, сякаш са имена на хостове.
Има повече от един начин да одирате тази котка... Ще разгледам два в този отговор, но вероятно има няколко други начина да го направя, с които не съм запознат (като използването на Kubernetes или Swarm, например).
Правете го на ръка
Можете да създадете мрежа за това приложение с помощта на docker network
команди.
# Show the current list of networks
docker network ls
# Create a network for your app
docker network create my_redis_app
Когато стартирате контейнера redis, уверете се, че той има име и е в тази мрежа. Можете да изложите портовете външно (в macOS), ако искате (използвайки -p
), но това не е необходимо само за други контейнери, за да разговарят с redis.
docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
Сега стартирайте вашия Ubuntu контейнер. Можете също да го наименувате, ако желаете, но няма да се занимавам с този пример, защото този не изпълнява никакви услуги.
docker run -it --network my_redis_app ubuntu bash
Сега от вътрешността на контейнера на Ubuntu трябва да можете да достигнете до redis, използвайки името redis_server
, сякаш е DNS име.
Правете го с Compose
Склонен съм да създавам настройки като тази с помощта на Compose, защото е по-лесно да го запиша в YAML файл (IMO). Ето пример за горното, пренаписано във формата 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
С това на място можете да стартирате docker-compose up -d redis
и поддържайте услугата си Redis онлайн, като използвате конкретна мрежа на Docker. Compose ще създаде мрежата за вас, ако тя все още не съществува.
Няма смисъл да стартирате контейнера Ubuntu по този начин... той е интерактивен, разбира се. Но предполагам, че след като стартирате redis, ще добавите някакъв контейнер за приложения и може би уеб прокси като nginx... просто поставете другите под services
също и можете да ги управлявате заедно.
От ubuntu
е интерактивен, можете да го стартирате интерактивно:
# without -d, container is run interactively
docker-compose run ubuntu bash
И сега в Ubuntu трябва да можете да се свържете с redis, като използвате неговото име, което в този пример е просто redis
.