Поиск по сайту:

Как и зачем использовать удаленный хост Docker


Программа CLI docker не зависит от демона Docker, который запускает ваши контейнеры. Хотя оба компонента обычно работают на вашем локальном компьютере, вы можете запускать команды docker на удаленном хосте Docker.

Использование удаленного хоста может быть полезно в нескольких сценариях. Вы можете настроить общую установку Docker Engine для небольшой группы разработчиков. Затем каждый разработчик мог подключиться к удаленным контейнерам с помощью своей локальной команды docker exec.

Удаленные хосты чаще бывают полезны, когда у вас есть мощный сервер, который не используется. Если ваш ноутбук работает медленно или у него заканчивается память, использование выделенного хоста Docker в вашей сети может значительно повысить производительность. Вы по-прежнему получаете все удобства локального интерфейса командной строки docker в своем терминале.

Настройка удаленного хоста

Убедитесь, что у вас установлен Docker в системе, которая будет вашим удаленным хостом. Вам нужен только пакет docker-cli на вашем локальном компьютере, так как вы не будете запускать Docker Engine.

Новая установка Docker по умолчанию предоставляет сокет Unix. Для удаленного доступа требуется сокет TCP. Запустите dockerd (исполняемый файл демона Docker) с флагом -H, чтобы определить сокеты, к которым вы хотите привязаться.

sudo dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

Эта команда свяжет Docker с сокетом Unix по умолчанию и портом 2375 на петлевом адресе вашего компьютера. Вы можете привязаться к дополнительным сокетам и IP-адресам, повторив флаг -H.

Флаги необходимо передавать каждый раз при запуске dockerd. Если вы хотите, чтобы они сохранялись после перезагрузки, либо создайте псевдоним оболочки, либо измените определение службы Docker. Вот как вы можете добиться последнего с помощью systemd, который используется в большинстве дистрибутивов Linux для управления службами.

Отредактируйте /etc/systemd/system/docker.service.d/options.conf (или создайте его, если он не существует). Найдите раздел [Service] и измените строку ExecStart:

[Service]
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

Перезагрузите конфигурацию systemd, чтобы применить изменения:

sudo systemctl daemon-reload

Если Docker уже запущен, используйте sudo systemctl restart docker, чтобы перезапустить службу. Демон Docker теперь будет привязываться к TCP-порту 2375 при каждом запуске. Убедитесь, что трафик на порт разрешен конфигурацией вашего брандмауэра. Если вы используете ufw, запустите ufw allow 2375, чтобы открыть порт.

Подключение к удаленному хосту

Интерфейс командной строки Docker использует переменную среды DOCKER_HOST, чтобы определить хост для подключения. Сокет Unix локального демона будет использоваться, если переменная не установлена.

Вы можете использовать удаленный хост для одной команды docker, добавив перед переменной DOCKER_HOST:

DOCKER_HOST=tcp://192.168.0.1:2375 docker run httpd:latest -d

Это запустит новый контейнер из образа httpd:latest с использованием механизма Docker по адресу 192.168.0.1:2375.

Если вы собираетесь запускать несколько команд в одном сеансе, экспортируйте переменную DOCKER_HOST в свою оболочку:

export DOCKER_HOST=tcp://192.168.0.1:2375

docker run httpd:latest -d --name httpd
docker ps
docker rm httpd --force

Вы можете заставить docker всегда использовать удаленный хост, установив DOCKER_HOST глобально в файле конфигурации вашей оболочки. Вот как это сделать в Bash:

echo "export DOCKER_HOST=tcp://192.168.0.1:2375" >> ~/.bashrc

Теперь переменная среды DOCKER_HOST будет устанавливаться каждый раз при запуске вашей оболочки.

Повышение безопасности

Базовый сокет TCP не защищен. Любой, кто может подключиться к вашей машине по сети, может использовать сокет Docker для управления вашими контейнерами.

Docker поддерживает SSH вместо TCP. Обычно это лучший вариант, если на хосте есть доступный SSH-сервер. Это предотвращает доступ неавторизованных пользователей. Использование SSH не требует дополнительной настройки. DOCKER_HOST позволяет передать строку подключения SSH:

DOCKER_HOST=ssh://user@hostname docker run -d --name httpd

В качестве альтернативы вы можете использовать привязки SSH для прямой привязки сокета Docker Unix удаленного хоста к вашему локальному компьютеру:

ssh -L /var/run/docker.sock:/var/run/docker.sock

Теперь вам вообще не нужно использовать DOCKER_HOST. Удаленный docker.sock будет привязан к своему локальному аналогу. Docker автоматически определит это как стандартный сокет Unix.

Использование одного из решений на основе SSH является предпочтительным способом обеспечения безопасности демона Docker. Docker также поддерживает TLS, если вы предоставляете центр сертификации и ключи сервера и клиента:

dockerd --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=0.0.0.0:2375

Теперь клиенты смогут подключаться к порту 2375, если они предъявят действующий сертификат SSL, которому доверяет центр сертификации ca.pem.

Создание контекстов

Docker позволяет настроить несколько «контекстов» для подключения к разным хостам. Контексты можно использовать вместо переменной среды DOCKER_HOST. Они упрощают переключение между несколькими удаленными хостами.

docker context create --docker host=tcp://192.168.0.1:2375 --description remote
docker context create --docker host=unix:///var/run/docker.sock --description local

Эти команды создают два разных контекста — один для вашего локального docker.sock и один для удаленного подключения.

Вы можете переключаться между контекстами с помощью команды docker context use:

docker context use remote

# Container is started on "remote"
docker run httpd:-latest -d

docker context use local

# Lists containers running on "local"
docker ps

Контексты полезны, когда вы работаете с несколькими хостами Docker. С ними меньше хлопот, чем постоянно сбрасывать переменную DOCKER_HOST при перемещении между хостами.

Недостатки удаленных хостов

Ранее мы отмечали, что удаленный хост может повысить производительность сборки. Это утверждение верно только в том случае, если машина, на которой работает Docker Engine, работает быстрее, чем ваше локальное оборудование. Самым большим недостатком удаленного хоста являются дополнительные накладные расходы на взаимодействие по сети. Вы также становитесь зависимым от сети — если вы потеряете подключение, вы не сможете управлять своими контейнерами.

У вас должно быть надежное высокоскоростное сетевое соединение, если вы собираетесь использовать удаленный хост в качестве основного сервера сборки. Первый этап docker build отправляет содержимое контекста сборки вашего образа (обычно это ваш рабочий каталог) в Docker Engine. Это быстро, когда Docker работает локально, но загрузка на удаленную машину может занять гораздо больше времени.

Предоставление доступа к экземпляру демона Docker по сети представляет собой угрозу безопасности. Вы должны убедиться, что доступ ограничен авторизованными пользователями и устройствами. Непреднамеренное раскрытие сокета демона Docker может дать злоумышленникам неограниченный доступ к хосту. Docker обычно работает как root, поэтому очень важно, чтобы только доверенные лица могли запускать контейнеры.

Заключение

Настройка удаленного узла Docker позволяет отделить экземпляры контейнера от локального компьютера для разработки. Выделенный сервер сборки Docker может предложить повышенную производительность и больше места для хранения изображений.

Вы должны позаботиться о проверке безопасности вашей реализации. Простой сокет TCP может быть безопасным в частной сети, но его не следует развертывать в какой-либо конфиденциальной среде. Использование SSH помогает снизить риски, если вы соблюдаете гигиену безопасности SSH, например обязательную аутентификацию на основе ключа.