Отказ в получении соединения с контейнером - PullRequest
0 голосов
/ 31 августа 2018

У меня проблема с моими док-контейнерами, где один из них является сервером REST API, а другой - просто тестовым контейнером для скручивания предыдущего.

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

В Dockerfile (образ сервера REST API) я выставил порт 8090 и также сопоставил его с портом хоста 8090 с флагом -p при запуске контейнера. Я проверил в контейнере REST, был ли порт открыт netstat -a, но это не так. Я не уверен, в чем проблема, потому что я не вижу, что я делаю неправильно!

Dockerfile для REST API Server

FROM openjdk:8-alpine
WORKDIR /
EXPOSE 8090
COPY target/blockchain-0.0.1-SNAPSHOT.jar blockchain.jar
CMD java -jar blockchain.jar

Создание контейнера REST

docker container run --rm -p 8090:8090 --ip 172.18.0.3 --net multichain-network --name multichain-app bc59

Тестовый контейнер для запуска Curl и Response

docker container run --rm -it --net multichain-network --ip 172.18.0.4 byrnedo/alpine-curl http://172.18.0.3:8090/api/blockchain/address/create
curl: (7) Failed to connect to 172.18.0.3 port 8090: Connection refused

Netstat -a Response

$ docker exec multichain-app netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:http-alt        0.0.0.0:*               LISTEN      
tcp        0      0 localhost:41183         0.0.0.0:*               LISTEN      
udp    34560      0 localhost:34462         0.0.0.0:*                           
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ]         STREAM     CONNECTED     456199

Я не понимаю, почему порт 8090 не отображается в команде netstat, как я определил в Dockerfile, а также указывает флаг -p. Может кто-нибудь пролить свет на это для меня?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Прежде всего, EXPOSE не изменяет порт, который прослушивает приложение (в контейнере), и не привязывает порт к хосту. Таким образом, вопрос ниже приходит наиболее важным.

Какой порт прослушивает ваш REST API server? Это самая важная вещь, которую мы должны знать.

EXPOSE 8090 - это только документация между людьми, которые создают образ, и людьми, которые запускают контейнер из образа, что означает, что только флаг -p может отображать 8090 на хосте в 8090 в контейнере.

-p 8090: 8090 - это правильная инструкция, которая может выполнять сопоставление портов с EXPOSE или без него. Он мог как-то (я не мог сделать это более подробным, так как мой собственный лимит) представить процесс на хосте docker-proxy. Как показано ниже:

/usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8090 -container-ip x.x.x.x -container-port 8090

Итак, прежде всего, вам нужно подтвердить порт прослушивания сервера REST API, а затем добавить команду -p 8090:your-rest-api-server-port к docker run. Теперь на вашем хосте может работать 8090.

Надеюсь, это поможет ~

0 голосов
/ 31 августа 2018

Вы должны сопоставить порт 8090 на хосте с портом 8080 на контейнере следующим образом:

docker container run --rm -p 8090:8080 --ip 172.18.0.3 --net multichain-network --name multichain-app bc59

Разница здесь: -p 8090:8080

С Докерская документация :

Инструкция EXPOSE фактически не публикует порт. Это функционирует как тип документации между человеком, который создает изображение и человек, который запускает контейнер, о том, какие порты предназначен для публикации. На самом деле опубликовать порт при запуске контейнера, используйте флаг -p на панели запуска, чтобы опубликовать и отобразить один или больше портов или флаг -P, чтобы опубликовать все открытые порты и отобразить их на порты высокого порядка.

...