Ubuntsu Server の docker 環境で dnsmasq を起動させてみると…

投稿者: | 2022年1月17日

CentOS のドタバタがあって、最近、個人的に Linux の環境は Ubuntu を使うことにしています。

WSL 環境でもつかっていることもあり、また Ubuntu なら、リポジトリから比較的簡単に docker 環境を導入できることもあり、またどこまで Ubuntu で押し通せるかと言うことにも興味があります。

と言うところで、最近、自宅の環境から CentOS の排除を徐々に考え始めており、いろいろな自宅内で動かしているアプリケーションをコンテナ化して、いざ Ubuntu で立ちゆかなくなっても、コンテナでお気軽移行…できたらいいなというのが野望です d(^^;A

で、DNS をまず、dnsmasq でコンテナ化して、コンテナを起動してみると以下のようなエラーが出て、いきなり躓きました orz

ERROR: for dnsmasq  Cannot start service dnsmasq: driver failed programming external connectivity on endpoint dnsmasq (c4b6803c52b2afb5d1458d54ab96e6e4c2d8e3a1f2953ab61cfe0b6c681a7d2f): Error starting userland proxy: listen udp4 0.0.0.0:53: bind: address already in use

要は、ホスト側のポート使われていて、コンテナへ通信を転送できないと言われているのですが、そもそもインストールして、 docker をインストールしただけのサーバーで、なぜ 53 番 (DNS) が塞がっているんだ!

…と調べてみたところ、昨今の Ubuntu では、DNS クライアントして、動的なネットワーク設定の変更に対応するために systemd-resolved が採用されており、これが自身の 127.0.0.53 に名前解決を問い合わせる設定になっていて、何もしなくても、この 127.0.0.53 で 53 番を使用しています。

ところで、docker-compose.yml などで、ホスト側へのポートの割り当てを指定する場合、以下のように記載するはずです。

ports:
  - "53:53/udp"

ところが、このように記載すると、ホストが持つすべての IP アドレスに対して 53/UDP の通信を、コンテナ側に転送してしまう事になってしまい、当然のことながら 127.0.0.53 は systemd-resolved が使用しているため、コンテナを起動できない問題となるエラーが発生してしまいます。

これを解決するために systemd-resolved を止めるなど、いろいろ方法を思案したのですが、そもそもコンテナは、ホストの 53/udp に来た問い合わせさえ、応答してくれればいいので…

ports:
  - "192.168.10.10:53:53/udp"

※ 192.168.10.10 はホスト側の LAN 側アドレスです

と言うようにホスト側の LAN 側のアドレスを記載してやれば、難なくコンテナは起動しました。この結論に行き着くのに 3 日かかりました。。。まだまだ Ubuntu で押し通せるようになるまでの道は長いようです (_ _;A


  • Ubuntu は Unbuntu Server 20.04 LTS を iso イメージからインストールしたものを使用しています

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です