Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Докер работает только в Линуксе (и уже в винде, не?)
sendfile on;. У вас какая операционка/виртуалка? Радует то, что деньки фразочки «а на моей машине всё работает» уже сочтены ;) Радует то, что деньки фразочки «а на моей машине всё работает» уже сочтены ;)
docker-machine всегда. который объединяет машины разработчиков и сервера.
Один контейнер — одна задача?
Т.е. есть контейнер с БД, контейнер с Nginx, контейнер с данными?
Каким образом я смогу соединяться с БД из контейнера с данными?
В конфигах Nginx, какой будет root папка (получается она из другого контейнера)?
Когда я отправлю на Docker Hub проект, то получается если был контейнер с БД, то данные тоже отправится и при запуске на другой машине уже всё будет готово и БД и все файлы?
Да. Но это лучше будет рассмотреть в отдельной статье про микросервисы. Докер, как платформа позволяет запускать несколько задач в контейнере, но лучше пересесть на микросервисы.
Данные не принято хранить в контейнерах. Они должны храниться за пределами контейнеров.
А в чем проблема использовать Data Volume Containers?
--volume-driver, который позволяет использовать, например, Flocker. А что именно поменялось с 1.9 в этом плане? Реально интересно, ибо сам еще новичок в Docker (и DevOps вообще), и хотя активно отслеживаю эту тему — не всегда понятно, какой из доступных опций лучше воспользоваться.Если мы используем папку на хосте, то какой тогда вообще смысл в отдельном контейнере для этого?
50Мб + 20Мб * 25, при обновлении Java — 160Мб + 20Мб * 25, а при обновлении базового образа, да все обзразы нужно пересобрать — 5Мб + (50Мб + 20Мб * 25) + (160Мб + 20Мб * 25), но если хотите заморочиться и вы хотите сделать отдельный случай "обновления системы" без полной пересборки, когда вы знаете, что пересборка не нужна (ну, например, обновилась только динамическая библиотека), то можно такие патчи наклвадывать сверху приложений, тогда при обновлении libopenssl.so серверам нужно будет скачать слой с новой openssl.so, добавленной последним слоем в каждый образ, 50 раз.И это я ещё оставил за кадром вопрос небезопасности самого докера — а ведь это сервис, который работает под root, активно меняет настройки всей системы (так что бессмысленно даже пытаться SeLinux-ом или другой RBAC обрезать его права до необходимого минимума как принято делать для всех остальных рутовых сервисов), доступен по сети и из контейнеров, и при этом очень активно допиливается (в отличие от большинства других рутовых сервисов).
Конечно нужно пересобирать все контейнеры, но это проще, чем все делать вручную при каждом обновлении
пока жутко неудобен, как с точки зрения устоявшихся процессов и правил так и с точки зрения сборки.
другой способ виртуализации.
один контейнер = один процесс
контейнер = одна обязанность
shared memory например надо организовать между процессами
Пруфы: http://www.securitylab.ru/news/473082.php. И это было через много месяцев после шеллшока.
вы начали за безопасность, но я вообще не понял как вы её там подразумевалиБезопасность подразумевает необходимость ежедневных обновлений пакетов ОС, из-за чего почти каждый день необходимо будет пересобирать как базовый образ, так и часть образов с приложениями (если они содержат какие-то дополнительные пакеты ОС помимо самого микросервиса).
Да, сама идея root-демона, который занимается неизвестно чем — не самая приятная для осознания.Беда не столько в том, что он занимается неизвестно чем, сколько в том, что он делает слишком много всего. Обычно ту часть кода, которая работает с полными root-правами стараются вынести отдельно и держать там самый минимум кода. А докер это бинарник на 25+ MB в котором с root-правами работает всё, включая Go runtime.
Однако, стоит отметить, что вы лукавите здесь, говоря, что он доступен по сети и из контейнеров. По умолчанию, docker-daemon использует UNIX-сокеты, так что доступен он только локальным пользователямЛукавите здесь Вы. Да, по умолчанию всё именно так. Но я в своём комментарии отвечал на конкретную статью, где автор рассказывал как докер радостно создаёт сети между датацентрами так, что контейнеры этого даже не замечают, и управляет всем этим хозяйством с одной машины — через какие конкретно UNIX-сокеты, по-вашему, всё это может работать?
Безопасность подразумевает необходимость ежедневных обновлений пакетов ОС, из-за чего почти каждый день необходимо будет пересобирать как базовый образ, так и часть образов с приложениями (если они содержат какие-то дополнительные пакеты ОС помимо самого микросервиса).Поэтому я и выступаю за использование Alpine образа в качестве базового — там всего 4 пакета, которые обновляются достаточно редко (уж никак не каждый день). Однако, musl libc приносит как свои плюсы, так и свои грабли… Я не вникал в hardened gcc, но пакеты в Alpine Linux собраны с stack-smashing protection.
Лукавите здесь Вы. Да, по умолчанию всё именно так. Но я в своём комментарии отвечал на конкретную статью, где автор рассказывал как докер радостно создаёт сети между датацентрами так, что контейнеры этого даже не замечают, и управляет всем этим хозяйством с одной машины — через какие конкретно UNIX-сокеты, по-вашему, всё это может работать?Да, можно открыть доступ к Docker демону по сети, да, там можно настроить псевдобезопасность, и, наконец, ДА, мне это совершенно не нравится! Тут действительно можно долго познавать глубину дыры. Однако, есть другой подход — агенты, крутящиеся на сервере с Docker-daemon'ами, которые поднимают свою VPN до мастер ноды и общаются с локальными Docker-daemon'ами через UNIX-socket. Так делает как минимум Rancher и есть у меня подозрения, что так же (ну может без VPN) делают и Kubernetes, и Fleet, ну и остальные здравые люди.
Ну и использую я возможности ограничений ресурсов Docker контейнеров на полную, так что без Docker я бы даже, наверно, не приступил бы ещё к написанию этого проекта, а застрял бы в дебрях LXC.Возможно, вас заинтересуют механизмы systemd для ограничений всего.
Реально если ваше приложение распилино нормально на сервисы которые предоставляют наружу четко ограниченое АПИ (например порт 80) то какай вам разница бежит ваш сервис внутри контейнера на Hardened Gentoo или альпине? Какая потенциальная угроза?А в чём, по-вашему, разница между обычным сервером где стоит один такой сервис и контейнером докера? В том, что на сервере есть ещё и SSH? Так конкретно SSH никогда не была большой проблемой в плане безопасности, и всё, что делается в Hardened Gentoo — делается вовсе не ради защиты sshd. Или Вы считаете что сервера, на которых только SSH и один сервис с сетевым API, не имеют проблем с безопасностью и не нуждаются в регулярных обновлениях?
Пересборка контейнера — это запуск docker build.Формально — да. Но в контексте ответа на мой комментарий пересборка контейнера подразумевает обновление установленного в нём софта, правку конфигов, разрешение конфликтов — в общем, всё то, что обычно делается при обновлении сервера. Простым запуском docker build тут обычно не обойдёшься.
Вы не делаете перезапуск вручнуюЯ тоже этим восхищён, но описанная мной проблема перезапуска не в том, что его нужно делать вручную, а в том, что многие сервисы достаточно нетривиальны, и их перезапуск — штука достаточно дорогостоящая (в плане ресурсов, производительности, etc.) чтобы делать его без веской причины каждый день.
Рут, который в докере, …… меня никогда особо и не волновал, так что не совсем понятно, к чему Вы это описали. Проблема попадания злоумышленника внутрь контейнера не в том, что он там будет root, а в том, что он получит доступ к тому (базы/сети), к чему есть доступ у работающего в контейнере сервиса.
пересборка контейнера подразумевает обновление установленного в нём софта, правку конфигов, разрешение конфликтов
их перезапуск — штука достаточно дорогостоящая (в плане ресурсов, производительности, etc.)
он получит доступ к тому (базы/сети), к чему есть доступ у работающего в контейнере сервиса.
стабильных образов зафиксировавших необходимое для приложения окружение (а это одна из основных фишек докера описанных на главной странице сайта) больше не существует — образ собранный сегодня может работать, а собранный из того же Dockerfile завтра — уже нет
# hipster-programmer/ourhompage/Dockerfile
FROM ubuntu:14.04
COPY buggy-libssl.so /usr/lib/libssl.so# paranoid-devops/ourhompage/Dockerfile
FROM hipster-programmer/ourhompage:6.6.6
# RUN apt-get update && apt-get upgrade
COPY hardened-libssl.so /usr/lib/libssl.soПочему в статье даже мельком не упомянуто, как работать с персистентными данными
то разница небольшая.
Если бы речь шла о каком-то бинарном приложении, которое бы нужно было предварительно скомпилировать и оно имело жесткие релизные интервалы
собрать контейнер и пушнуть его на все сервера и перезапустить — это уже не удобно
docker-compose up и последний слой переклеили с новым кодом, этот слой один улетел в репозиторий, этот же слой пулей прилетел на все сервера и зупустился там. С гитом ситуация до буквы такая же, только старые коммиты еще и копятся.и не смешивает всё в кучу — наше приложение и его окружение
приведёт к необходимости настройки умных балансировщиков, которые для нас сейчас избыточны
Если представить, что закоммитили php файл и ждём, пока CI клонирует проект
Но ведь и другие мелкие настройки должны меняться для девелопмента
За исключением конфига nginx, его приходится немножечко сдабривать шаблонизатором.
expires -1;, proxy_intercept_errors и всё. Поэтому пользуюсь скриптом-шаблонизатором на (сюрприз!) перле. Перл по умолчанию установлен в контейнере nginx, так что доставлять его не приходится.И тебе привет.
Что, нагруженную базу в докер на cephfs в k8s поставил, все упало и решил написать?
А у нас вон воркеры в реббите отваливаются в контейнерах и в логи спамят, если нагрузки нету.
Ну так я про то же — никто в здравом уме не будет раскатывать бложик в кубернетесе или нагруженные базы.
Плюс поддержание инфраструктуры — одмин нужен причем хороший, да и до k8s было грустно с ним вообще-то, а статья писалась до распространения k8s в рунете.
Так что я вполне угадал — в тестировании его активно юзают и там где микросервисы. А автора в конце понесло, да и вообще было тогда что суют всюду и где надо и где не надо и "все заменит" и какие только диферамбы не пели, так что да, тогда был пик ожиданий.
туториалов на русском
docker-machine create … и docker-compose up.FROM ourpersonal/homepage:6.6.6
RUN apt-get update; apt-get upgrade
RUN rm -rf /
RUN wtf
Были бы контейнеры, это бы всё поймалось на тестовых серверах.
Кто вам мешает собрать собственный образ на базе любого дистрибутива и поддерживать его и все либы в актульном состоянии?
Вот второе требование страшно бесит программистов, у которых на ноутбуках в лучшем случае «какой-то арч», а обычно — макось. И дальше синдром «у меня всё работает почему оно в вашем говнопродакшене сыпется из-за каких-то протухших версий библиотек?Такой программист должен сидеть у себя в уголке, программировать и не лезть на сервер, хоть с докером, хоть без. Так же, как „чистый“ админ не должен лезть в код.
Upstart / SystemD / Supervisor / launchd / God.rb / SysVinit, тысячи ихДа, вроде, абсолютно все из перечисленного умеет systemd, даже Docker-образы из Docker Hub качать и запускать.
Архаичные системы запуска сервисов, основанные на статичных конфигах идут в сад. На их место приходит docker daemon, который является init-подобным процессом умеющим следить за запущенными сервисами, перезапускать отвалившиеся, хранить коды выхода, логи, а главное, скачивать любые контейнеры с любыми сервисами на любой машине, не важно какая у машины «роль».
контейнерам всё равно где крутиться, они объединены виртуальной сетью, видят и слышат друг друга отовсюду, включая девелоперкую машину в случае живой отладки.
Этот аргумент называется ad hominem и является одним из самых болезненных в споре, но его очень легко обнаружить. Применять его стоит в небольших количествах, чтобы собеседник не обвинил вас в переходе на личности. Второй целью психологической игры в демагогию является доведение оппонента в споре до кондиции, и при удачном исходе поведение оппонента станет неадекватным, а потому верить вам будут намного охотнее. Напомним, вы стоите выше толпы и не стесняетесь этого, поэтому расшатывание нервов собеседнику — приём надёжный, но опасный.
Незаменимый админ полубог на скейтборде.
потере маржи, а в том что вы ничего не понимаете в проектировании систем и вводите в заблуждение других. Например
Само собой, такой кластер упирается в ширину сети между машинами, но и это уже прорыв для рядового девопса. А если еще и NAS запилить, то уже взрослый многофункциональный кластер получается.или
Это узкая специализация делает функцию реализуемую контейнером предсказуемой и масштабируемой.
Для того чтобы запустить контейнер не нужно получать root на сервере, морочиться с ключами и настраивать систему деплоя. С докером деплой выглядит как сборка и настройка физического сервера дома, дольшейшего его всестороннего тестирования, а затем магического перемещения в произвольное количество детацентров одной командой. Для этого достаточно запустить docker run на своём ноутбуке и докер сам секьюрно подключится к серверу по TLS и всё запустит. Внутрь контейнера тоже попасть проще простого: docker exec -it %containername% bash и у вас в руках консоль для отладки.Дать пользователю права на запуск контейнеров == дать рута.
Дать пользователю права на запуск контейнеров == дать рута.
Докер не умеет в зависимости (например, гасить/перезапускать зависимые сервисы). Compose — смех и грех, не более чем для dev. Так что супервизоры никуда не денутся, оркестрация (пусть даже в виде ansible) — тоже.
Machine недавно ещё был кривыми костылями.
Но оно из коробки летает без какого-либо шифрования и подписи, т. е. реально надо делать внутри private dc или поверх vpn, что сказывается на производительности.
с версии 1.9 — нетЕсли вы про userns, то с ним пока не очень понятно, в смысле безопасности.
Разве без шифрования? Общение же с master нодой по TLS идет со своими сертификатами. А между нодами вы так же можете SSL пустить или VPN или еще чего. Да и как правило это уже реально сильно зависит от того каким образом вы все настроили.Оверлейный vxlan, про который пишет автор публикации в предпоследнем абзаце, — без шифрования. Т. е. если использовать --link между контейнерами, то весь трафик внутри должен быть шифрованным и подписанным. Много ли людей будут это делать, а не воспринимать --link, как секьюрный оверлей? Я, например, сейчас использую tinc (p2p vpn), как паллиативное решение.
весь трафик внутри должен быть шифрованным и подписанным
Кроме того, docker пока не интегрируется нормально с firewalld
Для этого вы можете реализовать свой драйвер для сети (или поискать готовые, думаю скоро их прибавится)Автор говорил про vxlan, который не даёт enc+mac. То, что через некоторое время наделают новых реализаций оверлейных сетей — не сомневаюсь. Но это дело будущего, реализации и стабилизации ещё ждать и ждать.
Да, это не удобно но всегда можно позакрывать порты на хост машине.Если оставить `--iptables=yes` и `--ip=0.0.0.0`, то это вам не поможет, т. к. докер запихает DNAT-правила в таблицу nat и пакеты, пришедшие на прокинутый с помощью -p/-P порт будут заDNATены до того как дойдут до таблицы filter, где их попытаются зафильтровать. Я в какой-то момент очень внимательно разглядывал, что docker запихивает в iptables.
Сейчас это довольно прикольная штука, правда я лично жду import/export машин, сейчас это оочень неудобно и использовать можно разве что в рамках ci сервера например (для деплоймента).
Как-то нужно ставить сам докер, обновлять хост, конфигурировать данные для контейнера
логи. логгировать в sysout/syserr — ужасная идея
честно говоря, поднимать ВМ для запуска докера под линуксом для меня выглядит извращением.
if с else после форка… Вот и к вам придет такой я из прошлого и примонтирует ваш корень куда не положено, а затем случайно сделает rm /usr /local. Да и грязь выметать удобнее, и холодный старт протестить ничего не стоит, и кластерок сэмитировать можно.Докер не отменяет ansible
отправлять логи по сети синхронно
The Linux Kernel has a bug that causes … Docker on IPv6 … receive corrupt data.
Docker’s default NAT networking is not affected
Google Container Engine is likely protected from hardware errors by its virtualized network
Есть много плагинов сборки логов и отправки их на анализ.
Поняв Docker