banner
libxcnya.so

libxcnya.so

Nothing...
telegram
twitter
github
email

dockerコンテナはホストマシンのドメイン解決に従います。

前景需要#

友達の家のインターネットが爆発した後、フロントエンドと API を同じマシンに移動せざるを得なくなりました。
しかし、ある日、ある人の神秘的なデバイスを使用してアクセスしようとすると、「アクセスが禁止されているか、API サービスに問題が発生しています」というエラーが表示されました。おそらく、フロントエンドがクライアントの User-Agent を使用してバックエンドにアクセスしているため、またはフロントエンドがバックエンドにアクセスする際に CDN に渡される IP に問題があるため、私の抽象的な WAF がブロックされたのだと思います。
したがって、フロントエンドがバックエンドにアクセスするには、まず CDN にアクセスし、CDN がバックエンドに戻る必要があります。同じサーバー上にあるので、なぜこんなに大きなループを回さなければならないのでしょうか。そこで、この記事が生まれました。

省流#

ホストマシンの /etc/hosts ファイルを Docker コンテナにマッピングします。

問題分析#

Mix-Space のフロントエンドとバックエンドは、現在どちらも Docker で実行できます。手間を省くために、私は両方を Docker で実行しています。
フロントエンドの API は、.env ファイルの NEXT_PUBLIC_API_URL で提供されます。これが最も重要です。
Docker コンテナ内では、127.0.0.1 は現在のコンテナ自体を指します。もちろん、フロントエンドコンテナにはバックエンドは実行されていないため、127.0.0.1 に設定することはできません。
では、バックエンドコンテナの IP に設定すればいいのではないでしょうか?フロントエンドのページの一部のシナリオでは、この URL を明示的に使用する必要があるため、サーバー上の内部アドレスに直接設定してユーザーにアクセスさせることは現実的ではありません。したがって、この方法はうまくいきません。
誰かが 2 つのコンテナを同じネットワークに配置することを提案しましたが、前の問題に戻るので、これもうまくいきません。

IP ではうまくいかないので、ドメインに移動するしかありません。そのため、ドメインをターゲットコンテナの IP に固定できます。
ただし、コンテナは再起動するたびに IP が変わるようですが(?ただし、Docker ブリッジネットワークのゲートウェイは常にホストマシンを指すため、バックエンドコンテナの Web サービスのポートをホストマシンにマッピングし、nginx を使用してポート 80 にリバースプロキシすることができます。そして、ドメインをホストマシンでブリッジの IP に指定します。これで一石二鳥です(確信しています。

解決の過程#

まず、Docker のブリッジネットワークのゲートウェイを取得する必要があります。
サーバーのターミナルで ifconfig を入力し、docker0 という名前のネットワークカードを探します。これがそれです。
1
次に、inet に対応する値(つまり 172.17.0.1 )がゲートウェイです。
curl でテストすることができます。私のホストマシンには nginx が実行されているため、curl の結果は nginx のデフォルトページです。つまり、このアドレスはホストマシンを指していることが確認できます(もちろん、バックエンドのポートも curl で通信できます)。

次に、最初に思いついたのは、ホストマシンの /etc/hosts ファイルを変更して、バックエンドのドメインをこのアドレスに指定することです。
そして、コンテナ内でテストしてみましたが、これはホストマシンの hosts を通過しませんでした、、、
2
この時点で、2 つの解決策があります。

1. ローカルで DNS を構築して IP を強制的に解決する#

実際には、ADGuard Home のカスタムルールを使用するだけでできます。
構築方法の詳細については、この記事をご覧ください。

私のローカルではこの DNS は使用していないため、2 番目を見てみましょう。

2. ホストマシンの hosts ファイルを Docker コンテナにマッピングする#

フロントエンドコンテナの docker-compose.yml ファイルに次の行を追加します。

    volumes:
      - /etc/hosts:/etc/hosts:ro

コンテナが乱雑に変更しないように、読み取り専用でマウントします。
その後、コンテナを再起動します。
3
コンテナに戻って試してみましょう。
4
うまく解決しました。

後書き#

この記事は少し冗長ですが、抽象的な問題に遭遇したことを記録するためです。
私のアイデアが役立つと思った場合は、いいねやリツイート、ブックマークをしていただけると嬉しいです。最後に少し寄付していただけるとありがたいです。ありがとうございます。

この記事は Mix Space から xLog に同期されました。
元のリンクは https://blog.nekorua.com/posts/maintain/121.html です。


読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。