
Зачем Zerotier в Docker?
Представьте: у вас есть микросервисы, развернутые на разных облачных провайдерах, на локальных серверах и даже на домашнем Raspberry Pi. В обычных условиях им сложно общаться друг с другом — мешают NAT, фаерволы, разные подсети.
Zerotier решает эту проблему — он создает виртуальную LAN-сеть (VPN второго уровня), в которой все устройства получают IP-адреса и видят друг друга так, будто они подключены к одному коммутатору.
Почему Zerotier лучше других решений:
| Характеристика | Zerotier | OpenVPN | WireGuard |
|---|---|---|---|
| Простота настройки | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
| Работа без открытых портов | ✅ Да | ❌ Нет | ❌ Нет |
| Поддержка Docker | ✅ Отличная | ⚠️ Сложная | ⚠️ Средняя |
| Скорость | Высокая | Средняя | Очень высокая |
| Бесплатный тариф | До 100 устройств | Ограничен | Полностью |
Итог: Zerotier — идеальный выбор для распределённых Docker-приложений, особенно если у вас нет возможности открывать публичные порты.
Архитектура решения
Вот как будет выглядеть наша инфраструктура:
text
┌─────────────────────────────────────────────────────────┐
│ Zerotier Central │
│ (my.zerotier.com) │
│ Сеть: 192.168.192.0/24 │
└────────────────────┬────────────────────────────────────┘
│ (виртуальный L2-коммутатор)
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Хост 1 │ │ Хост 2 │ │ Хост 3 │
│ AWS EC2 │ │ Hetzner │ │ Домашний │
│ │ │ │ │ ПК │
│ Контей- │ │ Контей- │ │ Контей- │
│ нер A │ │ нер B │ │ нер C │
│ .101 │ │ .102 │ │ .103 │
└─────────┘ └─────────┘ └─────────┘
Все контейнеры получают IP из диапазона 192.168.192.x и могут общаться напрямую.
🛠 Предварительные требования
Перед началом убедитесь, что у вас есть:
- Хост-машина с Linux (Ubuntu 20.04/22.04/24.04) или macOS
- Установленный Docker (версия 20.10+)
- Установленный Docker Compose (опционально, но рекомендуется)
- Аккаунт на my.zerotier.com (бесплатный)
- Базовые знания командной строки
Шаг 1. Установка Zerotier на хост-машину
Zerotier должен быть установлен на каждом хосте, где будут работать контейнеры.
📦 Установка на Ubuntu/Debian
bash
# Добавляем официальный репозиторий и устанавливаем curl -s https://install.zerotier.com | sudo bash # Проверяем установку zerotier-cli --version
🍏 Установка на macOS
bash
# Через Homebrew brew install --cask zerotier-one # Запускаем сервис sudo /Applications/ZeroTier-One.app/Contents/MacOS/ZeroTier-One &
🪟 Установка на Windows
Скачайте установщик с официального сайта и запустите его. После установки Zerotier будет работать как служба Windows.
Шаг 2. Создание и настройка сети в Zerotier
2.1. Регистрация и создание сети
- Перейдите на my.zerotier.com и войдите в аккаунт.
- Нажмите «Create A Network».
- Скопируйте Network ID — он будет выглядеть как
abcdef1234567890. - Нажмите на созданную сеть для настройки.
2.2. Настройка параметров сети
В настройках сети укажите:
| Параметр | Рекомендуемое значение |
|---|---|
| IP Range | 192.168.192.0/24 |
| Description | Docker Cluster Network |
| Private/Public | Private (рекомендуется для безопасности) |
| Default Route | No (чтобы не перенаправлять весь трафик) |
Сохраните изменения.
2.3. Подключение хоста к сети
На каждом хосте выполните:
bash
# Подключаемся к сети sudo zerotier-cli join <NETWORK_ID> # Проверяем подключение sudo zerotier-cli listnetworks
После этого в веб-интерфейсе Zerotier появится новый член сети. Авторизуйте его (поставьте галочку «Auth»).
💡 Важно: IP-адрес хоста в сети Zerotier будет выдан автоматически. Запомните его — он понадобится для настройки контейнеров.
Шаг 3. Запуск контейнеров с Zerotier (базовый способ)
Самый простой способ — запустить Zerotier в отдельном контейнере и поделиться его сетью с другими контейнерами.
3.1. Создаём Dockerfile
Создайте файл Dockerfile:
dockerfile
FROM ubuntu:22.04
# Устанавливаем зависимости
RUN apt-get update && apt-get install -y \
curl \
net-tools \
iproute2 \
iptables \
&& rm -rf /var/lib/apt/lists/*
# Устанавливаем Zerotier
RUN curl -s https://install.zerotier.com | bash
# Создаём точку входа
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
3.2. Создаём entrypoint-скрипт
Файл entrypoint.sh:
bash
#!/bin/bash
# Запускаем Zerotier в фоне
/usr/sbin/zerotier-one -d
# Ждём, пока Zerotier запустится
sleep 5
# Подключаемся к сети (переменная окружения)
if [ -n "$ZEROTIER_NETWORK_ID" ]; then
zerotier-cli join "$ZEROTIER_NETWORK_ID"
echo "Подключение к сети $ZEROTIER_NETWORK_ID"
fi
# Бесконечный цикл, чтобы контейнер не завершался
tail -f /dev/null
3.3. Сборка и запуск
bash
# Собираем образ
docker build -t zerotier-client .
# Запускаем контейнер с правами на управление сетью
docker run -d \
--name zerotier \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
-e ZEROTIER_NETWORK_ID=abcdef1234567890 \
zerotier-client
3.4. Проверяем подключение
bash
# Заходим в контейнер docker exec -it zerotier bash # Проверяем статус zerotier-cli listnetworks # Должны увидеть вашу сеть со статусом OK
Шаг 4. Продвинутый подход: Docker Compose + сетевой режим host
Для продакшена лучше использовать Docker Compose и режим host — это упрощает взаимодействие контейнеров.
4.1. Структура проекта
text
project/
├── docker-compose.yml
├── zerotier/
│ ├── Dockerfile
│ └── entrypoint.sh
└── app/
└── Dockerfile (ваше приложение)
4.2. Файл docker-compose.yml
yaml
version: '3.8'
services:
zerotier:
build: ./zerotier
container_name: zerotier
network_mode: host # Критично: используем сеть хоста
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- ZEROTIER_NETWORK_ID=${ZEROTIER_NETWORK_ID}
restart: unless-stopped
volumes:
- zerotier-data:/var/lib/zerotier-one # Сохраняем состояние
app1:
build: ./app
container_name: app1
network_mode: "service:zerotier" # Используем сеть контейнера zerotier
depends_on:
- zerotier
environment:
- ZEROTIER_IP=192.168.192.101 # Статический IP для app1
restart: unless-stopped
app2:
build: ./app
container_name: app2
network_mode: "service:zerotier"
depends_on:
- zerotier
environment:
- ZEROTIER_IP=192.168.192.102
restart: unless-stopped
volumes:
zerotier-data:
4.3. Назначаем статические IP через Zerotier
В веб-интерфейсе Zerotier для каждого подключённого устройства (контейнера) можно вручную задать IP-адрес. Это гарантирует, что ваши сервисы всегда будут доступны по одним и тем же адресам.
- Зайдите в настройки вашей сети на my.zerotier.com.
- В разделе «Members» найдите устройство.
- В поле «Managed IPs» введите нужный адрес (например,
192.168.192.101). - Нажмите «Save».
Шаг 5. Проверка работоспособности
5.1. Проверка связи между контейнерами
bash
# Заходим в контейнер app1 docker exec -it app1 bash # Пингуем контейнер app2 ping 192.168.192.102 # Должны увидеть успешные ответы
5.2. Проверка через curl
bash
# Если в app2 запущен веб-сервер docker exec app1 curl http://192.168.192.102:8080
5.3. Диагностика проблем
| Проблема | Возможное решение |
|---|---|
| Контейнер не подключается к сети | Проверьте ZEROTIER_NETWORK_ID и авторизацию в веб-интерфейсе |
| Нет IP-адреса в Zerotier | Проверьте, что zerotier-one запущен и имеет доступ к сети |
| Пинг не проходит | Убедитесь, что все контейнеры используют network_mode: host или service:zerotier |
| Контейнер перезапускается | Проверьте логи: docker logs zerotier |
Шаг 6. Автоматизация с помощью переменных окружения
Для удобства создайте файл .env:
env
ZEROTIER_NETWORK_ID=abcdef1234567890 ZEROTIER_APP1_IP=192.168.192.101 ZEROTIER_APP2_IP=192.168.192.102
И используйте его в docker-compose.yml:
yaml
app1:
environment:
- ZEROTIER_IP=${ZEROTIER_APP1_IP}
🔒 Безопасность
- Всегда используйте приватные сети в Zerotier.
- Регулярно проверяйте список авторизованных устройств в веб-интерфейсе.
- Ограничьте доступ к портам внутри контейнеров через iptables или Docker-сети.
- Храните
NETWORK_IDв секретах (например, в GitHub Secrets или HashiCorp Vault).
📈 Производительность и ограничения
| Параметр | Значение |
|---|---|
| Максимальная скорость | До 100 Мбит/с (зависит от канала) |
| Задержка | 10-50 мс (добавляет ~5 мс поверх интернета) |
| Бесплатный тариф | До 100 устройств |
| Платная версия | Неограниченно, с приоритетом трафика |
⚠️ Zerotier не подходит для высоконагруженных систем (например, стриминга видео). Для таких задач используйте WireGuard.
🧪 Полный рабочий пример
Репозиторий с готовым кодом: github.com/yourname/zerotier-docker-example
Структура репозитория:
text
zerotier-docker-example/
├── docker-compose.yml
├── .env.example
├── zerotier/
│ ├── Dockerfile
│ └── entrypoint.sh
└── app/
├── Dockerfile
└── app.py # Простое Flask-приложение
Запуск одной командой:
bash
git clone https://github.com/yourname/zerotier-docker-example cd zerotier-docker-example cp .env.example .env # Отредактируйте .env, укажите свой NETWORK_ID docker-compose up -d
❓ Часто задаваемые вопросы (FAQ)
Вопрос: Можно ли использовать Zerotier без установки на хост?
Ответ: Да, можно запускать Zerotier только внутри контейнера (режим network: host), но это менее стабильно.
Вопрос: Как обновить Zerotier внутри контейнера?
Ответ: Пересоберите образ с новым Dockerfile и перезапустите контейнер.
Вопрос: Поддерживает ли Zerotier IPv6?
Ответ: Да, полностью поддерживает.
Вопрос: Что делать, если контейнер не видит сеть Zerotier?
Ответ: Проверьте, что у контейнера есть права NET_ADMIN и NET_RAW.
🎯 Заключение
Мы создали полноценную виртуальную сеть для Docker-контейнеров на разных хостах с помощью Zerotier. Теперь вы можете:
✅ Запускать распределённые микросервисы
✅ Оркестрировать контейнеры без публичных IP
✅ Строить отказоустойчивые кластеры
✅ Разрабатывать и тестировать на локальных машинах, имитируя продакшен
Что делать дальше:
- Изучите официальную документацию Zerotier
- Попробуйте интегрировать Zerotier с Kubernetes (через KubeZt)
- Используйте Zerotier для создания CI/CD-агентов в разных облаках
📚 Полезные материалы
- Официальный сайт Zerotier
- Документация Docker networking
- Бесплатный курс по Docker + Ansible (промокод:
ZT2026)
Плюсы и минусы данного подхода (для принятия решения)
| Плюсы | Минусы |
|---|---|
| ✅ Не нужны публичные IP-адреса | ❌ Дополнительная задержка (~5-15 мс) |
| ✅ Простая настройка | ❌ Ограничение 100 устройств на бесплатном тарифе |
| ✅ Работает через NAT и фаерволы | ❌ Не подходит для высоких нагрузок |
| ✅ Кроссплатформенность | ❌ Требует авторизации новых устройств вручную |