• 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
    ```

  • 相关阅读:
    PDF解除密码怎么操作?教你一键解除密码
    难对齐、难保障、难管理?一文了解字节跳动如何解决数据SLA治理难题
    tsp可视化python
    【MLT】MLT多媒体框架生产消费架构解析(三)
    Django教程
    接口测试框架:Http+Requests(1)
    css 实现打字效果
    状压dp:Gym - 102832J
    学习笔记-静态路由配置有来无回导致无法访问目标IP
    米诺地尔行业分析:预计2029年将达到14亿美元
  • 原文地址:https://blog.csdn.net/weixin_73725158/article/details/134433898