Удаленный демон 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, необходимым для предоставления доступа демону докера.).

Другие вопросы по тегам