gRPC в контейнере Docker не может подключиться к сервисам на хост-машине - PullRequest
0 голосов
/ 21 сентября 2019

Я немного изменил этот пример: https://github.com/grpc/grpc-web/tree/master/net/grpc/gateway/examples/echo. Я запускаю посланника на док-контейнере с незащищенным портом 8080 (запуск этого прокси-сервера необходим, поскольку браузер не может напрямую взаимодействовать со службой бэкэнда gRPC).Я запускаю все сервисы на своем локальном хосте (хост-машине контейнера-посредника envoy).Однако я не могу подключить посланника в контейнере Docker к службам, работающим на хост-компьютере.

Я скомпилировал grpc_cli в контейнере и при запуске grpc_cli ls 192.168.1.10:9000 (IP-адрес локальной сети хоста и портслужба запущена), я получаю

root@bdc9ac396a87:~/grpc# ./bins/opt/grpc_cli ls 192.168.1.10:9000
Received an error when querying services endpoint.
ServerReflectionInfo rpc failed. Error code: 14, message: failed to connect to all addresses, debug info: {"created":"@1569023274.866465052","description":"Failed to pick subchannel","file"
:"src/core/ext/filters/client_channel/client_channel.cc","file_line":3876,"referenced_errors":[{"created":"@1569023274.866463178","description":"failed to connect to all addresses","file":"
src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc","file_line":395,"grpc_status":14}]}

Я получаю почти идентичную ошибку при использовании IP-адреса интерфейса docker0, который также должен обеспечивать соединение с хост-машиной.

root@bdc9ac396a87:~/grpc# ./bins/opt/grpc_cli ls 172.17.0.1:9000                                                                                                                             
Received an error when querying services endpoint.                                                                                                                                           
ServerReflectionInfo rpc failed. Error code: 14, message: failed to connect to all addresses, debug info: {"created":"@1569022455.801913949","description":"Failed to pick subchannel","file"
:"src/core/ext/filters/client_channel/client_channel.cc","file_line":3876,"referenced_errors":[{"created":"@1569022455.801910006","description":"failed to connect to all addresses","file":"
src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc","file_line":395,"grpc_status":14}]}

Однако, запустив простой http-сервер с хоста с python -m http.server, я могу отлично выполнить следующие команды из контейнера:

wget 172.17.0.1:8000/test.txt // works
wget 192.168.1.10:8000/test.txt // works

Клиент на хосте (не в контейнере) подключается и прекрасно работает со службой, поэтому это не проблема сервера.

Блокирует ли докер определенные типы трафика?В этом примере я заметил, что сервер был помещен в другой докер-контейнер, и он работал (он также работал локально для меня), но я бы предпочел, чтобы мои службы работали на моей хост-машине, пока я их собираю и тестирую.Есть ли где-нибудь параметр, позволяющий включить gRPC из контейнера в службу на хост-компьютере?

Docker версии 1.13.1, сборка 47e2230 / 1.13.1 Fedora 29

...