boot2docker
は廃止されているため、docker-machine
に切り替えましたが、docker-machine
からポートを開く方法がわかりません。 boot2docker
では、次のようにできます。
boot2docker ssh -L 27017:localhost:27017
これは、SSH接続が開いている限り、ポート27017をVirtualBoxからlocalhost 27017に転送します。 VirtualBoxでポートを永続的に開く方法を探しているわけではないことに注意してください。 docker-machine
でこれを達成するにはどうすればよいですか?
Dockerマシンで使用されるVirtualBoxからVBoxmanage.exeコマンドに引き続きアクセスできます。
VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port27017,tcp,,27017,,27017";
docker-machine info
を使用して、vmの名前を取得します。modifyvm
を使用します。this answer の実用的な例を参照してください。
これが現在の回避策であり、docker-machine ssh
に引数を渡す可能性が保留されています: issue 691 を参照してください。
他の回避策は、not転送ポートで、VMのIPを直接使用することです:
$(docker-machine ip default)
ポート転送が正しく設定されていることを確認するには
VBoxManage showvminfo boot2docker-vm | grep "NIC.* Rule"
マシンの最近のバージョンでは、次のことが簡単にできます(defaultはマシンの名前です):
docker-machine ssh default -L 27017:localhost:27017
これは、VM構成の変更よりも一時的な解決策です。
バックグラウンドプロセスでポートのみを転送するには、次のバリエーションを使用します。
docker-machine ssh default -f -N -L 27017:localhost:27017
マシンにsshして、通常のポート転送引数を渡すことができます。
ssh docker@$(docker-machine ip default) -L 27017:localhost:27017
Dockerユーザーのパスワードはtcuserです。 ( https://github.com/boot2docker/boot2docker を参照)
これを行う方法を思い出すのに苦労しているため、 pf (「ポートフォワード」の略)という小さなbashスクリプトを作成しました。
$ pf 8080
これにより、ドッカーポート8080がバックグラウンドでホストポート8080に転送されます(フォアグラウンドで実行するには-f
を追加します)。別のホストポートを使用するには、次のようにします。
$ pf 8090:8080
ホストポート8090を8080にマップします。
ポート転送を停止するには、-s
を追加します。
$ pf 8090:8080 -s
(実際にはホストポートでも十分です:pf 8090 -s
)。他にも利用可能なオプションがあるので、 github ページを確認してください。
パスワードを使用する必要がない場合は、秘密鍵を指定するだけでよいと付け加えます。
ssh -L 8080:localhost:8080 -i ~/.docker/machine/machines/default/id_rsa docker@$(docker-machine ip default)
@VonCの答えをスクリプトで強化するために-現在、MacOS XでDocker Toolboxを使用している場合、デフォルトVM machineは "default"です。したがって、コンテナから公開されるすべてをマッピングするスクリプトは好む:
for port in `docker port cassandra | cut -d'-' -f1`;
do
port_num=`echo ${port} | cut -d'/' -f1`
port_type=`echo ${port} | cut -d'/' -f2`
echo "Create rule natpf1 for ${port_type} port ${port_num}"
VBoxManage controlvm "default" natpf1 "${port_type}-port${port_num},${port_type},,${port_num},,${port_num}"
done
数回実行しようとすると、既存のルールを削除するための作成前のステートメントを追加する必要があります。
VBoxManage controlvm "default" natpf1 delete "${port_type}-port${port_num}"
スクリプトでは、コンテナからVMにポートを既に転送していると想定しています。
docker port cassandra
次のような出力が得られます。
7000/tcp -> 0.0.0.0:7000