Docker: Открыть удаленный доступ

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

В моем случае, это пригодилось в gitlab-ci, я собираю образ, кладу его в image registry, подключаюсь к удаленному docker серверу и там запускаю собранный образ.

Настройка сервера

Необходимо сконфигурировать сервис docker, что-бы он принимал внешние подключения, это делается в файле /etc/docker/daemon.json

{
    "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
    "tls": true,
    "tlscacert": "/etc/ssl/docker/certs/ca.pem",
    "tlscert": "/etc/ssl/docker/certs/server-cert.pem",
    "tlskey": "/etc/ssl/docker/certs/server-key.pem",
    "tlsverify": true
}

2376 — желаемый порт, на котором будет доступен docker API (его же, необходимо разрешить правилом firewall). Далее указан путь к сертификатам для авторизации, их необходимо сгенерировать. Нужен CA сертификат, сертификат сервера и сертификат для авторизации клиента.

Для удобной генерации сертификата можете воспользоваться скриптом create-certs.sh, создайте директорию для сертификатов, перейдите в неё, скачайте скрипт для генерации сертификатов и дайте ему права на выполнение.

mkdir /etc/ssl/docker/ && cd /etc/ssl/docker/
wget https://raw.githubusercontent.com/kekru/linux-utils/master/cert-generate/create-certs.sh
chmod +x create-certs.sh

Теперь генерируем 3 сертификата для docker API.

./create-certs.sh -m ca -pw KEY-PASSWORD -t certs -e 900
./create-certs.sh -m server -h myserver.example.com -pw KEY-PASSWORD -t certs -e 365
./create-certs.sh -m client -h client1 -pw KEY-PASSWORD -t certs -e 365

KEY-PASSWORD — стоит поменять на рандомный пароль, который будет использован для защиты закрытого ключа. Все сгенерированные сертификаты будут помещены в директорию /etc/ssl/docker/certs/.

Перезапустите docker на сервере и он будет готов ко внешним подключениям.

Настройка клиента

Для настройки клиента существует множество подходов, но все они так или иначе сводятся к добавлению сертификата клиента и CA в переменные окружения. Сам docker, само собой должен быть установлен и на клиентской машине, а сервис может быть не запущен, нам нужен только бинарный файл docker.

Для Linux или MacOS создайте alias для bash (в файле ~/.bashrc). Обратите внимание, по указанному в этом alias пути должны находится сгенерированные на сервере сертификаты ca.pem, client-client1-cert.pem и ключ client-client1-key.pem

alias docker-remote="docker \
  --tlsverify \
  -H=your-remote-server.org:2376 \
  --tlscacert=/home/user/.docker/ca.pem \
  --tlscert=/home/user/.docker/client-client1-cert.pem \
  --tlskey=/home/user/.docker/client-client1-key.pem"

Для Windows, можно сделать тоже, но при помощи созданного файла docker-remote.bat с содержимым.

docker ^
  --tlsverify ^
  -H=your-remote-server.org:2376 ^
  --tlscacert=C:\users\user\docker\ca.pem ^
  --tlscert=C:\users\user\docker\client-сlient1-cert.pem ^
  --tlskey=C:\users\user\docker\client-сlient1-key.pem %*

Не забудьте сменить your-remote-server.org на IP или DNS имя вашего сервера, а так же скорректировать путь и имена сертификатов, если они у вас называются иначе. Дале для работы с удаленным docker хостом выполняйте docker-remote на MacOS/Linux или docker-remote.bat на windows.

One comment on “Docker: Открыть удаленный доступ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *