Разработка и производство с помощью докера с несколькими сайтами

В настоящее время у меня есть 3 сервера linode:

1: Кэш-сервер (Ubuntu, лак)

2: сервер приложений (Ubuntu, nginx, rabbitmq-server, python, php5-fpm, memcached)

3: сервер БД (Ubuntu, postgresql + pg_bouncer)

На моем сервере приложений у меня есть несколько сайтов (topdomains). Каждый сайт находится внутри виртуальной среды, созданной с помощью virtualenvwrapper. Некоторые сайты большие с большим трафиком, а некоторые сайты маленькие с небольшим трафиком.

Типичный сайт состоит из python (django), celery (beat, flower) и gunicorn.

Мой текущий шаблон разработки теперь работает внутри промежуточной среды на сервере приложений и фиксирует изменения в git. Затем измените среду на рабочую среду и выполните git pull, ./manage.py migrate и перезапустите процесс, выполнив sudo supervisorctl restart sitename:, но это требует времени! Должен быть более простой метод!

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

Я просмотрел http://panamax.io и https://github.com/progrium/dokku, но не уверен, что один из них соответствует моим потребностям.

В идеале я бы запускал разрабатываемую версию каждого сайта на своем локальном компьютере (эмулируя сервер кеша, сервер приложений и сервер базы данных), вносил изменения в код и тестировал их. Когда я увижу, что изменения работают, я выполню команду, которая сделает всю тяжелую работу и отправит изменения на серверы linode (я думаю, в основном на сервер приложений), выполню всю миграцию и перезапущу проект на сервере. .

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


person Tomas Jacobsen    schedule 04.02.2015    source источник


Ответы (1)


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

Похоже, что на Docker пока нет готового решения.

Также разочаровывает то, что большинство руководств «Django + Docker» сосредоточены только на одном сайте Django, поэтому они объединяют веб-сервер и все в одном контейнере Docker. Я думаю, что если у вас есть несколько сайтов на сервере, вы хотите, чтобы они совместно использовали один веб-сервер, но это быстро становится сложнее, чем представлено в руководствах, которые уже не очень помогают.

Примерно то, что я придумал, это:

  • использование Fig для управления контейнерами и сложной конфигурацией Docker, которую было бы утомительно постоянно вводить в качестве параметров командной строки.
  • сайты Django, на uWSGI+Nginx (но нет причин, по которым у вас не может быть других)
  • У меня есть репозиторий git для каждого сайта, а также репозиторий git для «сервера».
  • отдельные контейнеры для db, nginx и каждого сайта
  • каждый контейнер сайта имеет свой собственный экземпляр uWSGI... Я делаю некоторые переключения конфигурации, поэтому я могу либо вызвать контейнер «dev» с uWSGI в качестве действующего автономного веб-сервера, либо «живой» контейнер, в котором сокет uWSGI открыт для основного Контейнер Nginx, который затем становится внешним веб-сервером.
  • Я еще не уверен, насколько полезны серверы «dev» uWSGI, я мог бы переключиться на простой запуск сервера разработки Django и совместное использование моего локального каталога кода в качестве тома в контейнере, чтобы я мог редактировать и получать перезагрузку в реальном времени.
  • В репозитории «сервер» у меня есть все общие файлы Dockerfile для сервера Nginx, базовое приложение uWSGI и т. д.
  • В репозитории «сервер» я создал задачи Fabric для развертывания (сервер проверки и репозитории сайта на сервере , создавать образы докеров, запускать fig up и т. д.).

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

Поэтому пока я решил развернуть новый код через Git и собрать новые образы на сервере. Я вообще не использую реестр Docker (кроме общедоступного для базового образа Ubuntu). Кажется, это немного противоречит практике Docker, поэтому мне любопытно получить отзывы.

