twwlf
будут вопросы по существу – не стесняйся спрашивать
Anonymous
twwlf
звучит как "со школы балуюсь наркотой, я почти что дипломированный химик"
Evgenii
Anonymous
Такое чувство, что я на лор попал...
twwlf
ну, свой регистри поднять недолго
twwlf
внезапно, прям в докере
Anonymous
Та знаю, точку кипения ещё не достиг.
Anonymous
Ладно я полетел до дома.
Anonymous
Aleksandr
Evgenii
Evgenii
Всем привет,
Короткая версия вопроса:
Как сделать так, чтобы 2 контейнера общались между собой через тот же IP адрес и Порт, что и внешний клиент на другой машине.
те из container1 по 10.0.7.2:9042 я попадал в container2 (оба на host1)
и с host2 по 10.0.7.2:9042 я попадал в container2 (host1)
Зачем:
1. поднимаю Cassandra-кластер в докере и столкнулся с проблемой при подключении к ней внешнего клиента (на другой машине и НЕ в докере, эти условия поменять нет возможности)
2. У cassandra есть listen address, по умолчанию это 172.18.0.2 и 172.18.0.3(из compose) BROADCAST_ADDRESS - это тот ip по которому к ноде надо подключаться, те по-умолчанию такой же, на котором она слушается. CASSANDRA_SEEDS - то, к кому подключаемся, тут тоже используем 172 сеть
Чтобы подключиться из вне (см пункт 1) , поднимаем интерфейсы дополнительные (хочется использовать одинаковые порты) и маппим порты 172.18.0.2:9042 -> 10.0.7.2:9042, 172.18.0.3:9042 -> 10.0.7.3:9042
Пока всё кажется логичным, всё работает.
НО, когда подключается клиент к скажем к 10.0.7.2:9042, cassandra ему отвечает что есть ещё нода по адресу 172.18.0.3, клиент пытается туда тоже сходить и у него, разумеется, не получается.
Заставить говорить Cassandra что сосед это не 172.18.0.3, а 10.0.7.3 можно только используя его в конфигурации, но, тогда вообще ничего не заработает, потому что ИЗ node1 по адресу 10.0.7.3 в node2 НЕ попасть.
Как разрешить такой тупик?
Я попробовал создать network в докере такой же как подняты интерфейсы, типо поднимаем в линуксе
auto eth1:2
iface eth1:2 inet static
address 10.0.7.2
netmask 255.255.248.0
и в докере
networks:
cluster_net:
driver: bridge
enable_ipv6: false
ipam:
driver: default
config:
- subnet: 10.0.7.0/24
node1:
image: cassandra:3.10
networks:
cluster_net:
ipv4_address: 10.0.7.2
Nklya
Evgenii
Evgenii
twwlf
docker network
twwlf
так и гуглить, ну
twwlf
https://docs.docker.com/engine/userguide/networking/
twwlf
сначала читаем документацию, потом задаём глупые вопросы (если остались)
Evgenii
может быть существует кейс чисто на iptables, может быть можно использовать другой драйвер, возможно кто-то знает чисто кассандровский лайфхак, я пришёл в сообщество за советом к более опытным коллегам, а не за ссылкой на доку. Очевидно, что вы либо не обладаете должным опытом, либо не способны им делиться. Лично вас прошу на мои сообщения не отвечать
twwlf
используемый нетворкинг – это параметр запускаемого контейнера
twwlf
как его проставить – зависит от того, как вы запускаете контейнер
twwlf
руками через run, compose, ansible, anything
twwlf
спасибо
Artem
тебе ошибка все разжевала
Evgenii
тебе ошибка все разжевала
выше было предложение не создавать свой нетворк , правильно?
»и не выключить докеровскую вообще
Nklya
Artem
Evgenii
Evgenii
@Nklya @ArtG1uK я создаю сеть типа host и контейнерам указываю ipv4 статичные, правильно?
twwlf
скорее всего, указывать ip тебе не нужно
Evgenii
не могу пока что найти никакого примера вообще, в том числе в доке
twwlf
https://docs.docker.com/compose/compose-file/#network_mode
twwlf
тут упоминание есть
twwlf
HOST OR NONE
Use the host’s networking stack, or no networking. Equivalent to docker run —net=host or docker run —net=none. Only used if you use docker stack commands. If you use the docker-compose command, use network_mode instead.
Evgenii
да, несколько раз прочёл, ничего кроме
version: '2.1'
services:
node1:
image: cassandra:3.10
network_mode: host
ports:
- 10.0.7.2:9042:9042
придумать не смог, это так должно работать?
Evgenii
это весь docker-compose.yaml
Evgenii
сеть не создавал в докере, 10.0.7.2 просто один из интерфейсов хоста
twwlf
порты тебе вообще указывать не надо, это не сработает
twwlf
при использовании хостовой сетки внутренний процесс контейнера сам начнёт слушать порт
twwlf
согласно внутренним настройкам
twwlf
по идее, на всех хостовых интерфейсах
Evgenii
да, так оно и есть, сейчас есть подключение по любому ip адресу
Evgenii
но у меня же несколько нод с одинаковыми портами, как назначить каждой конкретный ip ?
twwlf
никак
twwlf
либо разные образы, либо контейнерная сетка и разные порты снаружи
Evgenii
twwlf
image
Evgenii
Не понял вообще как это поможет
twwlf
короче
twwlf
если ты хочешь в рамках одной тачки запустить два инстанса из одного и того же имаджа – юзай докеровую сетку
twwlf
с разными внешними портами
Evgenii
А я понял, типо в image сделать разные порты
twwlf
services:
node1:
image: cassandra:3.10
ports: 9042:9042
node2:
image: cassandra:3.10
ports: 9043:9042
Evgenii
Остаётся только вариант с другой машины попасть внутрь докерной сети?
twwlf
не понял задачу
Evgenii
Всем привет,
Короткая версия вопроса:
Как сделать так, чтобы 2 контейнера общались между собой через тот же IP адрес и Порт, что и внешний клиент на другой машине.
те из container1 по 10.0.7.2:9042 я попадал в container2 (оба на host1)
и с host2 по 10.0.7.2:9042 я попадал в container2 (host1)
Зачем:
1. поднимаю Cassandra-кластер в докере и столкнулся с проблемой при подключении к ней внешнего клиента (на другой машине и НЕ в докере, эти условия поменять нет возможности)
2. У cassandra есть listen address, по умолчанию это 172.18.0.2 и 172.18.0.3(из compose) BROADCAST_ADDRESS - это тот ip по которому к ноде надо подключаться, те по-умолчанию такой же, на котором она слушается. CASSANDRA_SEEDS - то, к кому подключаемся, тут тоже используем 172 сеть
Чтобы подключиться из вне (см пункт 1) , поднимаем интерфейсы дополнительные (хочется использовать одинаковые порты) и маппим порты 172.18.0.2:9042 -> 10.0.7.2:9042, 172.18.0.3:9042 -> 10.0.7.3:9042
Пока всё кажется логичным, всё работает.
НО, когда подключается клиент к скажем к 10.0.7.2:9042, cassandra ему отвечает что есть ещё нода по адресу 172.18.0.3, клиент пытается туда тоже сходить и у него, разумеется, не получается.
Заставить говорить Cassandra что сосед это не 172.18.0.3, а 10.0.7.3 можно только используя его в конфигурации, но, тогда вообще ничего не заработает, потому что ИЗ node1 по адресу 10.0.7.3 в node2 НЕ попасть.
Как разрешить такой тупик?
Evgenii
Тип сети host решает задачу
Evgenii
Но без отговорки что контейнеров больше чем 1
twwlf
а что если listen_address == host ip addr?
twwlf
будет много ната, но должно работать
twwlf
вообще, когда ты запускаешь сервисы в compose, он собирает их в сетку с днс, и они становятся доступны по именам а-ля node1/node2 в моём примере
Evgenii
Да
Evgenii
Просто косяк что клиент то внешний
twwlf
ну а какая разница
twwlf
поэтому и адрес внешний
twwlf
т.е. клиент придёт на внешний адрес хостовой тачки, дальше ядро занатит куда нужно
Evgenii
Да, это норм, клиент спрашивает у node1, а где node2, я туда тоже схожу
twwlf
такой же внешний адрес, но другой порт
Evgenii
А она такая 172.16 (я так node2 зарезолвила) И клиент такой ну ок и идёт на 172.16
Evgenii
А на node1 он пошёл через 10.0.7 изначально, это он знал как идти)
Evgenii
Я разве не могу создать bridge так, чтобы с другой машины в его сеть попадать?
Evgenii
Это бы решило мою задачу