Docker Machine で管理している VirtualBox の VM をローカルにポートフォワーディングする

VirtulaBox の VM からローカルへのポートフォワーディング

Linux 以外の OS 上で Docker を利用する場合、 VirtualBox などで Linux のホスト VM を立てる必要があります。このとき、ホスト VM からローカルへポートフォワーディングしたいと思うときがあります。これをおこなうには、 VirtualBox の CLI である VBoxManagecontrolvm コマンドを使います。

1
VBoxManage controlvm <VM_NAME> natpf<1-N> "<RULE_NAME>,tcp,<LOCAL_IP>,<LOCAL_PORT>,<VM_IP>,<VM_PORT>

<LOCAL_*> はローカルマシンのものを、 <VM_*> はホスト VM のものを表します。
<RULE_NAME> はルール名で、わかりやすいように名付けるとよいです。 また <VM_IP> は省略可能です。

では実際に試してみましょう。たとえば、 PostgreSQL の Docker コンテナのポート 5432 をローカルの 5432 にポートフォワーディングしたい場合を考えます。以下のように、コンテナからホスト VM へはあらかじめポートフォワーディングされているものとします。

1
2
3
4
5
$ docker run -e POSTGRES_PASSWORD=password -d -p 5432:5432 postgres
fd17b2e20ee3b09bbb446449f4182ad0aea24d2a4f4e8ba1a700c11af6671970
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd17b2e20ee3 postgres "/docker-entrypoint.s" Less than a second ago Up 1 seconds 0.0.0.0:5432->5432/tcp serene_varahamihira

このとき、ホスト VM 名が dev であるとすると、ホスト VM の 5432 から ローカルの 5432 にポートフォワーディングするには、以下のコマンドを実行します。

1
$ VBoxManage controlvm dev natpf1 "psql_pf,tcp,127.0.0.1,5432,,5432"

では確かめてみましょう (OS X の場合)。

1
2
$ lsof -P -i -n | grep ':5432 '
VBoxHeadl 7103 skatsuta 21u IPv4 0xd95e1bb443caee89 0t0 TCP 127.0.0.1:5432 (LISTEN)

きちんと 5432 番で listen していますね。