• Docker 容器中的网络优化与 DNS 缓存清理


    在使用Docker 18.03.1-ce版本在Ubuntu 18.04 LTS上运行多个Docker容器时,我发现当使用requests库发送请求到某个主机名时,响应速度非常慢。在本例中,每个容器都有自己的CherryPy服务器,并通过requests.get('http://main:8083')或requests.get('http://controller:8082')的方式进行通信。所有的容器都属于一个Docker Compose stack,并由docker-compose创建了一个公共网络。

    同样问题也出现在运行Windows操作系统的主机机器上,尝试获取一个本地页面时,请求工作正常。

    值得注意的是,这个问题只在Ubuntu 18.04 LTS上运行的Docker主机上不存在,如果在主机机器运行bench.py程序,无论使用localhost还是127.0.0.1,都能正常工作。

    解决方案:

    为了更好地理解问题,我们使用了bench.py程序,该程序使用了urllib3和requests两个库发送请求并记录响应时间。

    1. 对于urllib3:

    我们首先使用urllib3库的PoolManager发送GET请求到localhost和127.0.0.1,并记录响应时间。结果显示,无论是localhost还是127.0.0.1,响应时间都很短。

    2. 对于requests:

    然后我们使用requests库的get方法发送GET请求到localhost和127.0.0.1,并记录响应时间。结果显示,无论是localhost还是127.0.0.1,响应时间都很短。

    通过对比urllib3和requests的响应时间,我们可以看到,问题可能出在requests库中。

    然后我们查阅了requests库的文档,发现requests库使用了urllib3库来进行HTTP请求。因此,我们猜测问题可能出在urllib3库上。

    我们进一步查阅了urllib3库的文档,发现urllib3库在处理DNS解析时,会使用系统的DNS缓存。因此,我们猜测问题可能出在系统的DNS缓存上。

    为了解决问题,我们可以通过以下步骤来解决:

    1. 首先,我们可以在Docker主机上运行以下命令来清除DNS缓存:

    ```shell
    docker-compose run --rm --network=compose_default bench bench.py
    ```

    其中,'bench'是我们的Docker容器的名字,'bench.py'是我们的bench程序。

    2. 然后,我们可以在Docker主机上运行以下命令来检查DNS缓存:

    ```shell
    docker-compose run --rm --network=compose_default bench bench.py
    ```

  • 相关阅读:
    网络编程之多播
    网络流量预测工具
    CesiumJS 2022^ 源码解读[0] - 文章目录与源码工程结构
    springboot萌宠宠物网店的开发与设计 毕业设计-附源码011042
    京东物流常态化压测实践
    Linux脚本练习之script088-netstat练习之输出每个IP的连接数
    Linux 基本命令--查询命令帮助语句
    Spring Boot简介
    JVM常见面试题
    WPF 控件专题 TreeView控件详解
  • 原文地址:https://blog.csdn.net/weixin_73725158/article/details/134433898