失敗は一時の恥

パッケージソフト開発をしているプログラマが気の赴くままに何かを投稿するブログ.

Docker コンテナからホストにアクセスする

Docker コンテナからホストにアクセスする

概要

Docker コンテナからホスト (macOS) にアクセスする方法を探していたら, host.docker.internal という名前を使えばよいということが公式リファレンスに書いてありました.

試してみるといとも簡単にアクセスできました.

※ちなみに Docker for Windows の公式リファレンスにも同じことが書いてあるのですが,こちらは試していません.(職場で試してみようかな……)

環境

  • ホスト OS: macOS High Sierra 10.13.4
  • Docker: Docker for Mac 18.03 CE,詳細は以下の通り
$ docker version
Client:
 Version:   18.03.0-ce
 API version:   1.37
 Go version:    go1.9.4
 Git commit:    0520e24
 Built: Wed Mar 21 23:06:22 2018
 OS/Arch:   darwin/amd64
 Experimental:  false
 Orchestrator:  swarm

Server:
 Engine:
  Version:  18.03.0-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.4
  Git commit:   0520e24
  Built:    Wed Mar 21 23:14:32 2018
  OS/Arch:  linux/amd64
  Experimental: false

検証

コンテナから macOS にアクセスできることを試すのに, まずは適当な Web サーバを起動しておきます. Rubysinatra を使って適当なサーバを起動してみました.

$ gem install sinatra
$ ruby -r sinatra -e 'get "/" do "Hello world from macOS!"; end' > /dev/null 2>&1 &
$ curl http://localhost:4567
Hello world from macOS!

この "Hello world from macOS!" というメッセージをコンテナから得られるということを確認します.

適当に alpine のイメージと curl を使います.

$ docker run --rm -it alpine:3.7 /bin/sh
(以下コンテナ内の世界)
$ wget -O - http://host.docker.internal:4567 2>/dev/null
Hello world from macOS!

コンテナから macOS にアクセスできました!

Docker Machine の場合

安直に「docker-machine でも同じことできないの?」と思い試してみましたが,できないようでした.

$ eval $(docker-machine env default)
$ docker run --rm -it alpine:3.7 /bin/sh
(以下コンテナ内の世界)
$ ping host.docker.internal
ping: bad address 'host.docker.internal'

おわり

host.docker.internal というものを見つけたおかげで,あまりにも簡単に目的を達成できてしまった感があります. 正直にいうと,Docker のネットワーク周りはきちんと理解できていないのでちゃんと勉強したい.

参考