在使用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
```