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 イメージからインストールしたものを使用しています