@maqstein
Python developer

Докеризация приложения?

Я недавно начал изучать докер и у меня возник вопрос. Как правильно писать приложения чтобы потом можно было спокойно перенести?
В туториалах обычно билдят контейнер из готового приложения, пишут и потом билдят или делают bash скрипт для построения контейнера(кстати я никак не могу понять зачем, ведь все нужное можно описать в Dockerfile)
Я еще нашел вариант запустить контейнер с ubuntu и в нем писать приложение а потом просто измененный контейнер перекидывать куда надо, насколько это костыльно?
Как и в каком виде в итоге нужно разрабатывать приложуху, чтоб не морочится в последствии ?
  • Вопрос задан
  • 3267 просмотров
Решения вопроса 1
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
Слишком пространный вопрос.
Расскажу на примере небольшого приложения на Django
Итак - у вас должно быть как минимум два контейнера - контейнер с приложением и контейнер с базой.
Для базы берете базовый контейнер postgresql, и делаете маппинг директории в вашей локальной системе в базовый контейнер postgresql. Таким образом данные хранятся у вас в локальной системе, и пересобирать образ с postgresql - не требуется.
Теперь организация контейнера с Django. Берете базовый контейнер с python3. Делаете маппинг локальной директории с приложением в контейнер. В этой же локальной директории создаете виртуальное окружение python для запуска проекта. Все - пересборки образа также не требуется - используется базовый образ.
Обычно просто стартуете это все с помощью docker-compose. В контейнере с Django просто запускаете стартовый скрипт, который доустанавливает недостающие пакеты в ваше локальное окружение, делает миграции, собирает статику, и собственно запускает uwsgi.
Вот собственно все.
Проект вместе с docker-compose.yml и стартовым скриптом спокойно переносите куда угодно. При запуске автоматически нужные образы скачаются, а стартовый скрипт соберет нужное окружение и запустит проект.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@vitaly_il1
DevOps Consulting
В целом стоит почитать https://12factor.net/ru/ - но это больше концептуальная статья.
Насчет процесса разработки - есть два пути (и, естественно, варианты между ними):
1) разрабатывать и тестировать по старинке, на своем лаптопе. Когда что-то заработает, запаковать в контейнеры, потом перепаковывать новые версии.
2) И правильный путь - перед тем, как писать код, создать репо в Git, написать CI скрипты для построения images, deploy, testing, ...
И тогда при каждом commit (или только для PR) CI будет запускать тесты, билдить images, и т.д.

Сделать это не так сложно как было десять лет назад - не надо инсталлировать Jenkins или ему подобные программы, в GitHub есть GitHub Actions (с бесплатным планом) в котором на YAML описываем что надо сделать при коммите.
Ответ написан
Комментировать
Философия докера размещать в одном контейнере один сервис.
Например, отдельные контейнеры: MySQL, php-fpm, nginx. Как будто это коробки в локальной сети, видят друг друга. А во внешний мир торчит только порт 443 nginx.

Для удобного управления многоконтейнерным приложением есть Docker Compose. В одном файле docker-compose.yml лаконично описываются все сервисы. Это короче, чем bash скрипт и «так правильно».

Всё в одном контейнере с ubuntu —
плохая практика

Можно и все делать в одном контейнере. Но это мало чем отличается от просто vps. Так же приходится ставить доп. софт, обновления. И потом, чтобы переехать на другой сервер, тащить тяжёлый образ. И никак не масштабировать.
Ответ написан
@scion8337
Backend developer
Вопрос слишком обширен, советую сузить до конкретных вопросов
Но перед тем как разрабатывать приложение используя докер, сначала разберитесь как докер работает. Я, например, использую докер во всех средах - дев, тест, прод
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы