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

推薦する

サーバー上で Nginx を使用して Springboot プロジェクトをデプロイする方法の詳細なチュートリアル (jar パッケージ)

1. Javaプロジェクトをjarパッケージにパッケージ化するここではMavenツールを使用します...

VMware Workstation での VMware vSphere のセットアップ (グラフィック チュートリアル)

VMware vSphere は、業界をリードする最も信頼性の高い仮想化プラットフォームです。 v...

jsプロジェクトでの双方向データバインディングの簡単な実装方法

目次序文パブリッシュ・サブスクライバ・パターン結果電話要約する序文双方向データ バインディングとは、...

mysql インストーラ ウェブ コミュニティ 5.7.21.0.msi インストール グラフィック チュートリアル

この記事の例では、Androidの9グリッド画像を表示するための具体的なコードを参考までに共有してい...

インターネット接続なしでLinux Centos7にアプリケーションをインストールする方法の詳細な説明

1. 前の章では、プログラムを yum リポジトリに直接インストールできることを学びましたが、そのた...

Vue は、デスクトップから Web ページにファイルをドラッグするためのサンプル コードを実装します (画像/オーディオ/ビデオを表示できます)

効果使用する場合は、コードとスタイルを自分で最適化してください。画像を表示しない/ビデオとオーディオ...

HTML 固定タイトル列、タイトル ヘッダー テーブル固有の実装コード

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

Docker での Redis の最も詳細なインストールと構成 (画像とテキスト付き)

1. Dockerに適したRedisのバージョンを見つけるdocker hubで見つけることができ...

21 の MySQL 標準化および最適化のベスト プラクティス!

序文良い習慣はすべて宝物です。この記事は、SQL の後悔の治療法、SQL パフォーマンスの最適化、S...

MySQL 5.7.31 64 ビット無料インストール版チュートリアル図

1. ダウンロードダウンロードアドレス: https://dev.mysql.com/get/Dow...

Linux で Sudo を使用して権限を委譲する

sudo 権限委譲の概要su スイッチ ID: su –l ユーザー名 –c 'コマンド&#...

JS配列メソッドの詳細な説明

目次1. 元の配列が変更されます1. プッシュ(): 2.ポップ(): 3. シフト(): 4.un...

Tomcat サーバーの応答が遅い場合の解決策

1. 分析的思考1. 機械自身の理由を排除する2. サーバーパフォーマンス分析3. プロジェクト自体...

Vueデータ監視の原理の詳細な説明

<本文> <div id="ルート"> <h1&...

Mac MySQL のルートパスワードをリセットするチュートリアル

免責事項:このパスワード リセット方法は、Homebrew によってインストールされた MySQL ...