Centos Docker ブリッジ モードでホスト Redis サービスにアクセスできないというトラブルシューティングの経験

Centos Docker ブリッジ モードでホスト Redis サービスにアクセスできないというトラブルシューティングの経験

背景:

以前、コンテナ内のホストが提供する Redis サービスにアクセスする必要があるプロジェクトを実行したことがあります (これは一般的なアプリケーション シナリオです)。従来のソリューションは次のとおりです。

① ホストネットワーク( docker run --network=host ):ホストネットワークスタックを完全に適用し、コンテナ内のlocalhostはホストマシンを参照します。

docker run --network=bridge bridge):これもdockerコンテナのデフォルトのネットワーク通信モードです。コンテナ内のlocalhostはコンテナ自体を指します。localhostを使用して、ホスト上のlocalhost:6379でホストされているRedisサービスにアクセスすることはできません。

Docker はデフォルトで docker0 ブリッジを確立します。

ブリッジにはゲートウェイ IP とサブネット セグメントがあります。ブリッジ内のコンテナは、サブネット セグメントからコンテナ IP (IP アドレス eth0) を決定します。ブリッジ内のコンテナは、サービス名を通じて相互にアクセスできます。

ブリッジ内のコンテナは、docker0 Getway を介して外部ネットワークにアクセスできます。

特別な操作は必要ありません。一般的な ② ブリッジ モードを使用するだけです。

ステップ1: ブリッジをカスタマイズして適用する

docker ネットワーク作成 --gateway 172.16.1.1 --subnet 172.16.1.0/24 app_bridge
docker run --network=app_bridge --name ......

# 以下は docker-compose.yml ファイルから取得したものです......
ネットワーク:
 デフォルト:
 名前: app_bridge
 外部: 真

デフォルトの docker0 ブリッジを使用しないのはなぜですか?

この記事の冒頭で述べたように、docker0はデフォルトのブリッジであり、新しく作成されたコンテナはデフォルトでこのブリッジに参加するため、このプログラム専用のブリッジapp_bridgeを作成する必要があります。

ステップ2: コンテナ内のホストに対応するエイリアスを作成する

コンテナ内でブリッジ モードでホスト マシンの localhost:6379 サービスにアクセスするには、Docker が提供する --add-host オプションを使用する必要があります (docker-compose.yml 内の対応する構成は extra_host です)。

docker run の --add-host オプションは、コンテナの /etc/hosts ファイルに行を追加し、その名前を使用して他のネットワークにアクセスしやすくなります。

docker run -it --add-host dockerhost:172.16.1.1 ubuntu cat /etc/hosts
172.17.0.22 09d03f76bf2c
fe00::0 ip6-ローカルネット
ff00::0 ip6-mcastプレフィックス
ff02::1 ip6-全ノード
ff02::2 ip6-オールルーター
127.0.0.1 ローカルホスト
::1 ローカルホスト ip6-ローカルホスト ip6-ループバック
172.16.1.1 ドッカーホスト

次に、プログラム構成ファイルで dockerhost:6379 を使用して、ホスト Redis サービスにアクセスできます。

------------------------------------------ docker ネットワーク モデルに少し詳しい友人であれば、上記の操作を理解して完了できるはずです-----------------------------------------------------

状況:

上記の操作を社内の CentOS7 マシンで実行したところ、コンテナがホストマシンに接続できなくなりました(コンテナ同士は正常にアクセスできました)。

問題のテストを簡素化します。新しいコンテナを作成し、コンテナ内の docker0 ゲートウェイに ping を試みます。なんと、会社の 4 台のマシンすべてが docker0 ゲートウェイに ping できませんが、外部ネットワークは正常にアクセスできます。

すると、次のような問題が発生します。デフォルトの docker0 ブリッジを使用すると、コンテナ内から docker0 ゲートウェイに ping できず、ホスト マシンにアクセスできなくなります。

ああ、それはおそらく会社のマシンの設定の問題でしょう。 。 〜

同社の運用・保守担当者に尋ねたところ、次のことがわかりました。

チェーン INPUT (ポリシー DROP)

上記の INPUT チェーンのデフォルト ポリシーは破棄です。コンテナーからホストにアクセスするための INPUT チェーン ルールは、リストされているもののいずれにも一致しないため破棄されるため、コンテナーから docker0 ゲートウェイに ping を実行してもスタックし、結果が返されません。

