У меня есть небольшой кластер в стойке с частной сетью в диапазоне 192.168.3.0/24. Я хотел бы, чтобы мои рабочие службы общались друг с другом через эту сеть, но не могу понять, как заставить докер это разрешить.
Моя идеальная конфигурация - это один общедоступный контейнер, который передает соединения работнику, который затем может взаимодействовать с различными службами в частной сети для выполнения своей работы.
eth0 -> load balancer --> 192.168.3.3:80 --> 192.168.3.5:1234 (db)
\-> 192.168.3.4:80 /
\> 192.168.3.5:80/
Если бы все рабочие были на одной машине, я мог бы сделать это с docker run --link ...
но поскольку они находятся на разных машинах, это не сработает.
Рабочие в приведенном выше примере запускаются с помощью команды, подобной этой:
docker run -d -p $PRIVATE_IPV4:80:80 myworker
и база данных запускалась так:
docker run -d -p $PRIVATE_IPV4:1234:1234 mydb
Из хозяин Я могу нормально разговаривать с каждым из контейнеров, но каждый контейнер не может маршрутизировать ни один другой контейнер. I.E. curl http://192.168.3.4
работает с хоста, но не с контейнера, запущенного на хосте.
Балансировщик нагрузки в данном случае - это nginx, который запускается следующим образом:
docker run -d -p $PUBLIC_IPV4:80:80 nginx
nginx.conf
upstream app {
server 192.168.3.3:80;
server 192.168.3.4:80;
server 192.168.3.5:80;
}
...
Похоже, это будет довольно стандартная конфигурация. Что я делаю не так?
В настоящее время Docker сам по себе не предоставляет сетевых возможностей для контейнеров. Ткать является одним из самых простых в использовании оверлейных решений SDN. Он работает в любом облаке и даже в нескольких облаках.
Я должен отрицать это, я один из инженеров Weave.
Вы можете попробовать реализовать свою архитектуру в диспетчере контейнеров, таком как Kubernetes, поверх CoreOS. Есть много гидов. Это отрывок из презентации на DockerCon https://www.brighttalk.com/webcast/11427/136165 об управлении кластером контейнеров.