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は適応性の高い仮想リストを実装する

推薦する

MySQL テーブル名の大文字と小文字の選択

目次1. 大文字と小文字の区別を決定するパラメータ2. パラメータ変更に関する注意事項要約: 1. ...

JS にこれがあるのはなぜですか?

目次1. 需要2. 解決策3. 最初の改善4.砂糖を加える5. 理解不能6. 問題点7. オブジェク...

コードをセマンティックにする HTML のヒント

HTML のセマンティクスはありふれた問題のようです。Google で検索すると、セマンティクスに関...

CentOS 7.5 が Varnish キャッシュサーバー機能を導入

1. ワニスの紹介Varnish は、高性能なオープンソースのリバースプロキシサーバーおよび HTT...

Jmeterはデータベースプロセスダイアグラムに接続します

1. MySQL jdbc ドライバー (mysql-connector-java-5.1.28.j...

Nginx の純粋な構成でリアルタイム ログ レポートを実現するためのアイデアと方法

目次序文実装のアイデア実装手順1. Nginxをコンパイルする2. 設定ファイルは以下のとおりです要...

jQuery はシャッター効果を実現します (li 配置を使用)

この記事では、ブラインド効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具体...

MySQL 8.0 の新しいリレーショナル データベース機能の詳細な説明

序文MySQL 8.0 の最新バージョンは 8.0.4 rc であり、正式版は近日中にリリースされる...

MySQL マスタースレーブレプリケーションの役割と動作原理の詳細な説明

1. マスタースレーブレプリケーションとは何ですか?マスタースレーブレプリケーションは、スレーブデー...

JavaScript の document.activeELement フォーカス要素の紹介

目次1. デフォルトの焦点はボディにあります2. テキストボックスのフォーカスを手動で取得する3. ...

Centos7 への MySQL8 のインストールチュートリアル

MySQL 8 の新機能: MySQL をバージョン 5.x から 8.x に直接アップグレードする...

jsはキャンバスに基づいて時計コンポーネントを実装します

圧縮アップロード画像、スクラッチカード、ポスター作成、チャートプラグインなど、フロントエンド開発にお...

Linux で docker-compose を使用したソフトウェア構成の詳細な説明

序文この記事では、docker-compose の構成をいくつか紹介します。これらを参考にして、独自...

Vueはシンプルなマーキー効果を実装します

この記事では、Vueの具体的なコードを共有して、シンプルなマーキー効果を実現しています。具体的な内容...

kubernetes1.5.2 から kubernetes1.10 にアップグレードする際の主要な設定変更記録

この記事では、kubernetes1.5.2 から kubernetes1.10 にアップグレードす...