[英]Docker create two bridges that corrupts my internet access
我面臨一個非常奇怪的問題:
這是我的配置:
我在不同的互聯網提供商的兩個不同地方工作。
首先,一切正常,我可以開箱即用地運行 docker 並毫無問題地訪問互聯網。
但另一方面,當 docker運行時,我無法訪問互聯網,更准確地說,當 docker 創建的兩個虛擬橋啟動時。
在這個地方,互聯網連接運行非常奇怪,我可以在 8.8.8.8 ping google dns,但幾乎所有 dns 請求都失敗了,而且大部分時間互聯網連接都在幾秒鍾后完全斷開。
(第一和第二之間的唯一區別是互聯網提供商)。
起初我認為我可以通過更改默認網橋 ip 來解決這個問題,但這根本不能解決問題。
關鍵是docker守護進程的--bip選項更改了默認docker網橋docker0的 IP,但docker還創建了另一個名為br-1a0208f108d9 的網橋,它不反映傳遞給--bip選項的設置。
我猜這第二個網橋給我的網絡造成了麻煩,因為它與我的 wifi 適配器配置重疊。
我很難對此進行診斷。
我的問題是:
有了這個麻煩,我覺得我已經很接近提升我的 docker 知識了,但在此之前我必須增加我的網絡管理知識。
希望你能幫忙。
閱讀本文后,我設法解決了這個問題:
第二個 docker網橋br-1a0208f108d9是由docker創建的,因為我使用的是 docker-compose 文件,該文件涉及創建其他自定義網絡。
此網絡使用固定的 ip 范圍:
networks:
my_network:
driver: bridge
ipam:
config:
- subnet: 172.16.0.0/16
gateway: 172.16.0.1
這與自定義 docker 網絡發生沖突。
解決方案只是更改自定義 docker 網絡的 IP。
您必須告訴 Docker 使用不同的子網。 編輯/etc/docker/daemon.json
並使用如下內容:
{
"bip": "198.18.251.1/24",
"default-address-pools": [
{
"base": "198.18.252.0/22",
"size": 26
}
]
}
信息有點難獲取,但看起來bip
選項控制分配給docker0
接口的 IP 和子網,而default-address-pools
控制用於br-*
接口的地址。 您可以省略bip
在這種情況下,它將從池中獲取分配,並且bip
不必駐留在池中,如上所示。
size
是分配給每個 Docker 網絡的子網的size
。 例如,如果您的base
是/24
並且您還將size
設置為24
,那么您將能夠創建一個 Docker 網絡,並且您可能只能運行一個 Docker 容器。 如果您嘗試啟動另一個,您將收到消息could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
in the could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
,這意味着您已經用完了池中的 IP 地址。
在上面的示例中,我分配了一個/22
(1024 個地址),每個網絡/容器從該池中獲取一個/26
(64 個地址)。 1024 ÷ 64 = 16,因此您可以使用此配置運行多達 16 個 Docker 網絡(因此最多可同時運行 16 個容器,如果其中一些共享同一網絡,則最多可運行更多)。 因為我很少同時有兩個或三個以上的運行容器,所以這對我來說很好。
在我的示例中,我使用了RFC 3330 中列出的198.18.0.0/15
子網的一部分(但完整記錄在RFC 2544 中),該子網保留用於性能測試。 這些地址不太可能出現在真實的 Internet 上,也沒有專業的網絡提供商會在他們的私有網絡中使用這些子網,因此在我看來,它們是與 Docker 一起使用的不錯選擇,因為沖突的可能性很小。 但從技術上講,這是對該 IP 范圍的濫用,因此如果您還選擇使用這些子網,請注意未來可能發生的沖突。
{
"bip": "",
"default-address-pools": [
{"base": "172.80.0.0/16", "size": 24},
{"base": "172.90.0.0/16", "size": 24}
]
}
如上所述,默認的空bip
意味着它只會從池中獲取分配,就像任何其他網絡/容器一樣。
在我的情況下,我不會應用 Clement 解決方案,因為我的網絡沖突僅與我的開發電腦發生沖突,而容器被交付給許多不受影響的服務器。 我認為這個問題應該按照這里的建議解決。 我試過這個解決方法:
我用“docker-compose down”停止了容器,這會破壞橋
當我在“壞”網絡上時啟動了容器,所以容器使用另一個網絡
從那以后,如果我在任何網絡上重新啟動容器,它就不會嘗試使用“壞”的容器,通常會獲取最后使用的容器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.