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

推薦する

MySQL 結合テーブルと ID 自動増分の例の分析

結合の書き方左結合を使用する場合、左側のテーブルが必ず駆動テーブルになりますか? 2 つのテーブルの...

Dockerイメージの階層化の原理の詳細な説明

ベースイメージベースイメージには 2 つの意味があります。他のイメージに依存せず、ゼロから構築します...

Windows システムに VirtualBox と Ubuntu 16.04 をインストールするための詳細なチュートリアル

1. ソフトウェアの紹介バーチャルボックスVirtualBox は、無料のオープンソース仮想マシン ...

MySQL の一般的な日付比較および計算関数

MySql での時間比較の実装unix_timestamp() unix_timestamp 関数は...

初心者向けのMySQLデータベースとテーブルDDLの作成と操作の学習

目次1. データベースを操作する1.1 データベースを作成する1.2 データベースをクエリする1.3...

MySQLクエリ構文の概要

序文:この記事では主に、MySQL の where、group by、order by、limit、...

Vue の基本入門: Vuex のインストールと使用

目次1. vuexとは何か2. インストールと導入3. vuexの使用4. プロセスの紹介5. 突然...

yum から docker インストール パッケージをダウンロードし、オフライン マシンにインストールする例の詳細なコード

1. ネットワークマシンでは、デフォルトのcentosyumソースを使用します [root@kole...

JavaScript の useRef と useState の紹介

目次1. useStateフック2. useRefフック3. useRef と useState 4...

CentOS7 に MySQL データベースをインストールしてデバッグする詳細な手順 [例]

この例では、デバッグ用の MySQL データベースをダウンロードしてインストールする必要があります。...

HTML入門チュートリアル HTMLタグ記号をすぐにマスター

補足<br />HTML について何も知らず、HTML の始め方がまだわからない場合は、...

MySQLクエリ最適化に必須の知識ポイントのまとめ

序文クエリの最適化は一夜にして達成できるものではありません。対応するツールの使い方を学び、他の人の経...

Vueにおけるキーの役割と原理の詳細な説明

目次1. 結論から始めましょう2. キーの役割2.1 例2.2 上記の例を修正する2.3 例を再度修...

Manjaro インストール CUDA 実装チュートリアル分析

昨年末、Thinkpad T450 のデュアルシステムの opensuse を Manjaro に置...

springcloud alibaba nacos linux 設定の詳細なチュートリアル

まず、github から nacos の圧縮パッケージをダウンロードします: https://git...