デフォルトのポリシーでは、リストされている INPUT チェーンのルールが満たされない限り破棄されます。

デフォルトで受け入れる転送および出力チェーンもあります

この戦略の本来の目的は、サーバーのセキュリティです (残念ながら、コンテナはホスト マシンにアクセスする基本的な機能を失ってしまいます!!!)。

運用・保守ソリューション:

sudo service iptables stopを使用してiptablesをシャットダウンします

②使用するブリッジネットワークセグメントをINPUTチェーンに追加する

sudo iptables -I 入力 -s 172.17.0.0/16 -j 受け入れる

[docker0サブネット172.17.0.0/16 INPUTを受け入れ] ルール、ポータルを追加

OK、これですべてです。会社のネットワーク内のデフォルトのブリッジ コンテナー内のブリッジ ゲートウェイに ping できず、ホスト マシンにアクセスできないという問題が発生した場合は、この記事を参照してトラブルシューティングしてください。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • Docker Compose ネットワーク設定の説明
  • docker-compose ネットワーク設定についての簡単な説明
  • Dockerはブリッジを追加し、IPアドレスの範囲を設定します
  • Dockerカスタムブリッジdocker0とdockerのコマンド操作の開始、終了、再起動
  • Docker-compose はブリッジを作成し、サブネットを追加し、ネットワーク カードを削除します。

<<:  js を使用してファイルが UTF-8 でエンコードされているかどうかを判断する方法

>>:  MySQLインスタンスクラッシュ事例の詳細な分析

推薦する

Linux での MySQL 5.7.19 (tar.gz) インストール グラフィック チュートリアル

Linux で MySQL-5.7.19 バージョンをインストールするための最初のチュートリアル。す...

docker runとstartの違い

docker における実行と開始の違いDocker run はミラーイメージを指定します。そしてdo...

Vue で jsx 構文を正しく使用する方法

目次序文仮想DOM仮想DOMとは仮想DOMの利点レンダリング関数とは何ですか? jsx Vue3 で...

Dockerはnginxをデプロイし、フォルダとファイル操作をマウントします

この間、私は docker を勉強していたのですが、nginx をデプロイするときに行き詰まりました...

WeChatミニプログラム公式顔認証の詳しい説明

ミニプログラムはユーザーの個人情報を収集してアップロードしましたが、拒否されました。こんにちは、ミニ...

JS の new 関数の詳細な説明

目次1. 例2. 兵士100人を作成する3. 質問4. 改善点5. エレガント? 6. JSの父から...

MySQL における識別子の大文字と小文字の区別の問題の詳細な分析

MySQL では、テーブル名の大文字と小文字の区別の問題が発生する可能性があります。実際、これはプラ...

Photoshop を使って Web ワイヤーフレームを作成する方法

この投稿では、通知、画像とビデオ、フォーム フィールド、タイトル、段落、箇条書きリスト、ナビゲーショ...

js は丸で囲まれた数字のリストのサンプルコードを動的に追加します

1. まず本文にulタグを追加します <!-- 順序なしリスト --> <ul i...

CocosCreator ソースコードの解釈: エンジンの起動とメインループ

目次序文準備行く!文章プロセスを開始するメインループまとめ要約する序文準備皆さんは、こんなことを考え...

Mac での MySql の詳細なインストールと構成

1.ダウンロードしてインストールする公式ウェブサイトからコミュニティ エディションの dmg インス...

MAC で Mysql5.7.10 のルートパスワードを変更する方法

まず、MySQLをskip-grant-tablesモードで起動します: mysqld --skip...

Vue+Springbootでインターフェースシグネチャを実装するためのサンプルコード

1. 実装のアイデアインターフェース署名の目的は、リクエストパラメータが改ざんされていないか、リクエ...

MySQL ダーティ ページ フラッシュとテーブル スペースの縮小の原理の分析

mysql ダーティページWAL メカニズムにより、InnoDB はステートメントを更新するときに、...

JSメモリ空間の詳細な説明

目次概要1. スタックとヒープ2. 変数オブジェクトと基本データ型3. 参照データ型とヒープメモリメ...