コンテナ間でホスト名をpingする

みなさん、こんにちは;

私はTS-464でContainer-Stationを運用しています。

いくつかのコンテナ(ha、grist、lldap、autheliaなど)をセットアップしており、すべてCaddyコンテナをリバースプロキシとして経由してアクセスしています。これらはすべてCSで「コンテナ」として直接インストールしており、composeファイルは使用していません。

すべて問題なく動作していましたが、ホスト名ではうまくいかなかったため、10.0.3.xのアドレスにリバースプロキシする必要がありました。それ自体は問題なかったのですが、NASをファームウェアアップデートのために再起動したところ、すべてのコンテナのIPが変わってしまい、Caddyの設定を新しいIPに再構成しなければなりませんでした…

Dockerには、同じネットワーク内のコンテナのホスト名で参照できる「DNSリゾルバー」のようなものがあるとドキュメントで見た気がしますが、何か見落としているのでしょうか?

もしコンテナのIPが再起動のたびに変わるのであれば、内部DNSサーバーをインストールしても意味がありません。

もう一つの方法は、コンテナに静的IPを設定することですが、その方法が見つかりませんでした(もしかしたらSSHでコマンドラインからできるかもしれません…)

どなたか良い運用方法をご存じでしたら、ぜひ教えてください。

よろしくお願いします。
Xavier

通常、コンテナはデフォルトでDHCPを使用します。ちょうど調べていたのですが、コンテナに固定IPアドレスを設定する方法があるかどうかわかりません。コンテナのセットアップではその方法はありません。もしかすると、Composeで設定する必要があるかもしれません。

コンテナをブリッジモードにすることで、特定のネットワークアダプターに接続されます。その後、固定IPを割り当てることができます。

標準コンテナで static(静的IP)を設定する場合、ネットワーク設定でIPを設定できますが、ブリッジ接続になります。

アプリケーションをComposeで使用する場合、すべてのコンテナが同じネットワーク内にあれば、アプリ名で参照できることは知っています。私はnginx-proxy-manager(NPM)でこれを行っています。以下はnpmともう一つのアプリdozzleのサンプルCompose yamlです。backendAppsネットワークはdockerコマンドで作成したと思いますが、記憶が定かではありません。なお、npmの設定は完全ではなく、2つのネットワークの使用例を示しています。他のアプリはすべてbackendAppsネットワークにあり、NPMがリバースプロキシとHTTPSを提供しています。

services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    stdin_open: true
    tty: true
    container_name: npm
    networks:
      qnet-static-eth0-custom:  # 外部IP/MAC定義用
      backendApps: # 共有するすべてのコンテナはこのネットワークを持つべきです。

networks:     
  qnet-static-eth0-custom:
    external: true
  backendApps:
    external: true
services:
  dozzle:
    image: amir20/dozzle:latest
    container_name: dozzle
    stdin_open: true
    tty: true
    networks:
      - backendApps
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 2080:8080

networks:     
  backendApps:
    external: true

npmでの参照方法

Composeファイルに必要なすべての詳細には触れませんが、使い方が分かっていれば参考になるはずです。

ありがとうございます。これらすべてを試してみて、フィードバックをここに書きます。

最後の投稿は、さらに別の問題を解決する道も開いてくれました。リバースプロキシはコンテナのデフォルトネットワーク(lxcbr0)にありますが、「applications」内のコンテナは独自のネットワークにあります。もしアプリにlxcbr0ネットワークを追加すれば、Caddyからアプリへのリバースプロキシができるかもしれません(現時点では、IPアドレスでもpingが通りません)。

また進捗があればご報告します。お時間いただきありがとうございました!
Xavier

約束していたフィードバックをここに投稿します。

ついに手動でリバースプロキシ(Caddy)を「アプリケーション」(つまり compose ファイル)用に作成されたネットワークに接続することに成功しました:

 docker network connect my_app_default caddy-1

これで接続の問題が解決し、内部DNSの問題も解決しました。caddyファイル内で、コンテナのIPアドレスではなく「サービス名」にリバースプロキシできるようになりました。

お二人ともご協力ありがとうございました。同じケースをググっている方の参考になれば幸いです。

それでは、
Xavier

「いいね!」 1