Удаленный демон Docker (TCP): не удается подключиться к демону Docker
Я пытаюсь подключить демон докера от клиента к удаленному хосту через TCP, но получаю эту ошибку:
docker -H tcp://{{HOST_IP}}:2375 ps
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
Какие могут быть для этого причины? Каков правильный подход к отладке для поиска решения?
- Система: Ubuntu 18.04 (клиент и хост)
- ufw: включен для всех входящих и исходящих (в целях тестирования)
- права доступа: работа с root на клиенте и хосте
ЧТО Я СДЕЛАЛ
На хосте:
systemctl edit docker.service
Добавьте и сохраните эти строки:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
Перезагрузить демон:
systemctl daemon-reload
Перезагрузите докер:
systemctl restart docker.service
Проверить, сработало ли:
netstat -lntp | grep dockerd
Результат:
tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
Тест с докером:
docker -H tcp://127.0.0.1:2375 ps
На хосте все заработало. Однако, когда я пытаюсь подключиться от клиента к удаленному хосту, я получаю сообщение об ошибке.
На клиенте:
docker -H tcp://{{HOST_IP}}:2375 ps
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
Подключение по ssh работает:
docker -H ssh://root@{{HOST_IP}} ps
1 ответ
У вас есть демон Docker, который прослушивает адрес localhost, 127.0.0.1
. Вы не сможете подключиться к нему с удаленного хоста. Единственный хост, который может подключиться к этому адресу, - это... локальный хост.
Чтобы демон Docker принимал соединения с удаленных хостов, вы, вероятно, захотите:
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
Это означает "прослушивать соединения со всех хостов". Но на самом деле вы этого не хотите, потому что это предоставит неаутентифицированныйroot
доступ к вашей системе для всех, кто смог подключиться к этому порту. Вы могли бы использоватьiptables
ограничить доступ только к определенным удаленным хостам, но это все еще проблема, потому что любой, кто может получить доступ к любому из этих хостов, опять- таки, не прошел бы аутентификациюroot
доступ к вашему хосту Docker.
Что вам действительно нужно, так это прочитать статью "Защитить сокет демона Docker ", в которой обсуждается, как настроить аутентификацию на основе сертификатов для удаленных подключений к демону Docker. В отличие от примеров в вашем вопросе, конфигурация, обсуждаемая в этом документе, требует от клиентов аутентификации с использованием сертификата SSL.
Это намного безопаснее, чем разрешение доступа без проверки подлинности из любого места, и это несколько больше, чем разрешение доступа без проверки подлинности с определенных хостов (поскольку владение файловой системой и разрешения могут использоваться для ограничения доступа к закрытым ключам SSL, необходимым для предоставления доступа демону докера.).