1. 程式人生 > >docker容器內網路請求緩慢問題解決

docker容器內網路請求緩慢問題解決

在使用docker的過程中發現了幾個問題,在docker裡進行的網路請求經常會失敗,比如npm install以及bundle install等操作,或者是作為中間層在應用中去獲取api資料的過程經常會出現timeout等情況,所以開始探究docker的網路機制,以解決網路請求太慢的問題。

一、docker的網路模式

1、none

當配置為none時,docker容器網路無法輸入輸出,與世隔絕。

2、bridge

預設為bridge模式,docker有自己的虛擬網絡卡,通過橋接的方式從主機獲得網路。

3、host

當指定為host時,主機的網絡卡直接暴露給了容器,直接通過主機的網路上網,比如要拿主機上的redis服務127.0.0.1:6357,就得通過這種方法,不過就比較不安全了。

4、container

使用其他容器的網路

二、docker的dns解析

docker容器本質上也是個linux,所以dns的解析方法和linux一樣,優先是找/etc/hosts檔案,像localhost這種域名就是寫在這個檔案裡,比如:

127.0.0.1 localhost

如果docker容器link了其他容器,這裡也會多出link的域名,比如:

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

就會在hosts裡多出

172.17.0.3 app-redis 038c8388e4a1

找完/etc/hosts檔案,然後是/etc/resolv.conf檔案:

domain local
nameserver 192.168.65.1
nameserver 192.168.65.10

三、解決docker容器裡網路請求慢的問題

經過抓包測試等分析,發現網路請求慢,主要發生在dns解析中,所以主要採取dns優化:
如果請求的是自己內網的api, 可以直接修改/etc/hosts檔案,如果是外網的請求可以通過更改/etc/resolv.conf裡的nameserver實現。
docker容器肯定不是直接通過修改檔案實現的,可以通過run的命令實現:

# 新增host
docker run --name app --add-host='api.embbnux.com:10.98.10.98' -d ubuntu
# 指定dns server docker run --name app --dns=223.5.5.5 --dns=8.8.8.8 -d ubuntu

這樣在docker容器裡dns解析階段的時間就被加速了