docker-composeでホストとコンテナのIPアドレスを同じにする

スポンサーリンク

はじめに

network_mode: "host"を使えばいい・・・

というわけで、今回はdocker-composeを利用して

hostとcontainerで同じIPアドレスを使う方法を書いておきます。

version

docker-compose:1.21.1

dockerのネットワークについて

こちらのサイト様が詳しいです。

dockerのbridgeネットワークについて

docker-composeを使ってコンテナを作る場合、特に指定しなければbridgeというnetworkが作成されます。過去にdocker-composeを使ってprometheusとgrafanaを動かしたときもbridgeネットワークが作成されています。

Creating network "testprometheus_default" with the default driver
ディレクトリ名に対応してtestprometheus_defaultというものができます。

このときのネットワークを詳しく見てみると、

docker network lsで確認するとtestprometheus_defaultが作られています。DRIVERの項目を見るとbridgeになってます。

docker network inspect testprometheus_defaultで詳しく見ると、コンテナgrafanaには172.21.0.3が、コンテナprometheusには172.21.0.2が振られています。

ちなみにip aで見てみると

docker0とは別にbr-5ebb987a70c9という仮想ブリッジが出来ています。

この仮想ブリッジがコンテナとホスト間の橋渡しをしています。

構成図についてはこちらのサイト様を見ると大変わかりやすく書かれております。

bridgeが必要ない場合

コンテナが1つの場合やコンテナごとにIPアドレスを分ける必要がない場合(port番号で制御可能な場合とか)、bridgeは不要です。
そんなときはnetwork_mode: "host"を使います。

※IP addressを固定するときも便利です。でもbridgeでもIP addressは固定できます。

hostを使う理由はこちらを読んで納得しました。hostについて書いてある量は大変少ないですが、他にもいろいろdockerについて詳しく書かれているので一読すると良いと思います。

network_mode: "host"を使う場合

公式のリファレンスにもありますが、portが使えないようです。

Note: Port mapping is incompatible with network_mode: host

Dockerfileのexposeで指定したportを使って各コンテナに接続します。

今回はprometheus、grafanaともにDockerhubにあるものを使います。

expose指定されているか確認してみます。

prometheusのDockerfileを見ると「EXPOSE 9090」があります。

同じようにgrafanaのDockerfileを見ると「EXPOSE 3000」があります。

となっています。

ではnetwork_mode: "host"で動かしてみます。

各種ファイルについて(network_mode: "host")

docker-compose.yml

こんな感じです。以前のものからport指定を消し、network_mode: "host"を追加してます。my_ubuntuは検証用に用意してます。

prometheus.yml

以前使っていたものから不要な箇所を削ってます。

Dockefile

検証用に使用します。

ディレクトリ用意

同階層にprometheus-dataとgrafana-dataディレクトリを777で用意します。

確認

ネットワーク確認

docker-compose up -dで起動後、先ほどと同じようにdocker network lsを取得してみます。

さきほどと違いtestprometheus_defaultが出来ていません。

hostを使っているのでdocker network inspect hostを確認してみます。

grafana、prometheus、testAAAコンテナがありますがip addressはアサインされていません。"host"と同じだから記載がないんですかね。

そしてhost上でnetstat -anを見ると9090も3000もlistenしていることが確認できます。

※一部省略

promethesu画面

こちらは以前と変わらず。http://[IPaddress]:9090にアクセスすればOKです。

ここではhttp://192.168.0.17:9090にアクセスしました。

grafana画面

アクセス方法は以前と同じです。http://[IPaddress]:3000にアクセスすればOKです。

ここではhttp://192.168.0.17:3000にアクセスしました。

違うのはアクセス後に行うData Sourcesの設定です。以前はコンテナ名を指定していたため「http://prometheus:9090」としていました。bridgeネットワークだとコンテナ名で名前解決してくれたから可能でした。ですが、hostだと名前解決してくれませんので、IP指定か、localhostを指定する必要がありますので「http://localhost:9090」か「http://192.168.0.17:9090」と設定します。ここでは「http://localhost:9090」を指定。

これで無事hostと同じIPを持つコンテナをたてられました。

おまけ:名前解決してくれない話

hostだとコンテナ名で名前解決してくれないことをdigで確認してみます。

digはubuntuだとdnsutilsにある様子。

docker-composeでコンテナに使いたいコマンドを入れる方法はこちらに残しております。

bridgeの場合

検証用に作ったtestAAAコンテナに入り、コンテナ名でdigを実施します。

※後から取得したログなので上とbridgeIDとかIP addressが違うので注意してください。。

grafana. 600 IN A 172.22.0.4

prometheus. 600 IN A 172.22.0.2

それぞれ見えていますね。

hostの場合

検証用に作ったtestAAAコンテナに入り、コンテナ名でdigを実施します。

こちらはgrafanaもpromethrusも見えていません。

最後に

ドはまりしたので書いてみました。

docker-compose使わずにdockerで--net=hostオプション使ってもできるようです。

個人的にdocker-composeが楽なのでこっちばっかり使ってしまう。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする