dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明

dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明

問題の起源

docker を使用する場合、残念ながら docker コンテナ内のホストのポート 80 にアクセスする必要があり、このポート 80 は別のコンテナのポート 8080 にマッピングされています。コンテナ内の docker ブリッジ 172.17.0.1 を介してホストにアクセスすると、次のようになります。

curl: (7) 172.17.0.1 ポート80への接続に失敗しました: ホストへのルートがありません

問題の原因を見つける

コンテナ内から 172.17.0.1 経由でホストに ping できるため、コンテナとホストがネットワークに接続されていることは確かです。

root@930d07576eef:/# 172.17.0.1 にpingします
PING 172.17.0.1 (172.17.0.1) 56(84)バイトのデータ。
172.17.0.1 からの 64 バイト: icmp_seq=1 ttl=64 time=0.130 ms

コンテナ内から他のイントラネットや外部ネットワークにアクセスすることもできます。

Iptables は、docker コンテナがアクセスを許可されていることも示します。

# iptables --list | grep DOCKER
DOCKER-ISOLATION すべて -- どこでも どこでも      
DOCKER すべて -- どこでもどこでも      
チェーン DOCKER (1 件の参照)
チェーン DOCKER-ISOLATION (1 件の参照)

いくつかの情報を検索した後、次の問題が見つかりました: コンテナーから他のコンテナーから公開されたホスト IP:ポートへのホスト ネットワーク要求へのルートがありません。

説明する

Docker コミュニティ フォームで述べられているように、これは既知のバグであり、ホストのポート 80 は他のコンピューターからはアクセスできますが、ローカル マシンの Docker コンテナーからはアクセスできません。ローカル マシンの Docker コンテナーからのアクセスを許可するには、firewalld ルールを設定する必要があります。

gypark は、/etc/firewalld/zones/public.xml にファイアウォール ルールを追加することでこの問題を回避できると指摘しました。

<ルールファミリー="ipv4">
  <ソースアドレス="172.17.0.0/16" />
  <承諾 />
</ルール>

ここで、 172.17.0.0/16 172.17.xx.xx IP セグメント内のすべての IP と一致することに注意してください。

次にファイアウォールを再起動します。

systemctl ファイアウォールを再起動します

その後、Docker コンテナ内からホストマシンのポート 80 にアクセスできるようになります。

その他の問題

実際、この問題を再現しようと VMware で新しい VM を開いたところ、新しい VM では同様の問題は発生しませんでした。つまり、コンテナは172.17.0.1を介してホスト ポート 80 に直接アクセスでき、ファイアウォール構成を確認したときに172.17.xx.xxのホワイトリストは表示されませんでした。
新しい仮想マシンにインストールされている Docker Docker version 1.12.5, build 047e51b/1.12.5であると推測されます。これは、オープンソースバージョンの Docker から Red Hat が開発したバージョンです。以前のものはDocker version 17.06.2-ce, build cec0b72 Docker-CEに属しています。おそらく Docker バージョンに違いがあり、ちなみに Red Hat は既知のバグを修正しました。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerはコンテナとホスト間でのシェルコマンドのシームレスな呼び出しを可能にします
  • Dockerコンテナにホストディレクトリへの書き込み権限がない場合の解決策
  • Dockerコンテナがホストポートにアクセスできない場合の解決策
  • ホスト上のDockerコンテナ内でシェルまたはプログラムを実行する
  • Dockerコンテナ内でホストDocker操作を呼び出して実行する
  • Dockerコンテナを使用してホストネットワークにアクセスする方法
  • Dockerコンテナとホストマシン間の8時間の差の問題を解決する

<<:  Mysqlトランザクション操作の失敗を解決する方法

>>:  入力ボックスの値を取得する方法のReactの例

推薦する

React プロジェクトにおける axios カプセル化と API インターフェース管理の詳細な説明

目次序文インストール導入環境の切り替え傍受を要求するレスポンスインターセプションAPIの統合管理要約...

CSSの2つの特別な値は、カスケードの継承と初期メソッドを制御するために使用されます。

カスケードを制御するために CSS の任意のプロパティに割り当てることができる特別な値が 2 つあり...

MySQL スローログ実践のまとめ

遅いログクエリ機能スロー ログ クエリの主な機能は、設定された時間しきい値を超える SQL ステート...

HTML と CSS を書くための 6 つの最も効果的な方法

この記事では、効率を向上させ、時間を節約することを願って、最も効果的な 6 つの方法を紹介します。 ...

Docker イメージ + nginx を使用して Vue プロジェクトをデプロイする方法

1. Vueプロジェクトのパッケージ化開発されたvueプロジェクトに次の名前を入力し、パッケージ化し...

ウェブサイト開発におけるフロントエンド開発者とアーティストの知識の違い

概要: 多くの企業、特にインターネット Web サイトを主な事業とする企業のほとんどが、「アーティス...

レスポンシブなカードホバー効果を実現するための HTML+CSS

目次成し遂げる:要約:言うことはあまりありませんが、まずは効果を見てみましょう。 カードホバー、レス...

node.js で Web サーバーを作成する手順の詳細な説明

序文node.js でサーバーを作成するのは非常に簡単です。小さいながらも完全な Web サーバーを...

JS での Reduce Fold Unfold の使用法の詳細な説明

目次折りたたむ(減らす) for...of の使用whileループの使用折り畳み実装に近い展開する配...

HTML 文法百科事典_HTML 言語文法百科事典 (必読)

ボリュームラベル、プロパティ名、説明002 <! - - ... - -> コメント00...

MySQL 5.6 マスタースレーブエラー報告の実践記録

1. 問題の症状バージョン: MySQL 5.6、従来の binlog ファイルと pos 方式を使...

JavaScript の for ループと二重 for ループの詳細な説明

forループfor ループは配列の要素をループします。文法: for (初期化変数; 条件式; 繰り...

MySQL におけるデータタイムとタイムスタンプの違い

MySQL には 3 つの日付型があります。日付(年-月-日)テーブル test(hiredate ...