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

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

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

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

4337閲覧

docker-composeで作ったコンテナ間でAPI通信したい

jun3030

総合スコア16

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/09/10 10:28

前提・実現したいこと

あるコンテナに入ったAPIアプリがあります。それとは別のコンテナにもう一つアプリがあり、curlコマンドでAPIアプリから情報をとりたいです。
しかし別々のdocker-compose.ymlファイルで立ち上げている為、curlコマンドでアクセスしても拒否されてしまいます。

色々調べたのですが何が足りないのか分からず詰まっています汗
お忙しい中申し訳ないのですが、コンテナ同士のAPI通信についてご指摘頂けないでしょうか、、

ディレクトリ構造

root ┣ front(localhost:4000) ┃ ┝ docker-compose.yml ┃ ┗ Dockerfile ┃ ┣ api(localhost:3000)←API提供 ┃ ┝ docker-compose.yml ┃ ┗ Dockerfile ┃ ┃

それぞれのアプリをdockerで立ち上げ、ブラウザで表示するとこまでは出来ています。試しにfrontコンテナに入りターミナルで以下のように入力するとアクセス拒否されます。
curl http://localhost:3000(←api提供側はlocalhost:3000で立ち上げている)

発生している問題・エラーメッセージ

curl: (7) Failed to connect to localhost port 4000: Connection refused

該当のソースコード

##front側
docker-compose.yml

version: '3' services: app: build: context: . env_file: - ./environments/db.env command: bundle exec puma -C config/puma.rb volumes: - .:/webapp - public-data:/webapp/public - tmp-data:/webapp/tmp - log-data:/webapp/log depends_on: - db networks: - default - common_link db: image: mysql:5.7 env_file: - ./environments/db.env volumes: - db-data:/var/lib/mysql web: build: context: containers/nginx volumes: - public-data:/webapp/public - tmp-data:/webapp/tmp ports: - 4000:80 depends_on: - app tty: true stdin_open: true networks: - default - common_link networks: common_link: external: true

###api側
docker-compose.yml

version: '3' services: app: build: context: . env_file: - ./environments/db.env command: bundle exec puma -C config/puma.rb volumes: - .:/new_reserve_app - public-data:/new_reserve_app/public - tmp-data:/new_reserve_app/tmp - log-data:/new_reserve_app/log depends_on: - db networks: - default - common_link db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: root volumes: - db-data:/var/lib/mysql web: build: context: containers/nginx volumes: - public-data:/new_reserve_app/public - tmp-data:/new_reserve_app/tmp ports: - 3000:80 depends_on: - app tty: true stdin_open: true networks: - default - common_link networks: common_link: external: true

試したこと

それぞれのdocker-compose.ymlに共通のnetworksを作成し記述しました。そしてアプリ同士が通信できているかpingコマンドで確かめ反応が返ってきていました。

参考記事:https://qiita.com/reneice/items/20e981062b093264cd0a

この記事の方法2を試しnetworkが繋がっていることを確認しました。
ですがcurlでアクセスしようとすると拒否されます。

ターミナルでdocker network inspect common_linkと入力しネットワークとして設定されているか確認しました。 common_link←作成したネットワーク

