Docker コンテナでネットワーク リクエストが遅くなる問題の解決策

Docker コンテナでネットワーク リクエストが遅くなる問題の解決策

Docker の使用中に、いくつかの問題が発見されました。npm install や bundle install 操作など、Docker のネットワーク リクエストは頻繁に失敗しました。または、中間層として、アプリケーションで API データを取得するプロセスでタイムアウトが発生することがよくありました。そのため、ネットワーク リクエストが遅い問題を解決するために、Docker のネットワーク メカニズムを調査し始めました。

1. Dockerネットワークモード

1. なし

none として設定すると、Docker コンテナ ネットワークは入力も出力もできず、外部から分離されます。

2. ブリッジ
デフォルトのモードはブリッジです。Docker には独自の仮想ネットワーク カードがあり、ブリッジを通じてホストからネットワークを取得します。

3. ホスト
ホストとして指定すると、ホストのネットワーク カードがコンテナーに直接公開され、コンテナーはホストのネットワークを介してインターネットに直接アクセスできます。たとえば、ホスト上の redis サービス 127.0.0.1:6357 を取得する場合は、この方法を使用する必要がありますが、安全性は低くなります。

4. コンテナ
他のコンテナのネットワークを使用する

2. Docker DNS解決

Docker コンテナは基本的に Linux なので、DNS 解決方法は Linux と同じで、/etc/hosts ファイルを見つけることが優先されます。このファイルには localhost などのドメイン名が記述されており、例えば次のようになります。

127.0.0.1 ローカルホスト

Docker コンテナが他のコンテナにリンクする場合、リンクされたドメイン名が追加されます。例:

docker run --name app --link app-redis:redis -d ubuntu

ホストにはさらに追加される

172.17.0.3 アプリ Redis 038c8388e4a1

/etc/hosts ファイルを見つけたら、次に /etc/resolv.conf ファイルを見つけます。

ドメインローカル
ネームサーバー 192.168.65.1
ネームサーバー 192.168.65.10

3. Dockerコンテナ内のネットワークリクエストが遅い問題を解決する

パケットキャプチャなどの分析の結果、ネットワーク要求の遅延は主に DNS 解決で発生していることが判明したため、主に DNS 最適化が採用されました。

リクエストが独自のイントラネット API に対するものである場合は、/etc/hosts ファイルを直接変更できます。リクエストが外部ネットワークに対するものである場合は、/etc/resolv.conf でネームサーバーを変更できます。

Docker コンテナはファイルを変更することによって直接実装されるわけではありませんが、run コマンドを通じて実装できます。

# ホストを追加
docker run --name app --add-host='api.embbnux.com:10.98.10.98' -d ubuntu
# DNSサーバーを指定する
docker run --name app --dns=223.5.5.5 --dns=8.8.8.8 -d ubuntu

このようにして、Docker コンテナ内の DNS 解決時間が短縮されます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • DockerイントラネットはDNSを構築し、ip:port操作の代わりにドメイン名アクセスを使用します
  • 独立した IP を介して Windows コンテナ イントラネットの Docker に直接アクセスする方法
  • Dockerコンテナ内の独立IPにアクセスする方法
  • docker でプライベート サーバーを構築する方法 (CentOS 上の nginx と ssl を使用した docker-registry)
  • Docker ベースの lanproxy イントラネット侵入サービスの構築の詳細説明
  • Docker コンテナで DockerFile を使用して複数の Tomcat サービスをデプロイする手順
  • Docker イメージの作成、アップロード、プル、およびデプロイ操作 (Alibaba Cloud を使用)
  • Dockerイントラネット侵入FRP展開の実装プロセスの分析

<<:  CentOS 6.4 MySQL 5.7.18 のインストールと設定方法のグラフィックチュートリアル

>>:  Reactは適応性の高い仮想リストを実装する

推薦する

Vueはページング機能を実装する

この記事の例では、ページング機能を実装するためのVueの具体的なコードを参考までに共有しています。具...

grpc のリバース プロキシとして nginx を使用する場合の落とし穴の概要

背景ご存知のとおり、nginx は高性能な Web サーバーであり、負荷分散やリバース プロキシによ...

デザイン理論: テキストの読みやすさと可読性

<br />少し前に、ビジネス上の必要性から、ラップトップに Souba をインストール...

CSS 擬似要素::マーカーの詳細な説明

この記事では、CSS ::markerの興味深い疑似要素を紹介します。これを使用すると、テキスト番号...

MySQL トリガー: 複数のトリガー操作の作成例の分析

この記事では、例を使用して、MySQL で複数のトリガー操作を作成する方法について説明します。ご参考...

Windows での MySQL 8.0.13 解凍バージョンのインストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.13のインストールグラフィックチュートリアルを紹介します...

Linux NFSメカニズムの動作原理と例の分析

NFS とは何ですか?ネットワークファイルシステムネットワーク上でファイルを保存および整理するための...

dl、dt、dd はいつ使用するのが適切ですか?

dl:定義一覧定義リストdt:定義タイトルタイトルを定義するdd:定義説明定義の説明dt は情報のタ...

Alibaba Cloud Centos7のインストールとSVNの設定

1. SVNサーバーをインストールする yum でサブバージョンをインストール2. SVNバージョン...

Vue で配列パラメータを渡すための get / delete メソッド

フロントエンドとバックエンドがやり取りする場合、get または delete を介してバックエンドに...

JS ループで async と await を正しく使用する方法

目次概要(ループモード - 共通)配列と非同期メソッドを宣言して反復するforループで使用するマップ...

MySQL で指定エンコーディングを実装する際の落とし穴について

前面に書かれた環境: MySQL 5.7+、MySQL データベースの文字エンコードは utf8、テ...

複雑なウェブサイトのナビゲーションを簡素化

<br />ナビゲーション設計は構造設計における主要なタスクの 1 つです。ソフトウェア...

js の getBoundingClientRect() メソッドの詳細な説明

1. getBoundingClientRect() 分析getBoundingClientRect...