質問: ### 前提 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 <コンテナ名> ```
回答: まず、「ホストのグローバルIPに紐づくドメイン(sub.domain.dom)を使う=インターネット経由でアクセスする」は要件として必要なのでしょうか? もし、**同じホストの別コンテナにアクセスすること自体**が目的なら、グローバルにアクセスするよりも `host.docker.internal`等でローカルネットワーク内で接続した方がパフォーマンス面でも効率的です。 もしインターネット経由のアクセスが必要な場合は以下ご確認ください。 ホストの80番ポートは外部公開されていますか? 一度ホストの外側から`curl -v http://sub.domain.dom` 等で確認してください。 >コンテナのシェルに入らずにホスト上で以下のように実行しても期待どおりのレスポンスが返ってくるので, >Dockerの(設定の)問題だと判断しています ということですが、ホスト内で名前解決しているためローカルアクセスで成功しているだけかもしれません。 >`curl -v`の出力中にホストのグローバルIPが含まれているため,ドメインの解決はできています. グローバルIPで名前解決しているということはインターネット経由でホストへのアクセスを試みていると思われますが、 外部から`http://sub.domain.dom`に接続できないのであればコンテナからも接続できないでしょう。 (もちろんIP制限などしている場合はこの限りではありませんが) ネットワーク周りを確認してみてください。