Ubuntu docker コンテナ内の netcat リスナーが、指定されたポートを黙って無視してランダムなポートを選択するのはなぜですか?

Ubuntu docker コンテナ内の netcat リスナーが、指定されたポートを黙って無視してランダムなポートを選択するのはなぜですか?

着信リクエストを手動でデバッグするために、Docker コンテナ内の特定のポートに netcat リスナーを生成したいのですが、Docker 内の netcat の動作は、Docker 化されていないセットアップで観察していたものとは異なっているようです。バニラ Ubuntu 18.04 を例に挙げます。

sudo docker run -it -p 6010:6010 ubuntu:18.04

# inside container
apt-get update && apt-get install -y netcat net-tools
nc -lk 0.0.0.0 6010 &

# then to verify what I am listening on
netstat -an|grep LISTEN

# example output:
# tcp        0      0 0.0.0.0:39331           0.0.0.0:*               LISTEN     

いかなる種類のエラーも発生せず、異なるポイントがサイレントに割り当てられるだけです。非 Docker 化リスナー生成の経験から、エラー (ポートが使用されているなど) が発生するか、要求されたポートが正常に割り当てられるかのどちらかになると思っていました。ここで何が起こっているのでしょうか。また、目的のポートでリッスンを強制するにはどうすればよいでしょうか。

潜在的な提案を予想するために、netcat の担当者は次のように言っています-p [port]

このオプションを -l オプションと組み合わせて使用​​するとエラーになります。

答え1

コメントで示唆されているように、BusyBox netcat バージョンでは-pリスニング ポートを指定する必要があるため、引用したマニュアル ページはこの場合適用されません。これは BusyBox netcat の正しいコマンド ラインです。

nc -l -p 6010      # IP can be left out if it is 0.0.0.0 (all IPs)

私のバージョンの alpine の nc のヘルプ ページは次のとおりです。

/ # nc -v
BusyBox v1.32.1 () 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)```

関連情報