Edited at

Docker for Windowsで未使用ポート(DB2デフォルトポート50000)が使えない

丸一日ハマったので記録に残しておきます。(2019/5/11現在)

DB2コンテナを使いたかっただけなんです。 https://hub.docker.com/r/ibmcom/db2express-c

サイトに記載のある初期コマンドを打鍵すると。

>docker run -it -p 50000:50000 -e DB2INST1_PASSWORD=db2inst1-pwd -e LICENSE=accept ibmcom/db2express-c:latest bash

docker: Error response from daemon: driver failed programming external connectivity on endpoint gifted_galileo (a33121d9f04b58b0884794b75536a601576bbe329bfa6229bd7f9336c3f06a28): Error starting userland proxy: Bind for 0.0.0.0:50000: unexpected error Permission denied.

Permission deniedだと言われる。(ポートを8080とかにすると使える)

netstat等を使って調べても明らかに50000ポートは使ってない。

色々ググって結論はコレ。の末尾。

https://stackoverflow.com/questions/54181219/windows-cant-bind-to-port-above-49690


It turned out the real problem was Docker.


真の問題はDockerだと。

除外ポートを追加しろとの事なので私は下記の通り設定&確認。(管理者権限のコマンドプロンプトで実施)

>netsh int ip add excludedportrange protocol=tcp startport=50000 numberofports=10

OK
>netsh int ip show excludedportrange protocol=tcp
プロトコル tcp ポート除外範囲
開始ポート 終了ポート
---------- --------
5357 5357
50000 50009 *
50570 50669
50670 50769
50770 50869
50970 51069
51070 51169
51202 51301
51563 51662
* - 管理されている除外ポート。

「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」と出るときは再起動して実施。

設定後も念の為再起動。

無事起動できるようになりました♪

C:\Users\hide>docker run -it -p 50000:50000 -e DB2INST1_PASSWORD=db2inst1-pwd -e LICENSE=accept ibmcom/db2express-c:latest bash

Changing password for user db2inst1.
New password: BAD PASSWORD: The password contains the user name in some form
Retype new password: passwd: all authentication tokens updated successfully.
[root@6b4852df5790 /]#

49152より大きいポートで同様の事象に遭遇した場合は、使いたいポートを除外登録すれば良さそうです。