LINUX.ORG.RU

docker-compose iptables проблема

 , , , ,


0

2

Я создал небольшой docker-compose.yml:

services:
  db:
    image: postgres
    restart: always
    shm_size: 128mb
    environment:
      POSTGRES_PASSWORD: "1234"
      POSTGRES_USER: furniture
      POSTGRES_DATABASE: furniture
    volumes:
      - ./migrations:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"

Здесь стоит сказать что я использую void linux и установил docker через xbps. Запускаю я его как sudo sv start docker или sudo dockerd (результат тот же)

Запускаю следующие команды:

docker-compose build
docker-compose up

И получаю вывод от второй команды:

[+] Running 1/1
 ✘ Network desks-site_default  Error                                                                                          0.0s
failed to create network desks-site_default: Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait -t nat -I DOCKER -i br-8536537f1c60 -j RETURN: iptables: No chain/target/match by that name.
 (exit status 1))

iptables -L:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


Последнее исправление: zane (всего исправлений: 2)

Перезапусти сервис докера, он должен свои цепочки создать

Ну вообще докер это кривая самоделка. Если и приходится использовать, то лучше под него отдельную машину выделять, виртуальную, чтобы там эти помои были изолированы.

masa ★★
()
Ответ на: комментарий от masa

Спасибо за ответ, я пробовал перезапускать и докер и компьютер, вообщем он почему-то сам создать это не справляется. А про изоляцию, я собираюсь, но для начала надо чтобы было что изолировать, разработать.

zane
() автор топика
Ответ на: комментарий от Ololo_Trololo

По причине того, что локально он ломает мне фаервол, а на работе девопсы его насаждают как решение всех проблем, хотя просто бездарные смузихлебы которые линукс не могут настроить.

masa ★★
()
Ответ на: комментарий от masa

докер это кривая самоделка.

masa ★★ 09.10.25 20:35:15 MSK докерофоб

Всё сходится, спасибо за ежегодное подтверждение статуса 🤣

aol ★★★★★
()
Ответ на: комментарий от masa

Сурово.
Вот сам только докер, чисто как пользователь чужих контейнеров, начал осваивать. Могу сказать, что он мне пока очень нравится: не надо компилять на любимой Дженте. К тому многие приложения не совместимые с последними версиями их сборочных библиотек. Короче, для дома это просто шикарно, особенно на стареньком микросервачке.

Ololo_Trololo ★★
()
Последнее исправление: Ololo_Trololo (всего исправлений: 1)
Ответ на: комментарий от Ololo_Trololo

Да, согласен, это на самом деле очень удобно, запускать контейнеры через компоуз в одну строчку.

Ну пока это не начинает мешать. У меня есть докер, но в основном все крутится на отдельном сервере, локально стараюсь не использовать, только если уж совсем без него никак.

masa ★★
()
Ответ на: комментарий от cobold

Да, я так и решил проблему, то есть при изменении фаервола, мне надо еще все сервисы перезапускать просто так, с простоем.

Очнь хорошая система этот докер. А все почему? Потому что это кустарная поделка написанная изначально вообще не питоне, сейчас вроде на го переписали.

В тех же LXC контенерах подобных проблем нет потому что проектировались инженерами, а не каким-то пограммистами, но LXC не популярны.

masa ★★
()
Ответ на: комментарий от masa

Ну… Тут такое дело. Если тебе нельзя сделать systemctl restart nftables docker, то только править /etc/nftables.conf и эти же правила вставлять в нужные места в рантайме.

Точно такая же ситуация и с libvirt, он так же генерит динамические правила, которых не должно быть в /etc/nftables.conf (или в /etc/iptables/rules*).

Dimez ★★★★★
()
Ответ на: комментарий от masa

В тех же LXC контенерах подобных проблем нет потому что проектировались инженерами, а не каким-то пограммистами, но LXC не популярны.

Вообще контейнеры напрямую запускаются через systemd, но это не поможет автору темы так как у него void.

mx__ ★★★★★
()
Ответ на: комментарий от masa

Потому, что docker используется iptables, а не nftables перепиши свои правила на iptables.

Понятно, что внутри они транслируются в исполняемый код, как в случае nftables, но в docker пока только iptables.

kostik87 ★★★★★
()
Ответ на: комментарий от masa

Да, я так и решил проблему, то есть при изменении фаервола, мне надо еще все сервисы перезапускать просто так, с простоем.

