Pull to refresh

Comments 72

Шумиха, мифы — слова из журнала домохозяйек о том как не боятся и начать вязать.
Разработчик зайдет, прочтет документацию и сам для себя решит — подходит для него инструмент или нет. А заголовок я бы поменял на «10 советов при работе с Docker»

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

Так почему бы мне не сделать “dev.dockerfile”, который будет создавать нужный образ на его основе

Потому что это прямо противоречит смыслу создания докер-образов.
Теперь я могу модифицировать dev.dockerfile по своему усмотрению, зная, что в нем используется точно такая же конфигурация, как и в production-образе.

Зачем тогда это всё, если у вас дев и прод одинаковые?

Какие-то надуманные проблемы, с решением копипастой из документации.

Основные проблемы, с которыми сталкиваюсь при попытках перевести разработку на докер:


  • права в томах, примонтированных на хост — по умолчанию приложения в докере работают от рута либо от чётко заданного пользователя, заставить чтобы запускались по docker run и ко от текущего пользователя хоста весьма нетривиальная задача, особенно через docker-compose, а без этого или контейнер валится с permission denied, либо обнаруживаешь, что не можешь в IDE файл посмотреть или git checkout сделать
  • проброс текущего окружения в контейнер — прежде всего DNS и файлов в ~/.ssh
  • использование окружения контейнера на хосте — прежде всего DNS и изменяющихся файлов типа логов
  • проблемы с томами, которые шарятся между контейнерами, например docroot между контейнерами nginx и php-fpm — тома нужны для шаринга, но их природа (заполнение из "ведущего" контейнера только при первичном создании) мешает активной разработке, если файлы в томах создаются/изменяются/удаляются с хоста
  • очень слабый контроль над созданием образа (docker build) — прежде всего не примонтировать тома с хоста во время сборки
  • конфликты портов на хосте

Ну а самое интересное начинается когда худо-бедно порешаешь это всё, запустишь приложение локально в десятке контейнеров, отладишь (постоянно чертыхаясь, что то не удалил том после исправления одной опечатки, то удалил на автомате то, что не нужно, и теперь жди когда "кэши прогреются") и тебе говорят "молодец, деплой на продакшен", на котором докером и не пахнет. Вот тут и начинаешь понимать, что основные прелести докера раскрываются только в относительно крупных компаниях, которые могут себе позволить CD на продакшен (читай — могут себе позволить специалиста, основной задачей которого будет автоматизация CD и прочий devops), неважно либо в виде докера на продакшене (за года полтора работі с ним так и не решил даже для себя, готов ли он к продакшену в условиях где почти все сервисы критичны для работы, но при этом не дублируются), либо в виде какой-то иной трансляции части разработческого окружения на него.

Срочно пишите статью по этим проблемам. Вот ЭТО было бы полезно :)
Поддерживаю Caravus насчет статьи. Я с docker-ом пока на вы и почитал бы, как вы боролись с описанными проблемами.
1. Проблему наблюдал только на маках, так как docker machine
2, 3: skydns
5. Да, это реально проблема.
6 не замечал такой проблемы, видимо опять же docker machine
  1. Православная Ubuntu, проект на php, структура типа


    /
    src/
    tmp/
    web/
    web/uploads/

    запускаем что-то вроде docker run -v ./:/app image и root/www-data/… кто угодно, но не юзер с uid=1005 на рабочей машине и uid=1000 на личной начинает писать в tmp и uploads отнюдь не от текущего пользователя


  2. Дано: приватный DNS-сервер типа 10.0.0.1 в рабочей сети для доменов типа gitlab.local, к которой из дома подключаешься по vpn, а в докерфайле что-то вроде RUN git clone ssh://gitlab.local/user/repo, причём доступ к гитлабу ограничен по ssh-ключам


  3. Речь о внутреннем DNS докера, по которому контейнеры друг с другом связываются, с хоста к нему доступа в общем случае нет


  4. В проекте два контейнера, экспозящих, например, 8080 порт, пускай с именами app1 и app2, для отладки хорошо бы в браузере на хосте набрать http://app1:8080 или http://app2:8080, а приходится http://localhost:8080 и http://localhost:8081, и хорошо если на хосте 8080 и 8081 не заняты чем-то другим или другой веткой проекта, а пробрасывать на хост без захардкоженных портов — постоянно смотреть куда заммапился
