metalnikovg.ru
MetalnikovG.ru

Docker Socket Proxy - прокси-сервер для безопасного и удаленного доступа к API сокета Docker

Dsp_banner.png
Опубликовано
//
2 мин. чтения

Docker Socket Proxy — это инструмент, который предоставляет безопасный и удаленный доступ к API сокета Docker через прокси. Он ограничивает доступ к определённым операциям API сокета Docker, что помогает снизить риски безопасности, связанные с прямым доступом к Docker Socket (/var/run/docker.sock).

Для чего это нужно?

Docker Socket (/var/run/docker.sock) — это UNIX-сокет, который позволяет взаимодействовать с Docker Daemon. Если контейнеру предоставлен доступ к этому сокету, он может управлять всеми контейнерами и образами на хосте, что представляет собой угрозу безопасности. Docker Socket Proxy решает эту проблему, ограничивая доступ только к необходимым операциям. Так же с помощью него вы можете получить доступ к удаленному Docker Socket через TCP-соединение tcp://hostname_or_ip:2375 для управления контейнерами и получения сведений о них.

Реальные примеры использования

  • У вас имеется несколько Docker хостов и вы хотите управлять контейнерами на них с помощью Portainer, но не хотите разворачивать его или агент на каждом хосте. Развернув Docker Socket Proxy на каждом хосте, вы можете подключить все ваши хосты в единственный экземпляр Portainer с помощью API
  • Мониторинг контейнеров с удаленных Docker хостов с использование одного экземпляра Uptime Kuma
  • Подключение к контейнерам на удаленных Docker хостах и их мониторинг в приложении Homepage

Как это работает?

Docker Socket Proxy запускается как отдельный контейнер, который выступает в роли прокси между Docker Daemon и другими контейнерами. Он фильтрует запросы к Docker API, разрешая только определённые действия, такие как:

  • Запуск/остановка контейнеров.
  • Получение информации о контейнерах.
  • Ограничение доступа к критическим операциям (например, удаление контейнеров или образов).

Запускаем Docker Socket Proxy

Создаем файл docker-compose:

docker-compose.yml
services:
  dockerproxy:
    image: ghcr.io/tecnativa/docker-socket-proxy:latest
    container_name: dockerproxy
    environment:
      - INFO=1
      - CONTAINERS=1
      - IMAGES=1
      - VOLUMES=1
      - SERVICES=1
      - TASKS=1
      - NETWORKS=1
      - POST=1 #When disabled, only `GET` and `HEAD` operations are allowed, meaning any section of the API is read-only.
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 2375:2375
    restart: unless-stopped
networks: {}

В enviroment мы перечисляем разделы API, а с помощью значений 0 или 1 запрещаем или предоставляем к ним доступ. Более подробно про управление доступом к определенным разделам API вы можете прочитать здесь

TIP

Чтобы подключить контейнер к Docker Socket Proxy вместо /var/run/docker.sock используйте следующую переменную окружения:

your-app:
image: your-app-image
environment:
  - DOCKER_HOST=tcp://dockerproxy:2375

Заключение

Мы развернули Docker Socket Proxy для безопасного и удаленного подключения к сокету docker.