Проблема в том, что ты не прочитал документацию, хотя бы минимально по продукту, что ты используешь, а именно docker.

И ещё, возможно, тебе нужно сменить адресацию для сетей контейнеров, чтобы не пересекалась с твоей локальной сетью дома / компании.

Это всё так же в документации.

kostik87 ★★★★★
()
Ответ на: комментарий от Dimez

Да, такое я тоже практиковал, дописывать вручную правила чтобы не ребутать приложения.

Ну в этом и есть корявость и неудобство докера для меня.

masa ★★
()
Ответ на: комментарий от kostik87

И ещё, возможно, тебе нужно сменить адресацию для сетей контейнеров, чтобы не пересекалась с твоей локальной сетью дома / компании.

Это у меня сделано, потому что да - пересекались

masa ★★
()
Ответ на: комментарий от kostik87

Я читал документацию и довольно глубоко погрузился в докер, намного глубже, чем хотелось и это вообще не то, что мне говорят девопсы «просто засунь в докер», причем сами они, мне кажется, плохо понимают что делают.

masa ★★
()
Ответ на: комментарий от masa

Я использую iptables для пакетного фильтра, во что он там далее транслируется мне всё равно.

Не вижу пока необходимости в nftables, синтаксис iptables мне привычнее.

Чем писать кучу простыней многострочных правил, где в iptables - это одно правило лучше буду использовать iptables.

kostik87 ★★★★★
()
Ответ на: комментарий от masa

У тебя проблема, что ты используешь nft, а docker строит свои правила на iptables, вроде бы можно попробовать поставить iptables-nft, не пробовал.

Остальное, namespace, сети в docker, управления ресурсов, прочее в docker работает штатно без привязки к iptables.

kostik87 ★★★★★
()
Ответ на: комментарий от Dimez

Я использую iptables, не вижу нужны в nftables, писать много строк для правил в NFT, где в iptables - это одна строка - не вижу смысла.

Проблемы собственно как таковой нет, просто если инструмент использует iptables для своей работы, незачем мешать сюда nftables.

К тому же на локальной машине смысла в nftables нет никакого, всё решается в 100% случаев iptables.

Вряд ли нужно динамическое обновление списков, что в iptables (ipset) не работает.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Да, согласен, что для всего есть обходные пути, не пользуй X, пользуй Y, но в нормальных контейнерах это не требуется, а докер тебя заставляет переделывать существующую систему под него, в этом большой минус

masa ★★
()
Ответ на: комментарий от masa

Нет понятия нормальные, не нормальные.

Есть понятие подходящее под каждую ситуацию.

Если у тебя есть вариант не использовать docker - не используй.

Хотя, я вижу и истории успеха, где с NFT с docker нет проблем: https://www.naturalborncoder.com/2024/10/installing-docker-on-debian-with-nftables/

Проверить не могу, потому как не использую NFT. Мне не понятно зачем он нужен, если есть iptables, она работает уже лет 25 и до этого ещё сколько и будет работать, думаю, ещё столько же, как минимум 5 или 10 лет, пока не уберут обратную поддержку.

Это как в другой теме, где автор поставил Debian Forky и не собрать модули VmWare Workstation под новое ядро, патчи пока что не накладывал.

Вся суть в правильном выборе инструментов и учёта их требований.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Понятно, что внутри они транслируются в исполняемый код, как в случае nftables, но в docker пока только iptables.

не совсем понимаю зачем докер дергает iptables? Вот у примеру у меня samba я ее стартую и тушу и у меня в iptables не открываются и не закрываются порты для samba, и так со всеми службами. А докеру это зачем?

mx__ ★★★★★
()
Ответ на: комментарий от mx__

Он создаёт отдельные цепочки правил для виртуальных интерфейсов каждой отдельной сети контейнеров.

При запуске контейнера, что просто через docker, что docker compose (docker-compose) создаётся отдельный namespace и отдельный адаптер, правилами iptables он управляет трафиком внутри этих сетей.

Это если не делается проброс портов из этих сетей на ХОСТ интерфейс. Если делается - тут уже NAT нужен.

Т.е. по сути трафик, во первых изолируется в каждой отдельной группе (сети) контейнеров, во вторых - делается проброс, если нужно.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

Извращение какое то, хорошо что у обычных контейнеров и libvirt таких извратов нет и просто адаптеры и отельные имена дергаются без всяких iptables.