1. Сделайте userns-remap. В контейнер будут от рута, — локально от вашего юзера.
  1. С каких пор Ubuntu стала православной для докер контейнеров? Вы на размер образов после сборки смотрели?
  2. не надо делать git clone в Dcokerfile
  3. зачем вам внутренний DNS ?
  4. в таких случаях создается прокси контейнер (nginx, caddy, etc), который по имени приложения раскидывает в нужный контейнер
С каких пор Ubuntu стала православной для докер контейнеров? Вы на размер образов после сборки смотрели?

Лучше конечно alpina, но есть нюанс — у альпины еще количество пакетов отстает от ubuntu. Это я в разрезе PHP. Можно конечно собирать нужные пакеты вручную и т.д, но это геморрой дополнительный.
У меня контейнер с php-fpm собран на убунте, а остальные (nginx, mongo,mysql, gearman) на alpine.

Это рекомендация для начинающих.
Базовый образ debain — latest 51 MB
Базовый образ alpine — latest 2 MB


Идем дальше:


NodeJS:
latest — 259 MB
slim — 87 MB
alpine- 20 MB


PHP:
fpm — 155 MB
fpm-alpine — 31 MB


Ruby:
latest — 266 MB
slim — 85 MB
alpine — 27 MB


OpenJDK:
latest — 244 MB
jre — 124 MB
jre-alpine — 56 MB


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


В итоге у любителей убунты простое приложение для показа аналитики из Гугла и Яндекса получается 1Gb+
Просто поменяв базовый образ на Alpine у меня получилось его уменьшить до 300Mb


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

  • Во-первых, о продакшене вообще речи нет, пост для разработчиков как бы.
  • Базовый образ закачивается на сервер/рабочую станцию только один раз для всех контейнеров.
  • Разработка образов под что-то отличное от хорошо знакомых дистров значительно усложняется, начиная с банальной установки нужных пакетов, заканчивая необходимостью сборкой софта для отсутствующих пакетов, а разрабатывать образ могут люди вообще ничего в жизни ни разу не собиравшие, только apt/yum install php php-mysql
  • работа изнутри образа тоже может заметно отличаться от привычной среды
  1. А вы разработчик, результат труда которого потом выбрасывают?
  2. Для этого в команде должны быть инженеры
  3. bash/sh/zsh и остальное работает абсолютно одинаково
  1. Я разработчик, который выполняет задачи и старается облегчить себе и другим жизнь. Докерезацией приложения в дев и тест окружениях я облегчаю жизнь себе, другим разработчикам, тестировщикам и немного админам
  2. Инженеры (если вы имеете в виду админов) не заинтересованы в докере на продакшене — "работает — не трогай". Я, как ведущий разработчик, в целом тоже не заинтересован, по крайней мере не настолько, чтобы заявлять "у нас дев и тест средах работает всё под докером — давайте и на прод его пустим, все проблемы с ним я решать буду сам".
  3. Я даже не знаю какой пакетный менеджер в alpine, и есть подозрение, что с его помощью смогу установить заметно меньше пакетов, чем с помощью apt под ubuntu.
  1. вы молодец
  2. у вас нет такой необходимости, ок, это тоже кейс, но ведь это частный случай
  3. это вы так оправдываетесь? :) на мой взгляд незнание инструмента не является единственной причининой для отказа от него
  1. Спасибо, но это больше эгоистичной желание иметь на своей рабочей станции легко разворачиваемое окружение для каждого проекта максимально приближенное к продакшенам. И эгоистичное желание уменьшить траты своего рабочего времени на разворачивания для других разработчиков, тестировщиков и т. п :)
  2. Необходимости в контейнеризации, мне кажется, нет в большинстве случаев. Может кому-то упростить жизнь, может улучшить надежность/утилизацию, но может жизнь и усложнить вплоть до остановки бизнеса из-за отказов на уровне самой системы контейнеризации (докера), с которыми непонятно, что делать. Отказы на не продакшен-окружениях бизнес только в исключительных случаях могут остановить (не успели разработать/отладить фичу, без которой запрещено работать законом), потому зачастую там даётся полная свобода разработчикам. Но внедрение контейнеризации на продакшене — другое дело, разработчики могут только предложение сделать, но решающий голос у эксплуатации.
  3. Для перехода на новый инструмент, особенно предположительно менее функциональный/производительный в некоторых случаях, и гарантированно увеличивающий зоопарк технологий в компании (не менять же на всех серверах, как докер-хостах, так и классических (хост)-ос с ubuntu на alpine только из-за меньшего размера докер-образов), нужны веские причины. Да даже для нормального изучения этого инструмента с целью оценки плюсов и минусов перехода они нужны. Очевидный плюс apline в виде экономии пары сотни метров в размере образа пока для нас веской причиной начинать изучать переход не является, а других мы и не знаем.

