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の例

推薦する

easycomモードでUNI-APPコンポーネントを呼び出す際に習得する必要がある実践的なスキル

この記事は議論の出発点となることを目的としています。詳細なドキュメントと easycom の仕様につ...

Jenkins + Docker + ASP.NET Core の自動デプロイメントの問題について (落とし穴を避ける)

このブログを書くつもりはなかったのですが、実際の操作中に、ネットワークの問題に圧倒されたこと (ネッ...

Javascriptのtry catchの2つの機能についてお話しましょう

プログラムは上から下へ順番に実行され、いくつかの制御文によって実行経路を変更することができます。制御...

ウェブページ上の写真プレビューナビゲーションを設計するためのヒント

<br />ナビゲーションとは、ウェブサイトの上部にあることが多いナビゲーション バーの...

CentOS7 カーネル カーネル5.0 バージョンアップグレード

アップグレードプロセス:元のシステム: CentOS7.3 [root@my-e450 ~]# un...

MySQL のデータ削除とデータ テーブル メソッドの例

MySQL でデータやテーブルを削除するのは非常に簡単ですが、削除するとすべてのデータが消えてしまう...

Nginx リバース プロキシ springboot jar パッケージ プロセス分析

Springboot プロジェクトをサーバーにデプロイする方法としては、war パッケージにパッケー...

Element UI を使用してページにページング ナビゲーション バーを追加する方法

必要ページング バーを追加します。これにより、ページにジャンプしたり、ページ番号に従って特定のページ...

Ubuntu 18.04 が VMware 仮想マシンでネットワークに接続できない問題の解決策

仮想マシン内のUbuntu 18.04がネットワークに接続できない問題の解決策は次のとおりですVMw...

JavaScript で簡単な計算機を実装する

この記事の例では、参考までに簡単な計算機を実装するためのJavaScriptの具体的なコードを共有し...

MySQL で結果を選択して更新を実行する例のチュートリアル

1. 単一テーブルクエリ -> 更新 テーブル名の更新 フィールド1=新しい値1、フィールド2...

HTMLタグのtarget属性の使用法

1: <a> タグを使用してページにリンクする場合、target 属性の役割は誰もが知っ...

dl、dt、dd リスト ラベルの例

dd タグと dt タグはリストに使用されます。通常は <ul><li> タ...

JavaScript 関数はランダムな色の検証コードをカプセル化します (完全なコード)

数字、文字、またはランダムな色の数字と文字の混合で構成される n 桁の確認コード。以下に完全なコード...

MySQL公式パフォーマンステストツールmysqlslapの使い方の紹介

目次導入説明書実際の経験まとめ導入MySQL は最も人気のあるオープンソース データベースとして、さ...