Я настоятельно рекомендую сначала застрять и создать собственное решение. Если вам нужно потратить время на изучение решения, такого как Dokku, Panamax и т. д., которое может работать или не работать для вас (я не думаю, что какое-либо из них действительно готово), вы также можете потратить это время на непосредственное изучение Docker... тогда будет легче оценивать решения в дальнейшем.

Я пытался использовать Dokku в начале своих поисков, но мне пришлось отказаться, потому что это несовместимо с помощью boot2docker... что означает, что в OS X вы столкнулись с "забавной" настройкой собственного VirtualBox vm для запуска демона Docker. Казалось, это не стоило хлопот, когда я не был уверен, что хочу зацикливаться на том, как работает Dokku в конце дня.

person Anentropic    schedule 04.02.2015
comment
Я думаю, что ключом к возможности запуска нескольких сайтов на одной виртуальной машине с помощью Docker является использование одного контейнера для Nginx и одного контейнера для каждого приложения Django. Затем вы можете указать Nginx обслуживать каждый виртуальный хост (по имени), используя соответствующий контейнер приложения в качестве восходящего потока. - person dukebody; 05.02.2015
comment
на данный момент у меня есть 1 nginx как rp + комбинация контейнеров nginx+uwsgi для каждого сайта (они разделяют postgres). в настоящее время мы развертываем через реестр докеров (собираем локально, тестируем образы, проталкиваем/вытягиваем через реестр) — на хосте нет кода, хост — это просто оболочка для запуска образов докеров, конфигурация nginx для прокси-сервера монтируется в томе и можно изменить, все остальные сайты определяются в файлах docker-compose.yml - person Vincent De Smet; 04.03.2015
comment
Как бы вы делились приложениями между сайтами с такой конфигурацией? - person blissini; 23.12.2015
comment
@blissini, если вы имеете в виду приложения Django, то я бы сказал, что вы не «делитесь» ими между сайтами, каждый сайт находится в своем собственном контейнере и будет pip install нужными ему приложениями django. Ровно так же, как если бы каждый сайт был в отдельном виртуалке локально. Если вы имеете в виду такие службы, как postgres, redis и т. д., то да, они определенно могут быть разделены между сайтами... это управляется вашей конфигурацией docker-compose (ранее fig). - person Anentropic; 24.12.2015
comment
@Anentropic Я говорю о своих собственных приложениях, которыми я хочу поделиться между сайтами. Поскольку они не устанавливаются в pip, должен ли это быть дублирующийся код (по крайней мере, в производстве)? - person blissini; 07.01.2016
comment
ну, я бы любой ценой избегал дублирования кода. вы можете сделать их устанавливаемыми в pip (не нужно публиковать на pypi, их можно установить из репозитория git), или вы можете использовать подмодули git - person Anentropic; 08.01.2016
comment
Интересное решение. Я думал об использовании контейнеров докеров просто для внедрения исходного кода моего приложения django в контейнер apache, который затем мог бы запускать приложение wsgi. Мне больше нравится ваша душа, так как код django фактически выполняется внутри контейнера django. Как вы обслуживаете свои статические и мультимедийные файлы? Они также обрабатываются uWSGI или вы каким-то образом настроили nginx для их обслуживания? - person Tim; 04.03.2016
comment
@TimSchneider для статических файлов. Я использую whitenoise и работаю с Django через uWSGI. . Для медиафайлов вам понадобится энергонезависимая память. Мне неудобно пытаться сделать это с томами докеров, слишком легко ошибиться и потерять их. Я использую S3 через django-storages - person Anentropic; 04.03.2016
comment
Я также хотел бы отметить, что с тех пор, как я написал этот ответ, мир докеров немного продвинулся ... например, docker-machine сделал мои скрипты Fabric устаревшими, поскольку я могу запускать команды docker build из своего локального кли, но против удаленного демона докера - это здорово, мне не нужно загружать большие файлы изображений, просто локальный «контекст сборки» (файл .dockerignore, аналогичный .gitignore, здесь ваш друг), и изображение создается удаленно - person Anentropic; 04.03.2016