Там в официальном образе PHP есть хелперы для сбора недостающих модулей

Небольшого подмножества модулей. И, да, полноценная сборка бинарных библиотек из С-исходников.

А никто не говорил что одной командой "apt-get install" :)

Эта сборка — один из двух основных моментов, почему я принял решение не использовать официальный образ php в дев-окружениях. Второй — корпстандарт на продакшене, где докером не пахнет, у нас ubuntu, иногда при веских основаниях типа "только под ней 1С нормально работает" — centos

права в томах, примонтированных на хост

У меня в phpstorm написан external tool, который делает chown на нужную мне папку или файл и забинден на хоткей. Вернуть себе права секундное дело.

Плюс я внутрь контейнера выполняю команды через маленькую обёртку (главный сервис в docker-compose.yml у нас всегда называется app) В конце которой меняю владельца файлов на себя.

app
#!/bin/sh

COMPOSE="docker-compose run --rm app"
if docker top `docker-compose ps -q app` 1>/dev/null 2>&1; then
    COMPOSE="docker-compose exec app"
fi

if [ -z $1 ]; then
	${COMPOSE} sh -c "if type \"bash\" > /dev/null; then bash; else sh; fi"
else
    ${COMPOSE} "$@"
fi

fix-permission


fix-permission
#!/bin/sh

docker run --rm -v `pwd`:/app -w /app alpine sh -c "chown `id -u`:`id -g` -R ." &



Не буду утверждать, что способ идеальный, но работает и проблем вроде не доставляет.

проблемы с томами, которые шарятся между контейнерами

Мы проблему не решили, но пока ушли от неё поменяв php-fpm на apache.

конфликты портов на хосте

После неудачных танцев с dnsmasq я написал маленький демон, который при появлении контейнера с указанным hostname прописывает его в /etc/hosts. Соответственно порты контейнеров я не публикую. Но работает это только для линукса.
Для тех, кто хочет контейнеризацию без лишних напрягов для себя или в небольшую команду, рекомендую ознакомиться с LXC. Это _не кроссплатформенное_ решение (OSX/Windows отпадают), но с контейнерами LXC можно просто работать как с обычными виртуальными машинами. Для dev/staging окружения вообще идеально, на продакшн всё же приятнее иметь низкоуровневую виртуализацию, но можно и там с контейнерами работать.

А так да, докер без DevOps-инженеров — это боль и страдания.
У LCX есть аналог docker-compose?
Там он просто не нужен. У них свой формат конфигов изначально, его можно оркестрировать через Ansible или просто руками.

С ручной или сторонней оркестрацией, докер бы так не взлетел, скорее всего. Вся прелесть именно для разработчика: склонировал репу, docker-compose up и система с многими процессам у тебя поднялась, полностью связанная внутри, но наружу почти ничего не выбрасывающая.

UFO just landed and posted this here
А как вы разрабатываете? Ставите веб-сервера на компы разработчиков? Работаете на выделенном сервере? Может быть «фигачите прямо в прод»?
UFO just landed and posted this here
Ну то есть вы делаете то же самое только через вагрант, а не через докер :) Можно точно также «зачекаутился с гита, запустил докер». У меня ещё и пхп-шный контейнер миграции сам накатывает, так что… те же яйца…
UFO just landed and posted this here
Ну я бы не сказал. То что вы описываете — справедливо и для докера. У вас же не посто так «vagrant init» кто-то же должен сначала написать конфиги. Про ссш — там что просто «ssh», или всё-таки своя колбаса которую нужно помнить? :) С «лежит в общей папке и видно из под хост-системы» точно так же проблем нет.
Порог входа конечно есть, но он есть везде. Без труда…
А мне наоборот докер показался проще и понятнее вагранта. Дело вкуса, вероятно.

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

