У меня есть служба в докере 8888
и локальная служба grpc, работающая в 0.0.0.0:50051
, и я хочу подключиться к этому порту через контейнер докера.
Команда запуска докера:
sudo docker run -ti -p 8888:8888 -p 50051:50051 -v $(pwd):<folder> -e <aws-credentials> <directory> jupyter
Ошибка:
docker: Error response from daemon:
driver failed programming external connectivity on endpoint strange_lamarr (<string>):
Error starting userland proxy: listen tcp4 0.0.0.0:50051: bind: address already in use.
ERRO[0000] error waiting for container: context canceled
Здесь первая служба запускается через докер, поэтому, если я попытаюсь добавить network = "host"
к команде, первая служба выйдет из строя. Я просто хочу использовать локальный сервис для второго порта.
Docker пытается использовать порт вместо того, чтобы подключаться к этому порту, я пытался скопировать и создать экземпляр службы на самом докере, но он использует кучу локальной графики, которую я не могу легко воспроизвести на докере.
Сопоставление портов -p 50051:50051
используется, когда вам нужно получить доступ к контейнеру с хоста.
Когда вам нужно получить доступ к хосту из контейнера, вам нужно добавить имя хоста, сопоставленное с host-gateway
. По соглашению это называется host.docker.internal
. Вы делаете это, добавляя --add-host=host.docker.internal:host-gateway
в качестве опции к своей команде docker run
, поэтому она становится
sudo docker run -ti -v $(pwd):<folder> -e <aws-credentials> <directory> --add-host=host.docker.internal:host-gateway jupyter
Затем вы можете подключиться из контейнера, используя имя хоста host.docker.internal
и порт 50051.
Спасибо, мне нужно было быть осторожным с тем, что я искал внутри контейнера, мне пришлось изменить место поиска порта с «localhost: 5001» на «host.docker.internal: 50051».