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", теперь ничего не надо поднимать заранее, сразу идет на удаленный хост.