Posted at

docker-machine で localhost でポートを公開する

More than 3 years have passed since last update.


TL;DR

docker-machine ssh は ssh コマンドの引数を受け付けるため、-L オプションを使ってポートフォワードする。

% docker-machine ssh default -L 8080:localhost:8080


docker-machine で localhost でポートを公開する

docker-machine では、boot2docker の VM を作成し、その VM 上で実行されている docker デーモンでコンテナを実行するため、docker run でポートを公開しても localhost で公開されず、boot2docker の VM の IP で公開される。

これでは、docker-machine ip で取得できる IP で公開されているため、localhost で公開したいときに困る。

docker-machine ssh は、ssh コマンドの引数を受け付けるため、-L オプションを使い、ローカルホストにポートフォワードする。


動作を確認する

% docker-machine ip

192.168.99.100

boot2docker の VM は、192.168.99.100 で実行されている。この環境に nginx コンテナを立ち上げて、コンテナの 80/tcp を VM の 8080/tcp で公開する。

% docker run -d -p 8080:80 nginx

23f32acfd34ebd03ac2412e7ebf6246aa6a3d3f41cd8867c7806fa2e6e27712a
% curl -I http://$(docker-machine ip):8080/
HTTP/1.1 200 OK
Server: nginx/1.9.14
Date: Mon, 18 Apr 2016 14:36:47 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 05 Apr 2016 15:20:43 GMT
Connection: keep-alive
ETag: "5703d7cb-264"
Accept-Ranges: bytes

% curl -I http://localhost:8080/
curl: (7) Failed to connect to localhost port 8080: Connection refused

正しく VM の 8080/tcp で公開されている。もちろんローカルホストで公開されてはいないので、接続に失敗している。これをローカルホストでアクセスできるようにするために、ローカルホストの 8080/tcp を boot2docker VM の 8080/tcp にポートフォワードする。

% docker-machine ssh default -L 8080:localhost:8080

## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.11.0, build HEAD : 32ee7e9 - Wed Apr 13 20:06:49 UTC 2016
Docker version 1.11.0, build 4dc5990

これで準備が整ったので別のターミナルからアクセスしてみる。

% curl -I http://localhost:8080/

HTTP/1.1 200 OK
Server: nginx/1.9.14
Date: Mon, 18 Apr 2016 14:39:18 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 05 Apr 2016 15:20:43 GMT
Connection: keep-alive
ETag: "5703d7cb-264"
Accept-Ranges: bytes

期待どおりローカルホストの 8080/tcp でアクセスすることができた。