Как стать автором
Обновить

Комментарии 16

Дополнение по греху №2: наличие ufw на хосте никоим образом не мешает докеру открывать порты наружу.
Запустили, к примеру, elasticsearch как -p 9200:9200 — получили дыру в безопасности размером с техас.

Согласен. Его просто надо правильно приготовить. Я писал про это на github.
https://github.com/il-da-r/dockerufw

К сожалению, данный подход не позволяет блокировать сам процесс docker-proxy, который и открывает данный порт на всех интерфейсах. Этот процесс, как и сам docker, имеет привелегию CAP_NET_ADMIN, что позволяет открывать порт в обход файрвола. Если потенциально в нем есть какая-то проблема, то будет небольшая дырка с рут-привелегиями и всеми капами. Лучше всего указать докеру дефолтный адрес для проброса порта как 127.0.0.1, указав параметр "ip": "127.0.0.1" в конфиге докера. Конечно, это не запрещает явно указать -p 0.0.0.0:8080:8080, но это уже буратинство :)

Я однажды по не знанию сделал такую дыру, с тех пор запускаю dockerd с опцией --iptables=false, ну или в daemon.json опцию «iptables»: false. Бонус в отличие 127.0.0.1:xxxx:yyyy — теперь можно нормально управлять списком трастед хостов через iptables/ufw.
Насколько я помню, от iptables=false у докера отваливается жопа нетворкинг
Детали сейчас не вспомню, но что-то прекращало работать.
Ни разу ничего не отваливалось из-за этого. Много лет в проде работает.
Единственное, нужно ещё добавить в правила форвардинга трафик контейнеров, и маскарадинг. Без этого действительно сеть в контейнерах сломается

Что-то типа такого:
Заголовок спойлера
DOCKER_NET=«172.0.0.0/8»
iptables -t nat -A POSTROUTING! -o docker0 -s ${DOCKER_NET} -j MASQUERADE
iptables -A FORWARD -s ${DOCKER_NET} -j ACCEPT
iptables -A FORWARD -d ${DOCKER_NET} -j ACCEPT
iptables -A INPUT -s ${DOCKER_NET} -j ACCEPT


О, спасибо
В этой статье я сосредоточусь на сценариях использования, связанных с интеграционным тестированием и использованием docker-compose в качестве среды разработки. Я думаю, что для производственного использования docker-compose обычно не подходит.

Очень важное замечание. Потому что дальше идёт описание сценария именно в дев среде. Для прода эти «грехи» неприменимы


. Его просто надо правильно приготовить

К сожалению, не помогает. Даже ввели DOCKER-USER цепочку — лучше не стало.
Поэтому совет публикации на 127.0.0.1:xxxx:yyyy — достаточно мудрый и я его поддерживаю.
С «грехом 1» даже интереснее — потому что если мы используем сеть хоста и публикуем внутри контейнера приложение на 0.0.0.0, то у нас файрволл как раз нормально работает. И в этом случае «нормально закрытый» файрволл отсекает все обращения не с локальной машины (что можно использовать как раз для прода — т.к. изоляция докер подсетей на самом деле достаточно эфемерна)


Грех №3: ​​Вы используете helthy для координации запуска служб

Опечатка — конечно, же healthy. Спорный вопрос, на самом деле. Действительно порядок запуска очень важен бывает. И тогда есть два варианта — либо писать его в каком-то внешнем скрипте (баш? Мейкфайл?), либо выносить логику в отдельный контейнер. Но все же хочется, чтобы все запускалось одной командой. Тогда цепочка взаимодействия через хелсчеки и порядок вызовов выглядит не самой дурацкой. Но в каждом конкретном случае надо принимать решение самостоятельно — идеального, хорошего и универсального солюшена нет.


Что ж этого больше нет в версии 3.0 и никакой замены для него не предлагается.

«Отлично». Т.е. проблема в версии 3? Ну, так не пользуйтесь ею. 3.х придуман для сворм, это параллельная версия формата компоуз, которая не замещает 2.х По функционалу же они примерно идентичны.


В качестве простого примера, многие языки имеют глубокую интеграцию IDE, что делает вставку контейнера между языком и IDE практически невозможным. Есть много веских причин не делать этого.

Это тоже не так. Во-первых, приложение не существует в вакууме и можно объединить разработку на локалхосте, а зависимости — крутить в контейнерах. Чтобы основную машину не пачкать.
Вторая история — многие IDE уже поддерживают разработку в контейнерах. Бывают нюансы — да. Но в целом, понятно, что делать и как бороться с проблемами.

Не понятно при чём здесь docker-compose, все аргументы относятся к docker как таковому. Складывается впечатление, что автор не понимает сути технологии. Ну и аналитика на уровне детского сада ясельной группы заявление: «Я думаю, что для производственного использования docker-compose обычно не подходит.» А НЕОБЫЧНО подходит? А почему не подходит, потому что допускает неправильное использование? Это как то слишком.
А почему не подходит, потому что допускает неправильное использование? Это как то слишком.

Ну так это современная мода такая. «Язык программирования требует внимательного отношения к предоставляемым возмозможностям? Назовем этот яп опасным для разработки.»
Я думаю, что для производственного использования docker-compose обычно не подходит

А я использую. До определенного уровня сложности имхо удобнее и проще, чем громоздить кубернетис или ещё какую конструкцию.


Кстати насчёт вывешивания портов наружу (привязка к 0.0.0.0). Если исправить "грех номер 1" то ведь автоматически исправляется и "грех номер 2"? Какой потом смысл в expose для отдельных контейнеров если все и так видят друг друга в docker Network? Ведь в таком случае точка входа (к примеру http сервер) как раз и должна привязываться к 0.0.0.0 интерфейсу.

Так использование сети докер это прекрасная фишка =) Которая позволяет создать вещь в себе и она прекрасна пока не начинается маштабирование на проде =) Но думать про маштабирование на проде это оверинженеринг и головная боль девопса а не разработчика

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


--net=host — это единственный адектватный метод получить хорошо работающую сеть в докере. (10к соединений в секунду, 10Гбит/с флуда на инспекцию, you name it).


Да, в некоторых случаях это излишне. Но заявления "вы используете неправильно", мягко говоря, преувеличены.

еще раз — автор говорит про использование в dev (локальная машина разраба). На проде совсем другие задачи и правила. И с тезисом, что на проде нужен --net=host и iptables: false в конфиге докера я полностью согласен


найс фичу затащили — так что порядку запуска быть!

Да уж. обмельчали DevOps, аж так, что пишут на хабр исключительно на опыте dev.
Если бы ТС действительно работал с докером, он бы не опустился до той чуши, которую мы здесь прочли.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории