Как запускать cron jobs для docker-контейнеров?

Следуя хорошим практикам работе с Docker, в каждом контейнере должно быть запущено одно и только одно приложение. Как только приложение завершает работу — контейнер останавливается. Эти ограничения заставляют посмотреть на работу с cron задачами по-другому. Конечно, законами физики не запрещено в каждый контейнер устанавливать более одного приложения и запускать крон прямо изнутри контейнера. Однако, это может привести к сложностям и проблемам, особенно когда ваши приложения разрастутся на более чем один сервер. Читать далее Как запускать cron jobs для docker-контейнеров?

Можно ли использовать Redis внутри Docker в продакшене как основное хранилище данных?

Redis очень неплох. Всё больше разработчиков и компаний выбирают его не только в качестве кэширующего in-memory сервиса или системы очередей, но в и в качестве основного хранилища данных, взамен MySQL или Postgres. Да, именно так. Благодаря поддержке разнообразных структур данных, таких как: строки, списки, множества, упорядоченные множества и хэш-таблицы, на Redis отлично перекладывается большинство типичных данных, которые исторически было принято хранить в реляционных СУБД.

Но и это ещё не всё. Редис умеет и некоторые специфические вещи, например, HyperLogLog. (Здесь нужно дописать о всех современных фичах Редиса). Так стоит ли использовать редис в качестве основного хранилища данных? Так же эту заметку можно рассматривать в контектсте любой другой key-value базы данных с похожим внутренним устройством, например, любимая многими MongoDB. Читать далее Можно ли использовать Redis внутри Docker в продакшене как основное хранилище данных?

Ротация логов docker контейнеров

В продолжение прошлой статьи рассмотрим пример настройки ротации логов контейнеров на примере CentOs 7. В моём случае stdout и stderr контейнеров никакой ценности не имеют, а все значимые события пишутся либо в примонтированные директории, либо в Apache Kafka. В ротации логов внутри самих контейнеров не вижу смысла.

Читать далее Ротация логов docker контейнеров

Что делать с Error opening terminal: unknown?

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

Error opening terminal: unknown.

Лечится это проще простого, достаточно выполнить:

export TERM=xterm

И затем повторно запустить приложение.

Error getting container from driver devicemapper: Error mounting: device or resource busy

Что делать, если во время старта docker-контейнера появляется ошибка вроде такой?

Error response from daemon: Cannot start container [container]: Error getting container [id] from driver devicemapper: Error mounting '/dev/mapper/docker-252:3-528078-[id]' on '/var/lib/docker/devicemapper/mnt/[id]': device or resource busy
Error: failed to start containers: [[container]]

Достаточно выполнить:

umount /var/lib/docker/devicemapper/mnt/[id]

Где, [id] — идентификатор контейнера. После чего можно ещё раз запустить контейнер.

Такая ситуация может возникнуть, если docker daemon внезапно завершился, например при недостаточном количестве свободной памяти.

Чистка логов docker-контейнеров

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

truncate -s 0 /var/lib/docker/containers/*/*-json.log

Вачдог по-быстрому

Бывают ситуации, когда что-то идёт не так и нужно по-быстрому запилить килялку чего либо и как можно скорее вернуться к выполнению основной задачи. Типичная ситуация: плодятся процессы, которые никто не прибивает, что приводит к утечке ресурсов и тормозам на всём сервере. Самым быстрым способом будет мониторинг количества процессов и рестарту ноды/приложения при достижении критического значения.

while true; do pscnt=$(ps aux | grep [your app] | wc -l); echo "$pscnt"; if (( pscnt > 500 )); then [your app restart]; fi; sleep 2; done

Запуск такого скрипта из консоли будет не лучшей идеей, гораздо надёжнее положить его в крон примерно таким образом:

* * * * * pscnt=$(ps aux | grep [your app] | wc -l); echo "$pscnt"; if (( pscnt > 500 )); then [your app restart]; fi; >> /var/log/watcher.log

Ну и конечно при первой возможности разобраться с причинами этой ситуации.

Portainer — web-ui для управления Docker

Короткая заметка о том, как упростить себе жизнь при работе с докером. Если честно, это это единственная админка, которую я пробовал ставить, но на данный момент она покрывает 80% моих задач, и лишь в 20% случаев приходится заходить в консоль и писать команды ручками, в частности, при работе с docker-compose. Наверняка существуют более продвинутые решения, но это уже тема для полноценного ресёрча.

Картинки по запросу Portainer docker compose

Читать далее Portainer — web-ui для управления Docker

Интересные решения с HighLoad Cup

В августе 2017 года Mail.Ru Group провёл чемпионат для backend-разработчиков HighLoad Cup. Суть конкурса проста: используя любой стек технологий написать как можно более производительное приложение под ограниченные серверные ресурсы обрабатывающее заранее определённый набор запросов и упаковать его в docker контейнер. Естественно, в лидерах оказались решения на C/C++, Java, GoLang. Что удивительно, PHP стек оказался производительнее NodeJS и Python решений. Читать далее Интересные решения с HighLoad Cup

Основы Docker

И ещё одна интересная выжимка фактов о докере, которая поможет в кратчайшие сроки начать его продуктивное использование.

Цель данной статьи собрать в небольшую кучку основную информацию, минимально достаточную для того, чтобы начать работать с докер на ежедневной основе и удалить с рабочей машины локально установленные apache, mysql, virtualenv, python3, mongodb, memchaced, redis, php5, php7 и весь остальной зоопарк, который мы используем при разработке, и который зачастую еще и конфликтует между собой от версии к версии.

Читать далее Основы Docker