# 🧩 Понимание `/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` для запуска нескольких сервисов в одном окружении.
📘 Оба инструмента — мощные и полезные, но служат **разным уровням контроля**:
один управляет **внешней инфраструктурой**, другой — **внутренней жизнью контейнера**.
---