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

  • 16
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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