web-dev-qa-db-ja.com

docker-machineのポート転送?

boot2dockerは廃止されているため、docker-machineに切り替えましたが、docker-machineからポートを開く方法がわかりません。 boot2dockerでは、次のようにできます。

boot2docker ssh -L 27017:localhost:27017

これは、SSH接続が開いている限り、ポート27017をVirtualBoxからlocalhost 27017に転送します。 VirtualBoxでポートを永続的に開く方法を探しているわけではないことに注意してください。 docker-machineでこれを達成するにはどうすればよいですか?

46
Johan

Dockerマシンで使用されるVirtualBoxからVBoxmanage.exeコマンドに引き続きアクセスできます。

VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port27017,tcp,,27017,,27017";
  • docker-machine infoを使用して、vmの名前を取得します。
  • vmがまだ開始されていない場合は、modifyvmを使用します。

this answer の実用的な例を参照してください。


これが現在の回避策であり、docker-machine sshに引数を渡す可能性が保留されています: issue 691 を参照してください。

他の回避策は、not転送ポートで、VMのIPを直接使用することです:

 $(docker-machine ip default)

コメント by sdc

ポート転送が正しく設定されていることを確認するには

 VBoxManage showvminfo boot2docker-vm | grep "NIC.* Rule" 
44
VonC

マシンの最近のバージョンでは、次のことが簡単にできます(defaultはマシンの名前です):

docker-machine ssh default -L 27017:localhost:27017

これは、VM構成の変更よりも一時的な解決策です。

バックグラウンドプロセスでポートのみを転送するには、次のバリエーションを使用します。

docker-machine ssh default -f -N -L 27017:localhost:27017
  • -fコマンド実行の直前にバックグラウンドに移動するようにsshに要求します。
  • -N空のコマンドを許可する(ここでポートを転送する場合にのみ有用)
26
David

マシンにsshして、通常のポート転送引数を渡すことができます。

ssh [email protected]$(docker-machine ip default) -L 27017:localhost:27017

Dockerユーザーのパスワードはtcuserです。 ( https://github.com/boot2docker/boot2docker を参照)

17
Stijn

これを行う方法を思い出すのに苦労しているため、 pf (「ポートフォワード」の略)という小さなbashスクリプトを作成しました。

$ pf 8080

これにより、ドッカーポート8080がバックグラウンドでホストポート8080に転送されます(フォアグラウンドで実行するには-fを追加します)。別のホストポートを使用するには、次のようにします。

$ pf 8090:8080

ホストポート8090を8080にマップします。

ポート転送を停止するには、-sを追加します。

$ pf 8090:8080 -s

(実際にはホストポートでも十分です:pf 8090 -s)。他にも利用可能なオプションがあるので、 github ページを確認してください。

8
Johan

パスワードを使用する必要がない場合は、秘密鍵を指定するだけでよいと付け加えます。

ssh -L 8080:localhost:8080 -i ~/.docker/machine/machines/default/id_rsa [email protected]$(docker-machine ip default)
3
leonfs

@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
1
npenkov