Навскидку теоретическая польза:


  • забыть о несоответствиях среды разработки, тестирования и продакшена, прежде всего набора и версий системных пакетов и их конфигов. Ни разу не было, что разработчик что-то себе на машину установил для решения задачи, но по дороге до продакшена информация об этом потерялась? Или даже конфиг веб-сервиса или СУБД поправил у себя, который не в репе проекта, а на продакшене он другой?


  • забыть о настройках среды разработки для нового члена команды


  • обеспечить локально полностью всё окружение — не то, что у каждого разработчика своя СУБД, а под каждую ветку git'а он поднимает за несколько секунд полностью изолированную от других веток


  • обеспечить плавный и быстрый перенос продакшена с сервера на сервер (всякое бывает, за 5 лет и хостер может смениться, и проекту тесно стать на сервере, хотя бы СУБД вынести на отдельный может быть хорошей мыслью)

На самом деле очень удобно, когда всё настроено уже и из ветки мастер проекта всегда можно развернуть полный аналог продакшена на голой машине буквально в три команды (псевдокод): install git docker && git clone && docker up и никакой возни с конфигами, адресами, именами и т. п. Только доступными ресурсами разве что будут отличаться

Это не факт ни разу. Простой пример: я у себя нашел старый ноут. на него неожиданно для меня встала бунта 16.04. и шустро так работает! дай, думаю, посмотрю, как на нем докерная сборка запустится!
А никак. Не запускается. Полчаса потратил — не взлетело.

Давеча была проблема с сетью в многоконтенерном сетапе, в числе прочего смотрел в глубину версий с подробностями на домашнем компе и на серверах наверху. Все вроде обновляется… пара серверов вообще ничего кроме голой системы и докера не имеет.
так вот, на всех серверах версии докера/compose оказались разными! Да, я потом там чего-то руками пообновлял, туда-сюда, но факт!

Дальше больше. Я понимаю, что это может быть не очень правильно, использовать образ на базе :latest. но это отличный способ получить зоопарк! Наприемр, в разработке образа пересобираются постоянно, версия всегда новая. а на боевом сервере? как часто ребилдится образ? Никогда? ну и получите сюрприз при очередном деплое.
Это обычный сайт который живёт себе на одном сервере, обновляется через git, и горя не знает. Какая тут будет выгода от Docker, кроме лишней головной боли?

Например докер дает повторяемый деплой, а git, по моему опыту, нет. Допустим, у вас после деплоя очередной версии под нагрузкой проявляется какой-то критичный баг. Сколько времени у вас займет возврат к рабочей версии, если проблема вызвана сменой версии какой-то из зависимостей (как pip/npm/watever, так и системной библиотеки)?
Миф №11 — каждый процесс должен находится в отдельном контейнере.
Мифы автор конечно развеял, но не забыл раз 10 прорекламировать свой платный сервис — WatchMeCode
> Во второй половине 2016 года были выпущены официальные релизы Docker для Mac и Windows.
А разве для Windows это доступно не только в сентябрьском 2016 обновлении на Pro версии?
Как насчёт Win7 Home?
Win 7 не поддерживается (ну т.е. будет виртуальная машина), и похоже что не будет. Так что насчет windows это никакой не миф. Поддежка ОС ограничена, и вряд ли будет расширяться на старые ОС,
UFO just landed and posted this here
Ладно с ним Win7, Win10 Home поддерживается?
Там Hyper-V нету, не поддерживается. Из первоисточника:
The current version of Docker for Windows runs on 64bit Windows 10 Pro, Enterprise and Education (1511 November update, Build 10586 or later). In the future we will support more versions of Windows 10.
потому что я не могу редактировать Dockerfile

Dockerfile должен подвергаться редактированию только в том случае, если изменения касаются и production серверов.
Если разработчик не может менять поведение сборки или запуска в зависимости от задач разработки не трогая Dockerfile, то у Вас просто не правильно написан Dockerfile. Поведением сборки можно управлять через build_args, а запуском environments.

