Контейнерами и образами в 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: Открыть удаленный доступ”