"Containers": { "704ed7a7d7d02f50502e41e0766dca25fb4e7ad48d7f8df5279f2ce35fcf3b6c": { "Name": "smart_yoyaku_portal_site_web_1", "EndpointID": "53be8c51f64bdf27342b58a20455ec2da495552f6dd5c71d7da0d53657b61878", "MacAddress": "02:42:ac:1b:00:04", "IPv4Address": "172.27.0.4/16", "IPv6Address": "" }, "a89a516f6ea3f247a4b71ecdc10de62e6ad25f5c15d86730458f2ed1f3104206": { "Name": "smart_yoyaku_portal_site_app_1", "EndpointID": "17b2f4c754bab34d78360a3a6d34dd2c32bf179f33a23dd1fe67fef7de5955c9", "MacAddress": "02:42:ac:1b:00:02", "IPv4Address": "172.27.0.2/16", "IPv6Address": "" }, "d142b963f89d9d44f70f2f6f2aba830d2a7ac7250e91078de7decb0bf4321307": { "Name": "new_reserve_app_web_1", "EndpointID": "c6a26711717d58d837370c0e8a084771a92e412f9c6977577b6a749cea437126", "MacAddress": "02:42:ac:1b:00:05", "IPv4Address": "172.27.0.5/16", "IPv6Address": "" }, "f3457c9ee486be1f97161e2e6bcda98c6478ec0b28c9c35ad9c4599f8fa491a1": { "Name": "new_reserve_app_app_1", "EndpointID": "6309986647cb6c0a745c0a85debb4c21a9a5d2d787dd08a33dea245dbdbaa5a0", "MacAddress": "02:42:ac:1b:00:03", "IPv4Address": "172.27.0.3/16", "IPv6Address": "" }

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

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

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

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

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

guest

回答1

0

ベストアンサー

localhostでアクセスしてはダメです。
common_linkとして作成したネットワークがLANとして機能しているのであれば、
その中で認識されているIPやホスト名でアクセスする必要があります。
ちなみに、ポート番号もコンテナ内のポート番号を指定すべきかと思います(多分)

投稿2020/09/10 10:57

t_obara

総合スコア5488

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

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

jun3030

2020/09/10 11:37

回答ありがとうございます! IPやホスト名とは `docker network inspect common_link`でcommon_link内に設定されている項目のことでしょうか? 例えば ホスト名→"Name": "smart_yoyaku_portal_site_web_1", IP→"IPv4Address": "172.27.0.4/16", これをcurlで書くならターミナルで curl 172.27.0.4/16 みたいな感じでしょうか?(smart_yoyaku_portal_site_web_1にアクセスしたい場合)
jun3030

2020/09/10 18:33 編集

curl 172.27.0.4でアクセスできました! またおっしゃる通りcurl smart_yoyaku_portal_site_web_1でもアクセスできました! 本当にありがとうございます! ちなみに問題のAPI通信なのですが, new_reserve_app_web_1(API提供側) smart_yoyaku_portal_site_web_1(フロント側) API提供側のエンドポイントが"http://localhost:3000/api/v1/users"になっていて、このurlにフロント側からcurlでgetリクエストしたいのですが、localhostが使えないのでIPアドレスに変更してリクエストを送ってみました。 http://localhost:3000/api/v1/users → http://192.168.240.4/api/v1/users  上記の様にしたのですが結局APIにはアクセスできませんでした汗 そもそもコンテナのIPアドレスを指定してブラウザで表示することが出来ないので上記の様にAPIのエンドポイントを変更しても意味がないみたいです。 何度も申し訳ないのですが、API通信に後何が必要か分かるなら指摘して頂けないでしょうか、、
jun3030

2020/09/11 16:01 編集

説明が下手くそですみません。汗 本当にやりたかったのは、frontのアプリでuserが新規作成された瞬間にAPI側でも同じuser情報が作成されるというものです。 API側(localhost:3000でブラウザ表示中) front側(localhost:4000でブラウザ表示中) #front側のコントローラ内でcurl POSTを使ってAPI側に同じuserデータを作成します。 def create_user(store_manager, store, plan) url = "http://localhost:3000/api/v1/users" `curl -v POST "#{url}" \ -d '{"user":{"name":"#{store_manager.name}","email":"#{store_manager.email}","password":"#{store_manager.password}"},\ "calendar":{"calendar_name":"#{store.store_name}","address":"#{store.adress}","phone":"#{store.store_phonenumber}"},\ "task_course":{"title":"#{plan.plan_name}","description":"#{plan.plan_content.gsub(/(\r\n|\r|\n)/, "")}","course_time":"#{plan.plan_time}","charge":"#{plan.plan_price}"}}' \ -H 'Accept: application/json' \ -H 'Content-Type:application/json'` end コントローラ内のurl = "http://localhost:3000/api/v1/users"でlocalhost:3000ではAPI側にはアクセス出来ないので以下のようにIPアドレスに置き換えたのですが、アクセス出来ないでいます。http://192.168.240.4/api/v1/users
t_obara

2020/09/11 16:16

そもそもDBをレプリケーションするのではダメなんですか? front側は172.27.0.4ではなかったのですか?192.168.240.4はどこから出てきたIPなのかわかりません。
jun3030

2020/09/12 06:41 編集

コンテナを消して作り直した際にIPアドレスが変わっていた事に気がつかなかったです汗 APIでチーム開発が進んでいる為、どうしても使いたかったのですがもう少し時間をかけて解決方法がないか調べてみます! ここまで回答してくださり本当にありがとうございます!汗 コンテナ間のAPI通信についてどうしても解決できない場合また別件で質問します????‍♀️ お忙しい中本当にありがとうございました!汗
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問