Что значит "неправильно"? В чём плюсы сложного докерфайла, который без кучи ключей и не сбилдтся вообще, по сравнению с двумя докерфайлами, один из которых дополняет другой? Два минуса одного сложного по сравнению с двумя простыми для меня очевидны:


  • разработчик, желая облегчить себе разработку, может нечаянно затронуть и общие, и продакшен-ветви сложного файла, тем более что ветвления в самом докере толком нет, где-то внутри RUN оно всё будет в основном, ветвления через bash или аналоги, которые разработчики обычно не очень знают. Хорошо, если что-то простое, типа лишний системный пакет в образе будет, а если какое-то влияние на продакшен-логику окажет?
  • билд и запуск такого образа потребует сложной командной строки, в которой опять-таки легко ошибиться
Что значит «неправильно»?

«неправильно» значит можно было сделать так, чтобы он удовлетворял всем задачам.

В чём плюсы сложного докерфайла

Dev окружение должно быть идентично prod'y. Это не говорит, что Dockerfile должен быть один, но наличие второго файла, который разработчик может изменить как ему угодно существенно повышает риск получить разное окружение. Можно получить расхождение и в предложенном мною варианте, но это не проблема подхода, ибо возможности расширения не должны допускать возможность выстрелить себе в ногу.

без кучи ключей и не сбилдтся вообще

Все возможные «кучи» ключей имеют значение по умолчанию, которые соответствуют production версии. Соответственно prod версия при запуске сборки не требует ввода параметров, за исключением токена к github'y для установки приватных пакетов.

В идеале разработчикам приложения вообще не нужно лезть в Dockerfile и что-то там делать, особенно если они:
обычно не очень знают


билд и запуск такого образа потребует сложной командной строки, в которой опять-таки легко ошибиться

Для запуска dev окружения у нас написан docker-compose.yml со всеми возможными параметрами, которые разработчик может менять для своих нужд. Точнее у нас docker-compose.yml.dist, а docker-compose.yml в gitignore.

лишний системный пакет в образе будет, а если какое-то влияние на продакшен-логику окажет?

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

Вроде как основной docker-flow cостоит в том, что прежде всего разработчики пишут докерфайлы, что результат их работы — образ в докер-репозитории, а не принятый мерж-реквест в гит-репозитории. Ну и пост собственно разработчикам адресован, чтобы не боялись докера, а если докерфайлы и ко пишут специально обученные люди, то чего, собственно бояться?

Образ в докер-репозитории собирает CI на основе всё того же Dockerfile.

Что это, простите, за сборная солянка, где каждый результат работы имеет разные Dockerfile'ы? Это получается на prod может залететь всё что угодно?

прежде всего разработчики пишут докерфайлы

Разработчики должны писать приложение, а не окружение к нему. Окружение нужно один раз грамотно написать и использовать. Я имею ввиду, что это не та часть приложения, которая обычно меняется каждый день.

Ну и пост собственно разработчикам адресован, чтобы не боялись докера, а если докерфайлы и ко пишут специально обученные люди, то чего, собственно бояться?


Вроде суть в том, что люди в принципе боятся его трогать и не используют ни в prod ни в dev. А вовсе не о том, что в одном и том же проекте каждый должен написать свой Dockerfile.
Образ в докер-репозитории собирает CI на основе всё того же Dockerfile.

Если не собрала, то чья эта ответственность? Если разработчик должен разбираться почему, то и у вас результат работы разработчика — образ в репозитории.


Это получается на prod может залететь всё что угодно?

Если у вас контролируется всё, что на прод уходит, то и вредные изменения в Dockerfile не пройдут. Если не контролируется, то и так почти что угодно может залететь.


это не та часть приложения, которая обычно меняется каждый день.

Конфиги приложения обычно тоже не каждый день меняются, но обычно их задаёт разработчик, и только для некоторых их частей разработчик предусматривает штатную возможность изменения при разворачивании, типа одного parameters.ini.dist когда общее число конфигов за десяток.


Вроде суть в том, что люди в принципе боятся его трогать и не используют ни в prod ни в dev. А вовсе не о том, что в одном и том же проекте каждый должен написать свой Dockerfile.

С чего начинается "трогание"? Установили, запустили busybox, чтобы проверить что работает, и пишем свой докерфайл для своего приложения, постепенно (иногда почти моментально) выясняя, что не всё так просто как в примерах в хвалебных статьях, где, например, образ собирается исключительно из публичных репозиториев и никакие секреты ему не нужны. А увидишь пример из реальной жизни типа докерфайла с десятком билдаргументов и тремя десятками енв-переименных для запуска и как-то страшно становится :)

