Настройка docker. Пример настройки и миграции проекта в Docker.

03. марта 2016 docker, MySQL, Заметки 9

Докер — отличная, модная, трендовая технология. Первоначальная настройка docker очень проста, занимает порядка 5-10 минут. За что докер и любят: реализация, поддержка и простота использования контейнеров с приложениями выгодно отличается от голого lxc и openvz.

Несколько очевидных плюсов по сравнению с конкурентами:

  1. Присутствует центральный реестр (docker hub), где хранится и поддерживается большинство распространенных приложений таких как nginx,  mysql, apache, php, logstash, elasticsearch, mongo.  Билд образов происходит автоматически и так же автоматически прогоняются тесты.
  2. Чтобы запустить приложение не нужно знать что внутри контейнера, нужно лишь уметь управлять самим приложением. Достаточно прочитать на странице в docker hub где и какие конфигурационные файлы лежат, и как управлять контейнером в целом. Это на порядок проще настройки с нуля.
  3. В большинстве своем один контейнер-одно приложение, но это легко обойти и пользоваться докером как обычной системой виртуализации.
  4. Одна и та же сборка со всеми библиотеками и настройками может быть запущена где угодно. Отсутствием проблем с переносимостью.
  5. Простота развертывания собственного docker-registry. По сути это следствие п.1, образ docker-registry является официальным, он тестируется и своевременно обновляется.
  6. Шикарная документация и мощнейшее, хоть и молодое, сообщество.

В рунете статей на тему миграции в docker подозрително мало. Расскажу о своем опыте перевода этого сайта, т.е. простого lamp в докер. Кажется сложным, но по времени первая настройка голого lamp субъективно занимает времени больше чем то же хозяйство разворачивать в docker.

Системные требования весьма неприхотливые: https://docs.docker.com/engine/installation/binaries/. Основа — ядро 3.10 заведется и на более старых но работать с докером не так комфортно, изза отсутствия поддержки нескольких фич. Важнейшей из которой считаю возможность работы внутри контейнера для отладки. Пример такой работы будет показан ниже.

Обновление ядра описано в заметке:

Depends: initramfs-tools (>= 0.110~) Апгрейд ядра debian.

Мастер класс по установке докера однострочником:

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

 

Теперь нужно определиться c образами контейнеров:

  1. Nginx — входящий балансировщик
  2. php — понятно что без тебя вордпрессу никуда. Мы будем использовать apache, ибо я не извращенец вордпрес на fpm держать. Пробовал плювался =)
  3. mysql — база
  4. sftp и фтп — для доступа к файлам. Установку этого софта рассмотрю в другой статье вместе с docker-compose.

Поскольку мы все это будем запускать хоть на одной машине но в изолированных контейнерах — необходимо контейнеры слинковать. Процесс это простой — линк, в нашем случае — это запись в /etc/hosts. Элементарно. Все что относится к докеру но не должно находиться внутри контейнеров — логи, исходники, базы данных и хомяки пользователей мы будем класть в папочку /srv/docker.

Итак поехали:

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

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

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

Детально про ключи.

С php-fpm немного длиннее, но тоже не очень сложно. Нужно взять за основу официальную сборку php-fpm и на основании ее собрать свой собственный, с включенными модулями. Для этого нужно создать папку в которую положим файл описания контейнера Dockerfile и собственно собрать контейнер.

Если все сделали правильно — сборка пройдет удачно. Обратите внимание что если нужно переключиться на другую ветку пхп достаточно только поменять строку в начале файла. Здесь используется последняя стабильная сборка php-5.6.

Запускаем и линкуем. Этому контейнеру нужен доступ к базе данных.

 

Далее запускаем nginx (для проверки на порту с единицей на конце). 

 

После чего помещаем файлы вордпреса в папку.

Идем на наш сайт по 81 порту. Если не видим желаемого — ищем ошибку.

Если все в порядке, перезапускаем контейнер уже на 80м и 443м портах и гордимся освоением новой технологии.

 

Для nginx нужно так же предусмотреть ротацию логов. Тут никаких особых заморочек не ожидается:

 

Ну и напоследок — зачем мы апгрейдили ядро? Если есть какие-то вопросы к тому что имеем в контейнере, нет четкого понимания что там происходит и как работает или просто нужно протестировать конфиг nginx — нет проблем, идем внутрь контейнера и работаем как привыкли:

Поддержка этой фичи появилась только в новых ядрах.

 

 


