Почему Docker немедленно закрывает соединение TCP? - PullRequest
0 голосов
/ 17 октября 2018

Я использую эту команду для проверки сетевого подключения в терминале:

docker run --rm --name test -it -p 9999:9999 busybox nc -l 0.0.0.0:9999

и в другом терминале

$ telnet localhost 9999
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

кажется, что он подключен закрытым сразу, я ничего не могу ввести.

все работает нормально, когда я пробую localy

nc -l 0.0.0.0:9999

и

telnet localhost 9999

Docker версия 17.12.1-ce, сборка 7390fc6 Ubuntu VERSION = "18.04.1LTS (Бионический Бобр) "

1 Ответ

0 голосов
/ 17 октября 2018

Всего 2 разных стиля netcat.nc в контейнере не совпадает с вашим хостом, поэтому пропуск хоста, решение контейнера не удалось.

Я думаю, ваш хост nc не традиционный, что-то вроде следующего:

# nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46bCDdhjklnrStUuvZz] [-I length] [-i interval] [-O length]
      [-P proxy_username] [-p source_port] [-q seconds] [-s source]
      [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [destination] [port]

Ваш контейнер nc - это другая версия, он имеет совершенно другой синтаксис команды:

# docker run --rm --name test -it -p 9999:9999 busybox /bin/sh
/ # nc
BusyBox v1.29.3 (2018-10-01 22:37:18 UTC) multi-call binary.

Usage: nc [OPTIONS] HOST PORT  - connect
nc [OPTIONS] -l -p PORT [HOST] [PORT]  - listen

        -e PROG Run PROG after connect (must be last)
        -l      Listen mode, for inbound connects
        -lk     With -e, provides persistent server
        -p PORT Local port
        -s ADDR Local address
        -w SEC  Timeout for connects and final net reads
        -i SEC  Delay interval for lines sent
        -n      Don't do DNS resolution
        -u      UDP mode
        -v      Verbose
        -o FILE Hex dump traffic
        -z      Zero-I/O mode (scanning)

Если вы используете netstat в контейнере, вы обнаружите, что порт 9999 не был открытс вашей командой, в результате ваш клиент немедленно выйдет.

Итак, вам нужно изменить команду следующим образом:

docker run --rm --name test -it -p 9999:9999 busybox nc -l -p 9999
...