Если не собрала, то чья эта ответственность?

Не собраться он может только в одном случае, если разработчик там что-то поменял. Ибо он лежит по умолчанию рабочий. Я даже больше скажу, на CI сервере он лежит в кеше. И когда разработчик пушит свой код, в Dockerfile отрабатывает только копирование файлов в контейнер и не больше. Если был изменён composer.json то слой с установкой зависимостей тоже пересобирается. Все остальные низкоуровневые задачи в виде установки расширений к php и прочее лежит в глубоком кеше и пересобирается крайне редко. Может быть чуть чаще, чем выходит новая версия php.

Если у вас контролируется всё, что на прод уходит, то и вредные изменения в Dockerfile не пройдут.

Изменения в Dockerfile в 99% случаях просто не нужны. Если у Вас в него постоянно вносятся изменения, поделись, какого рода изменения. Мне интересно, зачем каждому разработчику свой персональный Dockerfile.

Конфиги приложения обычно тоже не каждый день меняются, но обычно их задаёт разработчик, и только для некоторых их частей разработчик предусматривает штатную возможность изменения при разворачивании, типа одного parameters.ini.dist когда общее число конфигов за десяток.

Не совсем понял о чём речь. У нас почти любой параметр из конфига можно переопределить передав его через ENV при старте контейнера. Эти параметры разработчик может менять как угодно, при чём тут сборка контейнера?

Не факт, там может быть composer install тянущий какой-то пакет, у которого сто требованиях стоит ext-*.


Не каждому разработчику, а в каждый проект. Те же расширения PHP устанавливать, например. Ну а в случае дев-окружения там много чего может быть. Кому-то mc хочется, кому-то htop и vim и т. п. — тут уже можно подумать о Dockerfile.dev.dist в репе и Dockerfile.dev в игноре.


О том, что Dockerfile по сути такой же конфиг, меняется редко, но обычно разработчиками. Нередко одновременно с конфигами.

Не факт, там может быть composer install тянущий какой-то пакет, у которого сто требованиях стоит ext-*.

Это как раз повод изменить Dockerfile. Ибо как вы без этих изменений собираетесь это на prod выкладывать? И эти изменения в итоге коснутся всех, когда PR будет принят, а не только dev окружения одного конкретного разработчика.

Не каждому разработчику, а в каждый проект.

Ну естественно, один проект — один Dockerfile.

Ну а в случае дев-окружения там много чего может быть. Кому-то mc хочется, кому-то htop и vim и т. п.

Зачем? Файлы проекта в dev окружении лежат на машине и доступны из IDE. Если надо что-то подправить в конфиге где то в /usr/local/etc/php, его тоже можно пробросить с хоста.
По поводу htop, процессы запущенные внутри контейнера видны в htop с локальной машины как локальные (в линуксе)
Как раз недавно начал «трогать» этого зверя. Где-то неделя в ленивом режиме(часов 10 максимум) на изучение кучи примеров, мануалов, docker-flow и написание своего билда. Да, практически каждый шаг требовал гугления, но гугление проходило без проблем, и решение относительно быстро находилось. У меня как раз кейс переноса среды веб разработки в докер, ибо при переезде на новую машину захотелось избавиться от зоопарка левых библиотек на компе, которые накопились при разработке десятка вполне «однотипных» проектов с небольшими отличиями.

Можно считать минусом то, что написание конфига для докера требует знаний в администрировании, но это так же и плюс — есть возможность подучить что-то новое. Но даже если нет ни знаний, ни желания их получать — копипаста куска конфига из гугла + допиливание напильником по результатам гугления ошибки позволяют собрать контейнер.

Можно назвать минусом ужасные на вид неофита конфиги, но на самом деле это не так часто нужно для работы. Мне для создания окружения пришлось создать всего один короткий DockerFile — чтобы к базовому образу php:5.6-fpm добавить либы mysqlnd, mysqli, redisphp. Nginx, Redis и mariaDB без проблем подтянулсь и настроились из официальных образов. В результате у меня на проект есть — аккуратный docker-compose.yml, один DockerFile для php, два конфиг файла для нгинкса, плюс папки с приложением, логами и БД которые мапятся в нужные контейнеры.

