Dockerコンテナー内でホストするルートがない


8

ポート9000の特定のURLにアクセスする必要があるWindows 10マシンでDebian Dockerコンテナーを実行しています(164.16.240.30:9000

ホストマシンはブラウザから問題なくアクセスできますが、ターミナルにログインして実行するwget 172.17.240.30:9000と、が表示されfailed: No route to hostます。

これを解決するために私は追加しました:

ports:
  - 9000:9000

docker-compose.ymlファイルに変更しますが、違いはないようです。

私がこれに慣れていないとわからない場合は、次に何を試してみますか?

docker-compose.ymlファイル全体:

version: '3.4'

services:
  tokengeneratorapi:
    network_mode: host
    image: ${DOCKER_REGISTRY}tokengeneratorapi
    build:
      context: .
      dockerfile: TokenGeneratorApi/Dockerfile
    ports:
      - 5000:80
      - 9000
    environment:
      ASPNETCORE_ENVIRONMENT: local
      SSM_PATH: /ic/env1/tokengeneratorapi/
      AWS_ACCESS_KEY_ID: 
      AWS_SECRET_ACCESS_KEY: 

私が実行しているコマンド:

docker-compose build --build-arg BRANCH=featuretest --build-arg CHANGE_ID=99 --build-arg CHANGE_TARGET=develop --build-arg SONAR_SERVER=164.16.240.30

stackoverflow.com/questions/43182879/using-wget-to-fake-browserとして、wgetを介してブラウザをシミュレートしてみてください 。接続を切断するファイアウォールである可能性があります。また、ufw(wiki.debian.org/Uncomplicated%20Firewall%20%28ufw%29): "sudo service ufw stop" が無効になっていて、インストールされていて有効になっている場合。
Jannes Botis

1
コンテナ164.16.240.30:9000は、マシンで実行されていないにアクセスする必要があります。ブラウザはこの164.16.240.30:9000リソースにアクセスできますが、コンテナはアクセスできません。私は正しいですか?172.17.240.30:9000端末から別のリソースを取得しようとしているのではなく、164.16.240.30:9000なぜですか?
Jan Garaj

〜/ .wgetrcファイルにプロキシエントリがないことを確認してください。
ゴータム

私が理解している限り、tokengeneratorapiは一部のsonar_serverへのリクエストをプロキシします。これは正しいです ?tokengeneratorapiがポート9000に適切に転送することさえ確かですか?次のステップは、コンテナーにログインし、ソナーサーバーgetまたはcurlでターゲットにすることです:9000。そして、もしいいなら、127.0.0.1:9000のようなtokengeneratorapi "アプリケーション"をターゲットにして、それが適切に(まだコンテナに)転送されるようにします
grodzi

あなたの問題はまだはっきりしていませんが、コンテナから164.16.240.30:9000にアクセスできないと言っていますか?I log in to the terminal and runあなたがコンテナの中にいると言うとき ?そして、異なるIP 172.17.240.30と164.16.240.30を使用している理由
Vikrant Pawar

回答:


1

コンテナーに接続の問題があるようです。ホストポートをコンテナーポートにマッピングするだけです(ターゲットURLが実際のホストではないことを考慮して)ため、提案されたソリューションは機能しない可能性があります。

https://docs.docker.com/compose/compose-file/#network_modeを確認して、ホストに設定してみてください


これを試しても役に立たなかった。更新された質問を参照してください
m.edmondson

これに追加すると、 'host'はLinux以外のホストでは機能しないように見えますdocs.docker.com/network/network-tutorial-host
m.edmondson

良いキャッチ、そのための私の謝罪!ファイアウォールの問題ではないことを確認できますか?ファイアウォールは、Dockerコンテナーからホストを介した接続を許可する必要があります。
agermain

ホストがWindows 10であるため、どうすればよいかわかりません。たとえば、インターネット接続は、たとえばwget www.google.co.uk200を返します。たぶん、これはLinuxのもので、おそらくiptablesですか?
m.edmondson

あなたは会社の代理人の後ろにいますか?お試しくださいdocker network prune。また、画像は何に基づいていますか?
agermain

1

ブラウザは164.16.240.30:9000プロキシ(通常のエンタープライズ環境)を経由しているため、にアクセスでき、the proxyネットワーク接続も可能164.16.240.30です。ホストが同じネットワーク接続を持っているという意味ではありません。実際、あなたのホストにはそれがないようです。これが、コンテナまたはターミナルからの直接のwgetにエラーがある理由No route to hostです。

すべてがプロキシを通過する必要があります。プロキシを適切に設定してみてください-Linuxアプリはhttp_proxy,https_proxy通常環境変数を使用しますが、アプリにはプロキシを設定する独自のオプションがあり、最終的にはソースコードレベルで設定できます。使用するアプリ/コードによって異なります。


1

問題は、docker compose構成ファイルでホストモードを使用していて、debianマシンのポートに対してIPTABLESファイアウォールが許可されていることですか?窓はどうですか?

network_mode: host 

これは実際にdockerブリッジを完全にバイパスするため、指定したポートセクションは適用されません。ホストシステムですべてのポートが開かれます。あなたはチェックすることができます

nestat -tunlp | grep 5000

また、ポート5000が開いておらず、80のdockerにマップされていることがわかります。ただし、ポート80と9000はdebianネットワークで開いている必要がありますが、debian ipにのみ接続するdockerブリッジにはバインドしないでください。

ここから:https : //docs.docker.com/network/host/

警告:ホストネットワークモードを使用すると、公開されたポートが破棄されます

解決策として、network_mode行を削除すると、期待どおりに機能します。


0

このコードでは、コンテナからへのアクセスが許可されていません164.16.240.30:9000。の164.16.240.30:9000代わりにターミナルからwgetする必要があり172.17.240.30:9000ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.