mx__ ★★★★★
()
Ответ на: комментарий от kostik87

Что такое обычные контейнеры? LXC?

Да без понятия, те что напрямую можно запускать через systemd или затискивать в кибер.

mx__ ★★★★★
()
Ответ на: комментарий от mx__

Те, что запускаются напрямую в systemd - это LXC.

Кибер не знаю что такое, если это кубернетес, то там движок контейнеров либо docker-engine, либо containerd, что сейчас в большинстве установок стандарт, либо cri-o, либо другой.

Но все они создают свои виртуальные сети.

Нужны пояснения, что такое «кибер».

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Ну значит LXC.

Ну да кубернетес.

Но все они создают свои виртуальные сети.

да создают в случае systemd просто файл с данными сетки ложишь и все.

mx__ ★★★★★
()
Ответ на: комментарий от mx__

все они создают свои виртуальные сети.

Я про движки запуска контейнеров в kubernetes.

В случае LXC - там да, простой файл и там тупо bridge создаётся с интерфейсом ХОСТ системы и всё.

И в этом суть LXC, что по сути в основном системе в LXC предоставляется полный доступ к сети как из, контейнера, так и в контейнер.

docker и прочие движки запуска контейнеров для kubernetes и в частности docker-engine в первую очередь нацелены на создание изолированных сред.

Как от сети в целом, так и между сетями контейнеров. Внутри docker, к примеру работает своё пространство имён, по имени сервиса в docker comose, pod`а в namespace в kubernetes, хотя в kubernetes можно так же обращяться по имени пода, но там так же создаётся и обслуживается отдельная внутренняя DNS зоня для сервисных подов, которые тоже являются контейнерами, ingress контроллеров и прочего.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

И в этом суть LXC, что по сути в основном системе в LXC предоставляется полный доступ к сети как из, контейнера, так и в контейнер.

Там и так среды изолированы, пока сеть не пропишешь фиг один контейнер до другого достучится. А чтобы с наружи пролезть нужно в иптаблес порт открывать.

К примеру у меня 2 контейнера, и у одного порт 3000 проброшен у другого 3001 и вот с хоста видишь и тот и тот, но друг друга они фиг увидят пока их в одну сеть не запихаешь.

mx__ ★★★★★
()
Ответ на: комментарий от mx__

Если ты их подключил к разным мостам - да. Тут уже ipforward на хосте сделать и прописать шлюзом IP адрес на бридж интерфейсе хост.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

pod`а в namespace в kubernetes, хотя в kubernetes можно так же обращяться по имени пода,

Эти поды можно напрямую дергать из системд, но мне это не нравится, мне прикольней на отдельных сервисах системд.

mx__ ★★★★★
()
Ответ на: комментарий от kostik87

Если ты их подключил к разным мостам - да.

имеется ввиду не прописывая нечего, ну делает он там по умолчанию свои мосты для каждого сервиса.

mx__ ★★★★★
()
Ответ на: комментарий от kostik87

вот так выглядит к примеру файл запуска: mariadb-service.container

[Unit]
Description=MariaDB container

[Container]
Image=docker.io/mariadb:latest
Environment=MYSQL_ROOT_PASSWORD=rootpassword
Volume=mariadb-volume.volume:/var/lib/mysql
Network=mariadb.network

и рядом валяется файл: mariadb.network

[Unit]
Description=MariaDB Network

[Network]
Subnet=192.168.30.0/24
Gateway=192.168.30.1

И все. Ты просто запускаешь : systemctl start mariadb-service.container и все.

В другом сервисе также укажешь Network=mariadb.network и они уже вместе.

Типа:

[Unit]
Description=phpMyAdmin container
Requires=mariadb-service.service
After=mariadb-service.service
 
[Container]
Image=docker.io/phpmyadmin:latest
Network=mariadb.network
PublishPort=8080:80

[Install]
WantedBy=multi-user.target

заодно зависимость прописываешь от верхнего сервиса, и никакой компосе тут нафиг не нужен ;)

P.S. volume так же как network можно файлом рядом положить.

mx__ ★★★★★
()
Последнее исправление: mx__ (всего исправлений: 1)
Ответ на: комментарий от Ololo_Trololo

Ну кстати он прав, с сетью у докера грустно уже лет 10. Правда у композа еще ок, а вот у сварма полная жопь.

upcFrost ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.