И для других разрабатываемых приложений я просто скопирую этот набор, максимум внесу небольшие правки в него, если понадобится новый модуль или поменять версию одного из текущих, и запущу docker-compose.

Так же, если в фирму придёт новый разработчик на один из проектов для которых у меня готов билд — вместо того чтобы объяснять ему что он должен поднять на своей машине это, то, вот то, а вот это настроить вот так — я ему скину архив с docker проектом, или ссылку на git, если к тому моменту залью это в наш репозиторий.

Я не рассматриваю использование докера на проде, но конкретно для разработчика, особенно если приходится переключаться между разными проектами — он очень удобен. Впрочем, мой коллега вполне успешно для тех же целей использует вагрант.
> В Docker для Mac и Windows есть базовые средства интеграции с Kitematic, например

А в Docker для Linux? раз уж это миф — так развенчайте для всех платформ.
Под Linux можно использовать portainer.

Выше советовали LXC, а я посоветую стек Vagga+Lithos (vagga.readthedocs.io) для дев+прод.
Довольно много проблем докера тут просто не по чувствуются (как и фишки типа изоляции сети, но насколько я знаю работа в этом направлении идёт.

К счастью, разработчики Docker прекрасно понимают необходимость поддержки не только Linux в качестве базовой ОС.
Во второй половине 2016 года были выпущены официальные релизы Docker для Mac и Windows.


На маке volumes нещадно тормозят, проблема открыта с марта 2016 года (актуально для Docker for Mac)
https://forums.docker.com/t/file-access-in-mounted-volumes-extremely-slow-cpu-bound/8076

Да, активно слежу за этой веткой. Сижу на докер бета и периодически в обновлениях пишут что-то типа fix mounted volumes CPU, но к сожалению как тормозило безбожно так и продолжает. Надеюсь разработчики не забили на эту проблему. Пробовал разные сторонние решения типа d4m nfs, но с ним другие проблемы возникают, ибо костыль

Мы откатились на docker toolbox/docker machine.

Вообще тенденция развития docker inc слегка настораживает, уж больно сильно начинает пахнуть упором на платные enterprise-подписки и тотальным vendor lock-in.

elasticsearch почему-то перенёс имаджи в свой приватный репозиторий.
UFO just landed and posted this here
+1, отпочковывание community edition на днях меня не сильно порадовало. Еще и вместо хаба какой-то новый стор… Печально это
Чтобы использовать docker for windows нужна поддержка hyper-v, а она, к сожалению, доступна не во всех редакциях windows -> ссылка
UFO just landed and posted this here
А то, что настройка сетевой коммуникации между контейнерами со временем превращается в ад, это миф?
А можно по-подробнее? Я с таким еще не сталкивался, звучит пугающе
Статья полна ошибок, которые очень хорошо показывают насколько хорошо автор понимает природу контейнеров. Мне было бы стыдно переводить такую статью. Примеры:

While a Docker container may not technically be a full virtual machine, it does run a Linux distribution under the hood.

Docker, как и LXC, не имеет ничего общего с виртуализацией. И поэтому там просто не может быть Linux под капотом. Все контейнеры используют cgroups Linux'ового ядра на «хост-машине». В контейнер можно конечно запихнуть весь userspace обычного Linux'а (как это делается в LXD), но сам Linux не «под капотом», а снаружи (банально внтури контейнера можно выполнить uname -a и будет видно что используется ядро хост-машины)

In the past, Docker on Mac and Windows required the use of a full virtual machine with a “docker-machine” utility and a layer of additional software proxying the work into / out of the vm.

Для работы с Docker (или любым другим cgroups toolchain, таким как LXC например) на Darwin/Windows всегда придется использовать виртуализацию, она просто не может уйти в прошлое, так как (повторяюсь) все контейнеры это обертка к linux cgroups, до тех пор пока Windows и Darwin не перейдут на GNU Linux в качестве ядра, нативных контейнеров там никогда не будет.

Насчёт винды есть нюансы. С одной стороны, МС объявила об "эмуляции" Linux Kernel API в последних виндах, с другой — есть нативные контейнеры, рассчитанные на то, что ядро NT, а не Linux.

Sign up to leave a comment.