Docker удаленный демон (TCP): невозможно подключиться к демону Docker - PullRequest
2 голосов
/ 06 января 2020

Я пытаюсь подключить демон 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

Перезагрузка docker:

systemctl restart docker.service

Проверка если это сработало:

netstat -lntp | grep dockerd

Результат:

tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd

Тест с docker:

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?

Подключение через s sh работ:

docker -H ssh://root@{{HOST_IP}} ps

1 Ответ

2 голосов
/ 06 января 2020

У вас есть демон Docker, прослушивающий адрес локального хоста, 127.0.0.1. Вы не сможете подключиться к этому с удаленного хоста. Единственный хост, который может подключиться к этому адресу - это ... локальный хост.

Чтобы демон Docker мог принимать подключения от удаленных хостов, вам, вероятно, потребуется:

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375

То означает «прослушивать соединения со всех хостов». Но вы на самом деле не хотите этого, потому что это предоставит доступ к вашей системе без аутентификации root любому, кто сможет подключиться к этому порту. Вы можете использовать iptables для ограничения доступа только к определенным удаленным хостам, но это все еще проблема, потому что любой, кто сможет получить доступ к любому из этих хостов, будет иметь, опять же, неаутентифицированный root доступ к вашему Docker host.

То, что вы действительно хотите сделать, - это прочитать " Protect Docker socket-daemon ", в котором обсуждается, как настроить на основе сертификатов аутентификация для удаленных подключений к демону Docker. В отличие от примеров в вашем вопросе, конфигурация, обсуждаемая в этом документе, требует, чтобы клиенты проходили аутентификацию с использованием SSL-сертификата.

Это намного более безопасно, чем разрешение доступа без аутентификации из любого места, и это несколько больше, чем разрешение доступа без аутентификации. из указанных c хостов (поскольку владение файловой системой и разрешения могут использоваться для ограничения доступа к закрытым ключам SSL, необходимым для предоставления доступа к демону docker).

...