Я буду передавать сокеты на http с помощью инструмента forward, https://github.com/worldline-go/forward, который я запрограммировал.
Этот инструмент прослушивает http запрос и пересылает его в сокет с некоторой фильтрацией методов.
Итак, давайте скачаем или запустим в docker:
Для загрузки посетите страницу релиза
# scratch version
docker pull ghcr.io/worldline-go/forward:v0.1.2
# alpine version
docker pull ghcr.io/worldline-go/forward:v0.1.2-alpine
Этот инструмент запрашивает у вас параметр команды, чтобы показать расположение файла сокета, путь перенаправления и некоторые методы фильтрации.
Здесь я буду перенаправлять все запросы /docker/*
в файл docker.sock
. И я отключу некоторые методы, так что без каких-либо методов фильтрации все методы будут работать.
Использование -
, начинающееся с названия метода, отключает его:
-s /docker.sock:/docker/:-POST,-PUT,-DELETE,-PATCH
export socket to HTTP
version: 0.1.2 commit: b8e86c7 buildDate:2022-06-29T10:46:25Z
Usage:
forward [flags]
Flags:
-h, --help help for forward
-H, --host string Host to listen on, default: 0.0.0.0:8080 (default "0.0.0.0:8080")
-s, --socket stringArray Socket to export: /var/run/docker.sock:/docker/:*,-POST,-PUT,-DELETE
-v, --version version for forward
Позволяет запустить
docker run --rm -p 8080:8080 -v /var/run/docker.sock:/docker.sock ghcr.io/worldline-go/forward:v0.1.2 -s /docker.sock:/docker/:-POST,-PUT,-DELETE,-PATCH
Теперь вызовите службу http, (подробности смотрите в этом документе)
curl http://localhost:8080/docker/containers/json
Я поделился с /docker
путем, поэтому я вызвал с префиксом /docker
, но это только для демонстрации, не нужно устанавливать какой-либо путь.
Теперь мы можем использовать этот инструмент в traefik.
Traefik — это прокси-инструмент, и в режиме роя ему нужна связь docker.sock
для поиска информации о сервисах.
Мы можем подключить docker.sock к Traefik и решить проблему связи, но есть один момент. На рабочих узлах роя docker.sock
не может связаться с swarm-api (по умолчанию). Мы можем исправить эту проблему, запустив forward tool как сервис и установив Traefik в качестве нашего сервиса для связи с docker socket.
Сервис Forward
forward-docker:
image: ghcr.io/worldline-go/forward:v0.1.2
command: "-s /var/run/docker.sock::-POST,-PUT,-PATCH,-DELETE"
deploy:
mode: global
# Just works in manager nodes for swarm API
placement:
constraints:
- "node.role==manager"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- proxy
В статической конфигурации Traefik измените enpoint
providers:
docker:
# endpoint: "unix///var/run/docker.sock"
endpoint: "tcp://forward-docker:8080"
Теперь вы можете реплицировать Traefik на всех узлах роя.