docker-machine上のコンテナにローカルホスト以外から接続する

By bootjp | 2016年2月14日

最近サービスを作っていて、docker化したが故にdockerが入っていない人に確認してもらうのにハードルが上がったようなそうでないような事を感じる昨今です。

というのもOSXの環境下だとdocker machineという仮想マシンがいるので、通信関係がややこしいんですよね。

やりたいことは以下の感じです。

この説明はOSX 上でVirtualBox上にdocker machineのVMが走っていることが前提となっています。

SS 2016-02-14 14.45.28

※リモートと書いてますけど、語弊が生まれそうなのは承知の上です。

docker machineVMにBridgeを追加する

docker machineを落としてください。

$ docker-machine stop {machine name}
(docker) Stopping VM...

VirtualBoxの画面を開いて

※ここでは日本語化しているので、されていない環境においては読みかえてください
SS 2016-02-14 15.06.20

[設定]から[ネットワーク]を開き

SS 2016-02-14 15.06.57

上の図のように図のようにアダプター3へブリッジアダプターを追加して名前部分にホストマシンで使っているEthernetを選択します。

それで、いつものようにdocker machineを立ち上げてください。

$ docker-machine start {machine name}
(docker) Starting VM...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
$ eval $(docker-machine env {machine name})

そこから、ブリッジに振られたIPアドレスを調べます。

$ docker-machine ssh {machine name}
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.9.0, build master : 16e4a2a - Tue Nov  3 19:49:22 UTC 2015
Docker version 1.9.0, build 76d6bc9
docker@docker:~$ ip addr
-- 一部省略 --
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 08:00:27:20:2d:64 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.12/24 brd 192.168.1.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe20:2d64/64 scope link 
       valid_lft forever preferred_lft forever

こいつが今回追加されたブリッジです。
前回の記事でかいたSNSのコンテナを試しに80番で立ち上げて curl で叩くとこんな感じです。

 
$ curl --head 192.168.1.12
HTTP/1.1 302 Found
Date: Sun, 14 Feb 2016 06:16:12 GMT
Server: Apache/2.4.10 (Debian) PHP/7.0.3
X-Powered-By: PHP/7.0.3
Set-Cookie: smoocy_session=6e1ef9b972a52e61afc07e06d80a0cdb92b7b6fe; expires=Sun, 21-Feb-2016 06:16:13 GMT; Max-Age=604800; path=/; domain=.smoocy.xyz; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Location: /service
X-XSS-Protection: 1; mode=block
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=UTF-8

同一ネットワークに接続されている、iPhoneからもこのIPアドレスで接続できました。
これで簡単に検証できます。
IMG_5617

とはいっても

ネットワークの制約が厳しい会社などはきついかもしれないですね。

そしたら、ホストマシンにリバースプロキシたてるしかないっすね。

SS 2016-02-14 15.23.20

というわけで以上です。

 

追記

ブログコメント欄にも頂いておりますが、Twiterにてご指摘をいただいたので、引用させていただきます。

2 thoughts on “docker-machine上のコンテナにローカルホスト以外から接続する

  1. @yamamoto_febc

    一時的なテスト目的であればポートフォワードで十分な気がします。

    以下コマンドを実行しておくと
    http://ホストマシンのIP:8080/へのアクセスでコンテナにhttpでつなげます。

    $ docker-machine ssh {machine name} -f -N -L 0.0.0.0:8080:127.0.0.1:80

    docker-machineではドライバにAWSやAzure、さくらのクラウドなどが指定できますが、
    このポートフォワードする方法であれば上記のクラウド上にdockerホストを立てた場合でも
    同じように繋げられます。

    Reply
  2. はるきち

    ありがとうございます、外向きからアクセスする方法を模索していて発見しました。
    まったくもくもくせずに実行できましたので感謝の足跡を残していきますね…。

    Reply

コメントを残す

メールアドレスが公開されることはありません。