LoginSignup
41
38

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-18

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

41
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
38