# 🧩 Понимание `/var/run/docker.sock` и `/etc/supervisord.conf` в Docker В Docker-экосистеме есть два ключевых файла, о которых часто слышат DevOps-инженеры: - `/var/run/docker.sock` — **Unix-сокет**, обеспечивающий доступ к Docker API; - `/etc/supervisord.conf` — **конфигурация процесс-менеджера Supervisor**, который управляет фоновыми службами внутри контейнера. Оба файла играют важную роль в управлении контейнерами, но используются для совершенно разных целей. Разберёмся подробно. --- ## ⚙️ 1. `/var/run/docker.sock` — сокет Docker Engine ### 🔹 Что это такое `/var/run/docker.sock` — это **Unix-сокет**, через который клиенты (например, `docker CLI` или контейнеры) общаются с **Docker Daemon** (`dockerd`). Проще говоря, это “дверь” в Docker Engine API. 🧠 Когда ты вводишь: ```bash docker ps ```` CLI-утилита не напрямую обращается к демону — она **отправляет HTTP-запрос** по сокету `/var/run/docker.sock`. Демон отвечает JSON-ответом, который CLI красиво форматирует в таблицу. --- ### 🔹 Где он находится Файл сокета создаётся Docker-демоном при запуске: ``` /var/run/docker.sock ``` Это обычный UNIX-сокет (аналог TCP-порта, но в файловой системе). Права доступа обычно: ```bash srw-rw---- 1 root docker 0 Nov 12 12:00 /var/run/docker.sock ``` --- ### 🔹 Для чего его монтируют в контейнеры Если контейнеру нужно управлять другими контейнерами или самим Docker-демоном, в него монтируют этот сокет: ```bash docker run -v /var/run/docker.sock:/var/run/docker.sock docker:dind ``` Теперь процесс внутри контейнера может обращаться к Docker API как к локальному сервису. 📘 Примеры использования: - Portainer, Watchtower, Docker Compose — все они используют `docker.sock`; - CI/CD-агенты (например, GitLab Runner) запускают контейнеры через этот сокет; - Внутренние инструменты для мониторинга, логирования, автодеплоя. --- ### ⚠️ Важно: безопасность Передача `docker.sock` в контейнер = **передача полного root-доступа к хосту**. Любой, кто имеет доступ к этому сокету, может выполнить команды: ```bash docker run -v /:/host --rm -it alpine chroot /host sh ``` и получить полный контроль над системой. > 💡 Поэтому: > > - Не монтируйте `docker.sock` в недоверенные контейнеры; > > - Используйте proxy-сервисы (например, `docker-socket-proxy`); > > - Настраивайте ограниченные ACL-права или namespace-изоляцию. > --- ## ⚙️ 2. `/etc/supervisord.conf` — управление процессами внутри контейнера ### 🔹 Что такое Supervisor `supervisord` — это **процесс-менеджер**, который запускает и отслеживает работу нескольких сервисов в одном контейнере. Он нужен, если контейнер должен выполнять **несколько задач одновременно**. По умолчанию Docker предполагает, что **один контейнер = один процесс**, но иногда нужно больше: например, `nginx` + `php-fpm`, или `cron` + `app`. --- ### 🔹 Файл конфигурации `/etc/supervisord.conf` Это основной конфигурационный файл Supervisor, где описаны все процессы, их команды, перезапуск и логи. Пример: ```ini [supervisord] nodaemon=true logfile=/var/log/supervisor/supervisord.log [program:nginx] command=/usr/sbin/nginx -g "daemon off;" autostart=true autorestart=true stderr_logfile=/var/log/nginx.err.log stdout_logfile=/var/log/nginx.out.log [program:php-fpm] command=/usr/sbin/php-fpm7.4 -F autostart=true autorestart=true stderr_logfile=/var/log/php-fpm.err.log stdout_logfile=/var/log/php-fpm.out.log ``` --- ### 🔹 Пример использования в Dockerfile ```dockerfile FROM ubuntu:22.04 RUN apt-get update && apt-get install -y supervisor nginx php-fpm COPY supervisord.conf /etc/supervisord.conf CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"] ``` Теперь при запуске контейнера Supervisor поднимает и `nginx`, и `php-fpm` в одном окружении. --- ### 🔹 Основные параметры |Параметр|Назначение| |---|---| |`nodaemon=true`|Запуск в foreground (чтобы контейнер не завершался)| |`autostart=true`|Автоматический старт при запуске контейнера| |`autorestart=true`|Перезапуск процесса при сбое| |`stdout_logfile`|Путь к логам stdout| |`stderr_logfile`|Путь к логам stderr| --- ### 🔹 Команды Supervisor |Команда|Описание| |---|---| |`supervisorctl status`|Проверить статус процессов| |`supervisorctl restart all`|Перезапустить все программы| |`supervisorctl stop nginx`|Остановить отдельную службу| |`supervisorctl reread && update`|Применить изменения конфигурации| --- ## ⚖️ `/var/run/docker.sock` vs `/etc/supervisord.conf` |Функция|`/var/run/docker.sock`|`/etc/supervisord.conf`| |---|---|---| |Тип|Unix-сокет|Конфигурационный файл| |Назначение|Управление Docker Engine|Управление процессами внутри контейнера| |Кто использует|Docker CLI, Portainer, CI/CD агенты|Supervisor внутри контейнера| |Основная опасность|Root-доступ к хосту|Неверная настройка процессов| |Когда использовать|Для контейнеров, управляющих другими контейнерами|Для контейнеров с несколькими службами| --- ## 🧩 Заключение - `/var/run/docker.sock` — это **интерфейс к Docker API**, дающий контейнеру возможность управлять Docker-демоном на хосте. Используется в инструментах вроде Portainer, Watchtower, GitLab Runner, но требует осторожности из-за безопасности. - `/etc/supervisord.conf` — это **файл управления процессами** внутри контейнера, используемый `supervisord` для запуска нескольких сервисов в одном окружении. 📘 Оба инструмента — мощные и полезные, но служат **разным уровням контроля**: один управляет **внешней инфраструктурой**, другой — **внутренней жизнью контейнера**. ---