9 отзывов к статье “Настройка docker. Пример настройки и миграции проекта в Docker.”

  • 1
    Леонид в Октябрь 4, 2016 Ответить

    у вас здесь куча нестыковок, такое впечатление что автор содрал статью откуда то даже не проверив её на работоспособность.
    1) — docker упорно не хочет воспринимат имена хостов с подчёркиванием.

    2) — при запуске php-fpm мы делаем вот-такой линк
    -v /srv/docker/casp.ru/var/www/casp.ru:/var/www/html \
    а при запуске nginx уже другой, (может конечно так и нужно и я не понял)
    -v /srv/docker/casp.ru/var/www/casp.ru:/var/www/casp.ru:ro

    3) из какой директории нужно выполнять скрипт для php-fmp?
    я решил что из директории docker но есть и варианты, так-как в первоначальной структуре директорий нет php-caspru — может имеет смысл вынести создание директории вначало, а здесь оставить только переход в неё?

    mkdir php-caspru ; cd php-caspru

    4) — вначале статьи мы создали структуру с такими папками
    mkdir -p /srv/docker/nginx/etc
    mkdir -p /srv/docker/nginx/log
    а линкуем другие — откуда взялось подчёркивание в имени директории «nginx_in»?
    -v /srv/docker/nginx_in/log:/var/log/nginx:rw \
    -v /srv/docker/nginx_in/etc/nginx:/etc/nginx/:ro \

    5) — ip-адресс в команде запуска nginx — это магический IP ? можно ли указать там localhost или 127.0.0.1 ?

    6) — «После чего помещаем файлы в папку.» Какие файлы, откуда? Если это скачанный вордпресс — так и напишите, а может туда нужно что-то ещё закинуть.

    7) ну и наконец «помещаем файлы в папку /srv/docker/casp.ru/var/www» ?
    у нас линк настроен на «www/casp.ru »
    -v /srv/docker/casp.ru/var/www/casp.ru:/var/www/html \
    будет ли вообще сервер видеть наши «файлы» ?!

    • 2
      root в Октябрь 4, 2016 Ответить

      Приятно такое вдумчивое изучение! Продолжайте в том же духе!
      Статьи все пишу сам и до недавнего времени это были записки в блокноте, из разряда «чтобы не забыть».

      По теме:
      1. Докер уже нормально работает с подчеркиванием в имени хоста — просто обновитесь.
      2. Тут все правильно, это рабочий конфиг. fastcgi_param SCRIPT_FILENAME /var/www/casp.ru/$fastcgi_script_name;
      3. Use docker-compose Luke!
      5. На сервере несколько адресов, для балансера отдал один. Можно использовать и localhost но смысла в этом нет.
      4,6,7. Да, вордпрес. Поправил. Спасибо!

  • 3
    Леонид в Октябрь 4, 2016 Ответить

    Спасибо за быстрый ответ, приятно когда коментарии читает автор :)
    1) по поводу докера — перепроверю,
    вот мой результат docker -v
    Docker version 1.12.1, build 23cf638
    3)я понимаю что расположение здесь не принципиально, но меня больше волновал вопрос где создать директорию php-caspru, у меня она в директории ‘docker’

    ps — docker-compose в другой статье ;)
    ——————
    у меня возникла одна проблема :
    если оставить линк в nginx
    -v /srv/docker/nginx_in/etc/nginx:/etc/nginx/:ro \

    то он переписывает папку с конфигом nginx и падает из-за этого так как не находит конфиг-файла, а если убрать — то не открывает index.php — файл, то есть не воспринимает их как index, а работает только с *.html

  • 4
    root в Октябрь 4, 2016 Ответить

    Версия докера аналогична вашей. Настроено все под Centos7, детально версии софта вот:

    $ docker -v
    Docker version 1.12.1, build 23cf638
    $ docker-compose -v
    docker-compose version 1.6.2, build 4d72027
    $ uname -a
    Linux srvdocker02-std.molodejj.tv 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    $ cat /etc/redhat-release
    CentOS Linux release 7.2.1511 (Core)

    Вот подчеркивание в хостнейме:
    # docker ps |grep nginx_in
    adf3b647f77f nginx:latest «nginx -g ‘daemon off» 12 days ago Up 12 days 5.9.193.100:80->80/tcp, 5.9.193.100:443->443/tcp nginx_in

    По поводу nginx — его можно использовать как балансировщик и проксировать все запросы целиком на бекенд, а там запускать docker c apache внутри, тогда можно ничего внутрь контейнера с nginx не монтировать.

  • 5
    Alexey в Февраль 1, 2017 Ответить

    Спасибо за идею с logrotate.

    Только зачем делать перезагрузку всей конфигурации docker exec -it nginx_in nginx -t && docker exec -it nginx_in nginx -s reload, тогда как для ротации достаточно переоткрыть лог-файлы docker exec -it nginx_in nginx -s reopen

    • 6
      root в Февраль 1, 2017 Ответить

      Поправлю в статье. Действительно ни к чему, спасибо.

  • 7
    Александр в Май 4, 2017 Ответить

    При выполнении данных команд
    docker run -d —name nginx_in -h nginx_in \
    -v /srv/docker/shevchenkoav.ru/var/www/shevchenkoav.ru:/var/www/shevchenkoav.ru:ro \
    -v /srv/docker/nginx_in/log:/var/log/nginx:rw \
    -v /srv/docker/nginx_in/etc/nginx:/etc/nginx/:ro \
    —link php_shevchenkoavru:php_shevchenkoavru \
    -p 801:80 \
    -p 4431:443 \
    nginx

    получаю: docker: invalid reference format.
    Подскажите в чем может быть дело

    • 8
      root в Май 23, 2017 Ответить

      Первое гугление выводит на этот баг: https://github.com/moby/moby/issues/25599
      Но так же я вижу длинные тире вместо двойных дифисов. Попробуйте заменить —name на —name и тоже самеое с —link если это не форматирование сайта.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.