Docker コンテナからホストにアクセスする
Docker コンテナからホストにアクセスする
概要
Docker コンテナからホスト (macOS) にアクセスする方法を探していたら,
host.docker.internal
という名前を使えばよいということが公式リファレンスに書いてありました.
試してみるといとも簡単にアクセスできました.
※ちなみに Docker for Windows の公式リファレンスにも同じことが書いてあるのですが,こちらは試していません.(職場で試してみようかな……)
環境
$ 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 サーバを起動しておきます. Ruby で sinatra を使って適当なサーバを起動してみました.
$ 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 のネットワーク周りはきちんと理解できていないのでちゃんと勉強したい.