質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

6143閲覧

reactから、同一ネットワーク内のapiサーバにリクエストを送りたい

slimemoss

総合スコア6

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

2クリップ

投稿2020/06/17 13:42

編集2020/06/18 12:12

前提・実現したいこと

dockerを用いて、1つのサーバ内で3つのコンテナを起動しています。
それぞれのコンテナはdocker-bridgeネットワークで接続されています。
・reactによるフロントエンド(コンテナ名:fe)
・apiサーバ1(コンテナ名:api1)
・apiサーバ2(コンテナ名:api2)
feのみportを公開しています。

feからapi1,api2へコンテナ名をホスト名としてリクエストを送りたいです。
例:axios.get('http://api1/users')

できていること

feコンテナからapi1コンテナへのリクエストは正しく送られています。
以下の方法で確認しました。

サーバ内で以下のコマンドを実行
$docker exec fe curl -X GET "http://api1/users"

発生している問題

ブラウザの操作で発生するリクエストが正しく処理されません。

chromeのコンソールで、以下のようなエラーが出ます。
エラー:GET http://api1/users net::ERR_NAME_NOT_RESOLVED

reactのリクエストは、サーバではなくブラウザから送られているようで、ホスト名解決ができていないようです。

試したこと1:ブラウザからリクエストを送れるようにする

以下のように、それぞれのapiサーバを公開すれば実現できます。
例:docker run -p 3001:3000 とし、xxx.com:3001/usersでリクエストする。

しかしこの手法だと、fe以外からのリクエストも受け付けてしまいます。
各apiサーバは外部に公開せず、内部ネットワークのみからアクセスできるようにしたいです。

試したこと2:package.json proxy

package.jsonに"proxy": "http://api1"と設定することで
api1へのリクエストは以下のように送ることができました。
例:axios.get('/users')

しかし、この手法だと、api2へのリクエストを送ることができません。

調査したこと:http-proxy-middleware

このミドルウェアを用いると、複数のプロキシを設定できるようです。

以下のような実装になります。

const apiProxy = createProxyMiddleware('/api', { target: 'http://www.example.org' }); // \____/ \_____________________________/ // | | // context options

ただ、この手法だと、用いるcontextに対し設定を書かなければなりません。
contextが複数のサーバでかぶっている(api1/usersとapi2/usersを利用したい)場合、rewite用いたコーディングが必要になります。

実現したいことに対し、非常に面倒です。

質問

前提とした構成が正しくないのでしょうか。(特にapiサーバを外に出したくないあたり?)
リクエストをブラウザからではなく、feコンテナから送る方法があるのでしょうか。
または、解決できるその他の方法があるのでしょうか。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/06/17 20:08 編集

fe コンテナで web サーバーが動いてるなら、それを api サーバーへの proxy にすればいいのでは。
slimemoss

2020/06/18 11:14

例えば、reactが3000portを開いていて、feコンテナ起動時に -p 1234:3000としているとします。 localでコンテナを立てている場合、ブラウザでlocalhost:1234とすると、reaxtアプリが表示されますが、 [それを api サーバーへの proxy にすればいいのでは]というのは、 package.jsonに{"proxy": "http://localhost:1234"}を追加するということでしょうか。 試してみたのですが、axios.get("http://api1/users")で名前解決できませんでした。
guest

回答1

0

ベストアンサー

src/setupProxy.js に以下のように書いて、axios.get('/api1/users')axios.get('/api2/users') でアクセスすれば良いのでは。

js

1const proxy = require('http-proxy-middleware'); 2 3module.exports = app => { 4 app.use( 5 '/api1', 6 proxy({ 7 target: 'http://api1', 8 changeOrigin: true, 9 pathRewrite: { '^/api1': '' } 10 }) 11 ); 12 13 app.use( 14 '/api2', 15 proxy({ 16 target: 'http://api2', 17 changeOrigin: true, 18 pathRewrite: { '^/api2': '' } 19 }) 20 ); 21};

参考: Dealing with CORS in Create React App

投稿2020/06/19 01:04

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問