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
でアクセスすることができた。