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

推薦する

Docker Toolboxを完全にアンインストールする方法

Docker Toolbox は、Windows 10 Professional より前のバージョン...

HTML フォームタグチュートリアル (2):

このチュートリアルでは、ウェブデザインにおけるFORMフォームタグのさまざまな属性の応用を紹介します...

Linux システムで IPv6 をサポートするように Nginx を設定する方法

1. 既存のnginxがipv6をサポートしているかどうかを確認する既存の nginx が ipv6...

HTML チュートリアル: よく使われる HTML タグのコレクション (6)

導入された HTML タグは、必ずしも XHTML 仕様に完全に準拠しているわけではありません。実際...

Docker Nginxコンテナの制作と展開の実装方法

クイックスタート1. Docker Hubでnginxイメージを見つけるdocker 検索 ngin...

Docker Enterprise Edition を使用して独自のプライベート レジストリ サーバーを構築する

Docker は本当に素晴らしいです。特に、仮想マシンを使用する場合に比べて、Docker イメージ...

CSS で適応型ディバイダーを巧みに実装する N 通りの方法

分割線はウェブページでよく使われるデザインです。例えば、Zhihuのその他の回答をご覧ください。 こ...

MySQLデスクトップツールSQLyogのリソースとアクティベーション方法は、白黒のコマンドラインに別れを告げます

では、早速リソースについて見ていきましょう。 123WORDPRESS.COM ダウンロードSQLy...

jsプロキシの原理の詳細な説明

目次プロキシモードとは何ですか?実例を紹介例を使ってプロキシモデルの定義を理解するプロキシとはget...

MySQL 5.7 をバイナリモードでインストールし、Linux でシステムを最適化する手順

この記事では主に、MySQL バイナリ パッケージのインストール/起動/シャットダウンのプロセスを紹...

タイムライン効果を実現するCSS3

最近、コンピューターの電源を入れたところ、Geek Academy が新規ユーザーに 1 か月の無料...

繰り返し送信、繰り返し更新、バックオフ防止に関する問題と解決策の分析

1つ。序文<br />この種の質問は、どの専門掲示板でも見かけます。Google で検索...

nginxでgzip圧縮を有効にする手順を完了する

目次序文1. gzip圧縮を設定する2. 詳細設定3. nginxサービスを再起動する要約する序文ウ...

Vue+elementUI コンポーネントは、折りたたみ可能な動的レンダリングのマルチレベル サイドバー ナビゲーションを再帰的に実装します。

かなり前に実装された機能ですが、クリックすると選択したメニュー項目の背景色が白くなることに気付きまし...

MySQL の大きなデータ テーブルにフィールドを追加する方法

序文フィールドの追加は誰でもよく知っていると思います。簡単に記述できます。MySQL テーブルにフィ...