• Для чего нужен Docker?

    @mik222
    Сначало объясню на конкретном примере, а потом приведу архитектурное объяснение:
    ------------
    Например, вы разрабатываете некоторый гейт-аггрегатор четырех систем. Одна из них на WordPress, другая на Drupal третья самописная на Django и четветрая: реалтайм чат на Meteor.js и Mongo.
    ---------
    Проблема заключается еще и в том, что WordPress и Drupal требуют разных настроек PHP(или вообще разных их версий). А так-же разных настроек Apache/Nginx.
    ---------
    Вам также нужно легко переключатся между системами базами, и желательно, каждую из них держать в отдельной папке в сабфолдере проекта(и без абсолютных линков, чтобы можно было легко заменять подсистемы в других проектах)
    --------
    Чтобы крыша не потекла не у вас ни у компьютера, ни у человека который будет это деплоить нужна система которая позволит:
    • Инкапсулировать кишки каждого фреймворка/cms. Вот это не нормально.
      Это клиника. До создания докера люди этим честно занимались(часов 5 может уйти)
    • Иметь стандартизированный интерфейс, котрый будет
      • достаточно абстрактным чтобы уйти от конкретных деталей каждой платформы
      • достаточно конкретным, чтобы абстракции не текли, т.е. не приходилось городить костыли чтобы обойти неуместную абстракцию.

    • Иметь возможность композиции различных компонентов системы

    =========
    Штука в том, что у Докера это получилось. Это и вкусная система отзеркаливания системных портов/нужных папок, конфигурирование через переменные среды.
    По факту же, контейнер ставится за пять минут(4 из которых скачивается) и тут же на месте конфигурируется в понятном и удобном интерфейсе.
    ==========
    PS. Какой гений придумал html разметку в этом редакторе использовать. Это же неадекват, почему не markdown например.
    Ответ написан
    1 комментарий
  • Для чего нужен Docker?

    @spotifi
    Внутри Docker только Linux, и, экспериментально, FreeBSD. Запускается нативно под Linux и, экспериментально, под FreeBSD. Под MacOSX, Windows - через виртуальную машину.

    Докер - это двойная изоляция. Изоляция того, что лежит внутри контейнера Докера от операционной системы и изоляция операционной системы от того, что лежит внутри Докер. Изоляция подразумевает изоляцию всех файлов, портов, приоритетов.

    Это почти виртуальная машина. Почти, да не совсем.


    Есть такое понятие "ад зависимостей". Любое ПО устанавливаемое на компьютер, тянет за собой зависимости (конфигурационные файлы, статические файлы называемые обычно asset, вспомогательные утилиты/сервисы, библиотеки и пр.). Ряд из этих библиотек/утилит/сервисов несовместим друг с другом. А с учетом того, что каждая из этих библиотек/утилит/сервисов имеет и свои зависимости - ситуация еще хуже.

    Например, мы используем Yandex.Cocaine, которая нормально компилируется только на Ubuntu 14.04 (и, вроде, на Debian 7). Но не под CentOS 6, 7, Debian 8, FreeBSD 9, 10, Ubuntu 15, 16 и пр. - скомпилировать его невозможно. Запускаем в этих операционных системах в Докере.

    С другой стороны, и одновременно с этим, вам необходимо установить другое, более современное ПО. И одновременно более старое. Причем речь даже не идет об серьезно отличающихся версиях Linux. Например, одно ПО требует не менее Ubuntu 14.10, а другое не более Linux 14.04.

    Docker - это одна программа внутри индивидуального окружения с индивидуальной версией операционной системы. За счет слоеных контейнеров, если вы используете один корень для всех образом, то размер Docker контейнера всего-то на несколько килобайтов больше размера бинарного файла, запускаемого под Docker.

    Таким образом, мы имеем бинарный файл запускаемый как бы в своей операционной системе.

    Вы можете сказать - ба, да это же давно известная виртуальная машина. Но нет, это не так. Это так называемые контейнера. Никакой виртуальной машиной там и не пахнет. За исключением Windows и MacOSX, где работа без виртуальном машины пока экспериментально возможно только, а нормой в этих ОС является использование Докера внутри полноценной виртуальной машины.

    Но виртуальные машины с Докером используются только для разработки. Для запуска в production виртуальные машины с Докер не используются.

    Докер использует контейнеры операционной системы. LXC в Linux, Jails в FreeBSD. Контейнер - это область операционной системы, изолированная от основной части операционной системы. В контейнере свое дерево каталогов (включая системные /dev, /bin, /sbin и пр.), свои сетевые порты и пр. и пр.

    Но при этом не используется полная виртуализация. Что существенно экономит ресурсы. Запустить 100 полноценных виртуальных машин вряд ли получится даже на мощном сервере. А вот запустить 100 контейнеров Docker даже на слабом домашнем компьютере - возможно.

    Правда использование не полной виртуализации ограничивает использование операционных систем внутри контейнеров. Как правило, это специально подготовленные версии Linux или FreeBSD. Именно специально подготовленные. Windows - в принципе в контейнере запустить невозможно.

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

    Зачем это используется?

    Ребята из всяческих Dropbox, Facebook и и пр. гигантах, запускающие по 1 млн. различных программ в своих сервисах, столкнулись, что невозможно везде гарантировать идентичные настройки операционной системы. А это критично.

    Вплоть до того, что идеально написанная и оттестированная программа на реальном сервере начинает себя вести непредсказуемо.

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

    Более того - изначально разработчик программного обеспечения тестирует программу в контейнере Докер, с определенными настроками. И в этом же (или с такими же настройками) контейнере Докера программа уезжает на сервер.

    Это позволяет гарантировать гораздо большую идентичность среды разработки и среды исполнения.

    До этого люди мучались, придумывали хитрые инсталяторы...

    Потом плюнули на попытки упорядочить окружение в ОС - и сейчас концепция такова - устанавливать программы на сервера вместе со своими индивидуально настроенными под них операционными системами - то есть внутри контейнеров. 1 контейнер = 1 настройка ОС = 1 программа внутри.

    Другими словами:
    • Докер-контейнер нужно использовать для отладки.
    • Тот же Докер-контейнер нужно использовать и на сервере.


    Это позволяет не трудиться с настройками "под сервер" локально на машине разработчика. Это позволяет разрабатывать на машине разработчика совершенно разные программы одновременно, которые требует несовместимых настроек операционной системы. Это позволяет давать гораздо больше гарантий, что программа на сервере будет вести себя также как и на машине разработчика. Это позволяет разрабатывать под Windows/MacOSX с удобным "прозрачным" тестированием под Linux.

    Докер применим к созданию/настройке только серверного программного обеспечения под Linux (экспериментально под FreeBSD). Не для смартфонов. А если десктопов - то только программное обеспечение без GUI.

    Посколько Докер позволил одним махом упростить работу разработчикам и админам и повысить качество результата - сейчас бум на Докер. Придумано огромная гора инструментов для управления развертыванием приложений созданных с Докером. Если раньше чтобы запустить 10 000 программ на 1000 серверах нужно было как минимум 3 высококвалифицированнейших девопса, которые писали кучу описаний как это сделать на Puppet, Salt, Chef, Ansible, да и то не было гарантий, это все тестилось месяцами. То сейчас с Докер даже один квалифицированных девопс может рулить миллионами программ на десятках тысяч серверов. С куда как большей гарантией, что все это заведется нормально.

    UPD:

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

    Разработчик отдает весь свой результат в систему CI (обычно через git)
    CI на каждый новый коммит делает с помощью Docker образ для тестирования.
    Если тесты проходят успешно, то этот же самый Docker образ, отправляется на развертывание в production.
    Или, чуть иначе в компилируемых системах, где исходники не нужны в production: в Docker производится развертывание среды для компиляции, а для тестирования разворачивается второй образ с уже откомпилированным добром, который уже отправляется в production.

    То есть при правильной огранизации дела разработчик не может/не должен влиять на то, какой будет образ.
    А вот в тестовой среде (запускаемом на сервер, недоступном разработчику в больших командах) и в production как раз используется один и тот же образ.

    Основная идея - что тестировали, ровно то и запускаем на боевом сервере. Один-в-один, включая те же самые файлы (не такие же, а именно те же самые).
    Ответ написан
    16 комментариев
  • Затыки с PDOStatement::execute и MySQL - куда копать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все верно объснили, но никто не написал, как сделать правильно.
    Единственным правильным вариантом использования такой функции будет что-то вроде
    function getСolumn( $db, $sql, $params = null) {
        $stmnt = $db->prepare( $sql );
        $stmnt->execute($params);
        return $stmnt->fetchAll( PDO::FETCH_COLUMN);
    }
    print_r( getColumn( $db, 'SELECT category_name FROM categories') );

    Или, в еще более генерализованном варианте,
    function query( $db, $sql, $params = null) {
        $stmt = $db->prepare( $sql );
        $stmt->execute($params);
        return $stmt;
    }
    print_r( query( $db, 'SELECT category_name FROM categories')->fetchAll( PDO::FETCH_COLUMN) );


    Я настоятельно не рекомендую заниматься экономией на спичках и пытаться скостить себе написание двух SQL операторов. Мало того, что надпись вида getNames( $db, 'categories', 'category_name' ) сторонний человек не поймет без того чтобы заглянуть в описание функции, мало того, что такое написание вызывает ложное чувство безопасности. Но, главное, запрос без параметров очень редко когда бывает нужен, и такая функция большую часть времени просто не будет использоваться.

    SQL - это гениальное изобретение, позволяющее буквально в нескольких словах описать сложнейшие операции с данными. Не надо считать себя самым умным и пытаться "улучшить" SQL, сократив его до лексикона Эллочки-людоедки.

    Код подключения также надо поменять, поскольку возвращать строку из функуции, которая должна возвращать объект - это какая-то бессмыслица, чтобы не сказать еще хуже.
    Вот допустим у нас подключение не удалось. Мы пытаемся использоватьс строку с ошибкой в качество объекта ПДО и... что?

    Не нужно вообще ловить исключения PDO. Они прекрасно могут сообщить о себе сами.
    function dbConnect($dsn, $user, $password) {
        return new PDO( $dsn, $user, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] );
    }
    Ответ написан
    1 комментарий
  • Затыки с PDOStatement::execute и MySQL - куда копать?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Таблицы и колонки нельзя биндить, их нужно указывать явно в тексте запроса.
    Ответ написан
    Комментировать
  • Затыки с PDOStatement::execute и MySQL - куда копать?

    DevMan
    @DevMan
    пдо здесь ни у чем не уиноват: названия колонок/таблиц не могут быть плейсхолдерами, только параметры.
    Ответ написан
    2 комментария