Docker на удаленном хосте
Решил я тут меньше запускать докер демона на маке, т.к. это виртуалка, которая жрет ресурсов и вспомнил, что докер демон может слушать на tcp сокете (тогда как по умолчанию он это делает на unix сокете).
Итак, что надо сделать, чтоб избавиться от докер демона на своей машине.
У меня был сервер с CentOS 8, 8 CPU и 16 RAM, установил докер, скопировал скрипт для генерации сертов, запустил его:
./cert -m ca -pw p@ssw0rd -t certs -e 9000
./cert -m server -h localhost -pw p@ssw0rd -t certs -e 3650
./cert -m client -h mac -pw p@ssw0rd -t certs -e 3650
Первой командой создался CA, время жизни подольше. Второй командой создался серверный серт с ключом, я выписывал на localhost, т.к. до этого сервера я могу попасть только через ssh-туннель, третьей - клиентский серт, которым я буду представляться демону.
Затем необходимо создать файл /etc/docker/daemon.json со следующим содержимым:
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
"tls": true,
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/server-cert.pem",
"tlskey": "/etc/docker/certs/server-key.pem",
"tlsverify": true
}
И убрать -H fd:// из systemd файла докер демона:
cp /lib/systemd/system/docker.service /etc/systemd/system/multi-user.target.wants/docker.service
sed -i 's/\ -H\ fd:\/\///g' /etc/systemd/system/multi-user.target.wants/docker.service
systemctl daemon-reload
service docker restart
Осталось своего клиента на маке подправить, у меня он установлен от Docker Desktop for Mac, есть куча путей, как его установить, я сделал alias в свой zshrc:
alias docker='docker \
--tlsverify \
-H=localhost:2376 \
--tlscacert=/path/to/ca.pem \
--tlscert=/path/to/cert.pem \
--tlskey=/path/to/key.pem'
Работает.
Добавим переменные среды:
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://localhost:2376"
export DOCKER_CERT_PATH="/path/to/certs"
Все, теперь, когда у меня поднят ssh-туннель, и я делаю docker чего-то там, все это выполняется на удаленном сервере. По быстродействию - немного медленнее, чем если это было бы локально, но в целом мне пойдет и устраивает.
Вдохновлялся:
1 https://gist.github.com/kekru/4e6d49b4290a4eebc7b597c07eaf61f2
2 https://gist.github.com/kekru/974e40bb1cd4b947a53cca5ba4b0bbe5
UPD: Изменил переменную: DOCKER_HOST="ssh://host_with_docker", теперь ничего не надо поднимать заранее, сразу идет на удаленный хост.