16-05-2023

Рекомендации по работе с Docker

Рекомендации по работе с Docker
NJ Soft

Docker — это платформа, но мы будем рассматривать её в единственном экземпляре, как единую программу. Мы используем Docker для создания, разработки и поддержки сетевых (веб) приложений.

Рекомендация № 1

Работать в ОС с ядром Linux (GNU/Linux). Конечно же, ядро должно быть свежее и стабильное — это может послужить решающей точкой безопасности вашего проекта и преимущественным фактором в удобстве использования докера.

Идеальный вариант, когда разработчик использует такое же «ядро ОС» как и «ядро ОС сервера». Docker создавался под Linux и его основанием для работы является технология linux containers (LXC, использующий механизмы namespaces и CGroups из Linux ядра), поэтому в Mac ОС или в Windows работа докера имеет (или имела на момент публикации данной статьи) ряд ограничений, о которых можно почитать, перейдя по ссылкам:

  • https://docs.docker.com/desktop/troubleshoot/known-issues/
  • https://docs.docker.com/desktop/mac/permission-requirements/
  • https://docs.docker.com/desktop/install/windows-install/#about-windows-containers

Рекомендация № 2: Для «больших проектов» используйте docker-compose

Под «большим проектом» в данной статье обозначается программа, использующая другие программы (сервисы): веб-сервер, база данных, брокер очередей, кеширующий сервер, прокси сервер, фтп-сервер и т. д.

Подробнее про docker-compose можно почитать в официальной документации, перейдя по ссылкам:

  • https://docs.docker.com/compose/
  • https://docs.docker.com/compose/features-uses/

Рекомендация № 3: Задавайте контейнерам ограничения

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

  • Ограничивайте размер оперативной памяти контейнера (флаг -m, --memory): если контейнер съест всю память на сервере, то ОС выбросит исключение OOME и начнёт завершать процессы в непредсказуемой последовательности, что может привести к падению сервера или конкретного контейнера. Подробные параметры читайте в документации по ссылке https://docs.docker.com/config/containers/resource_constraints/#memory
  • Управляйте ресурсами CPU (ограничивайте или повышайте). По умолчанию каждый контейнер имеет неограниченный доступ к процессору. Можно ограничить: количество ядер, используемых контейнером (--cpuset-cpus), ресурсы процессора (--cpus), а также задать «приоритетность» работы со стороны «ядра ОС» с помощью --cap-add=sys_nice, ulimit rtprio, --cpu-rt-runtime. Подробные параметры читайте в документации по ссылке: https://docs.docker.com/config/containers/resource_constraints/#cpu
  • Если настраиваете Ipv4 адреса вручную, то делайте это с учётом локальных и публичных адресов. Не настраивайте внутренний контейнер на публичный IP-адрес.
    Подробнее про IP адреса по ссылке: https://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%BD%D1%8B%D0%B9_IP-%D0%B0%D0%B4%D1%80%D0%B5%D1%81

Рекомендация № 4: Убедитесь, что ваш docker не виден из Интернет

У docker есть API, которое управляет контейнерами. Например, когда мы вызываем команду docker ps -a, она выполняет обращение в API. Сделано это для того, чтобы вы сами имели возможность создать «своё облако» и управлять контейнерами «на расстоянии» (из других сетей, например посредством HTTP REST протокола). Это мощный инструмент, который позволяет создавать масштабируемые приложения и программы для их масштабирования.

Поэтому будьте внимательны, если ваш проект не требует управления контейнерами извне, то проверьте конфигурацию /etc/docker/daemon.json и параметры запуска из ОС (для systemd – это конфиг в файле /lib/systemd/system/docker.service, в зависимости от используемой системы инициализации или дистрибутива linux, путь может отличаться). В конфигах не должно быть параметров -H tcp://0.0.0.0:2376 и т. п.

Изучите эти параметры в документации, а затем проверьте ваш сервер с докером на предмет открытых портов 2375 и 2376. При этом, если есть требование использовать HTTP API для управления вашими контейнерами, то обязательно используйте авторизацию через SSL-сертификаты. Подробнее по ссылке: https://docs.docker.com/engine/security/protect-access/#use-tls-https-to-protect-the-docker-daemon-socket

Рекомендация № 5: Обращайтесь в NJSoft за помощью.

У нас много опыта в работе с докером ;-)

dev docker