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

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

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

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

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

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

Q&A

2回答

1396閲覧

コンテナからホストのグローバルIPに紐付いたドメインを利用してホストで動く別サービスにアクセスしたい

akamakku

総合スコア191

docker-compose

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

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

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

0グッド

1クリップ

投稿2019/07/29 04:24

編集2022/01/12 10:55

前提

VPS上でNginxによるリバースプロキシをつかって複数のサービスを動かしています.
Nginxやそれぞれのドメインに紐づくサービスはそれぞれDockerコンテナで動いています.

実現したいこと

ホストのグローバルIPに紐づくドメイン(sub.domain.dom)を使って,同ホスト上で実行されている別サービスにアクセスしたい.

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

docker exec -it <コンテナ名> bashでコンテナのシェルに入ってcurlを実行すると,Connection timed outが返ってきます

curl -v http://sub.domain.dom
  • Rebuilt URL to: http://sub.domain.dom/
  • Trying ......
  • TCP_NODELAY set
  • connect to ... port 80 failed: Connection timed out
  • Failed to connect to ... port 80: Connection timed out
  • Closing connection 0

curl: (7) Failed to connect to ... port 80: Connection timed out

ちなみにコンテナに入らずに(普通にホスト上で)同じcurlを実行すると期待したレスポンスが返ってきます

curl -vの出力中にホストのグローバルIPが含まれているため,ドメインの解決はできています.

また,以下のコマンドでは期待したレスポンスが返ってきているのでインターネットには接続できています

curl www.example.com

またコンテナのシェルに入らずにホスト上で以下のように実行しても期待どおりのレスポンスが返ってくるので,Dockerの(設定の)問題だと判断しています

curl -v http://sub.domain.dom

コンテナ起動コマンド

docker run -it -v "$PWD/app:/app" -p '5000:5000' --net=default <コンテナ名>

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

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

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

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

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

guest

回答2

0

ホストOSはCentOS系でしょうか.

自分も以前似たようなトラブルに遭遇し,詳細は覚えていないのですが,
CentOS7の場合はDockerが生成するiptablesのルールにより
コンテナからコンテナが動作するホストへの通信を遮断していたと記憶しています.
ただし,dockerが生成するiptablesルールを自分で変更するリスクは高いので,
iptablesルールを変更して解決するのは難しいと思います.

自分の場合は,ホストOSをUbuntuに変更したり,
別サーバで動作するリバースプロキシ経由でアクセスすることで解決しました.

あまり確かな情報ではありませんが,参考になれば幸いです.

投稿2019/08/08 13:08

thaim

総合スコア175

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

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

akamakku

2019/08/11 05:28

解答ありがとうございます CentOSだとそのような問題があるんですね ホストOSはUbuntuです...
akamakku

2019/08/11 05:28

Docker難しいですね
guest

0

まず、「ホストのグローバルIPに紐づくドメイン(sub.domain.dom)を使う=インターネット経由でアクセスする」は要件として必要なのでしょうか?
もし、同じホストの別コンテナにアクセスすること自体が目的なら、グローバルにアクセスするよりも
host.docker.internal等でローカルネットワーク内で接続した方がパフォーマンス面でも効率的です。

もしインターネット経由のアクセスが必要な場合は以下ご確認ください。

ホストの80番ポートは外部公開されていますか?
一度ホストの外側からcurl -v http://sub.domain.dom 等で確認してください。

コンテナのシェルに入らずにホスト上で以下のように実行しても期待どおりのレスポンスが返ってくるので,
Dockerの(設定の)問題だと判断しています

ということですが、ホスト内で名前解決しているためローカルアクセスで成功しているだけかもしれません。

curl -vの出力中にホストのグローバルIPが含まれているため,ドメインの解決はできています.

グローバルIPで名前解決しているということはインターネット経由でホストへのアクセスを試みていると思われますが、
外部からhttp://sub.domain.domに接続できないのであればコンテナからも接続できないでしょう。
(もちろんIP制限などしている場合はこの限りではありませんが)

ネットワーク周りを確認してみてください。

投稿2019/07/30 03:37

tomoeine

総合スコア127

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

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

akamakku

2019/07/30 04:49 編集

解答ありがとうございます アクセス元のコンテナではユーザからURLを受け取って,(自分がそのVPSで動かしているサービスのURLであった場合のみ)そのURLにアクセスするAPIが動いているんですが,その際に受け取ったURLを改変せずにアクセスしたいので,インターネット経由でアクセスしたいです また外部から `http://sub.domain.dom` へのアクセスはできることを確認できました
tomoeine

2019/07/31 02:46

お返事ありがとうございますm(_ _)m なるほど、インターネット経由の必要があるんですね。。 タイムアウトになってるので、サーバのファイヤウォール周りが怪しいと思うのですが、ちょっとこの情報だけでは判断難しいですね・・・ ファイヤウォール(AWSならセキュリティグループとか)の確認と、わからなければtcpdump等でデバッグして見るのが良さそうです。 telnet使って80番以外への接続も見てみると良いかも。 (記載されている情報を見る限り、Dockerの設定は問題なさそうな気がしています)
Y.H.

2019/07/31 03:28

curlが通ればいいのであればコンテナ内の/etc/hosts に sub.domain.dom のローカルIPアドレス書けば解決しそうな感じがするんだけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問