背景
在一臺(tái)服務(wù)器上,存在多個(gè)應(yīng)用并且都是通過docker-compose啟動(dòng)。為了避免網(wǎng)段(IP)沖突怀酷,事先在/etc/docker/daemon.json
中添加了參數(shù)default-address-pools
,如下:
{
"default-address-pools": [
{
"base": "172.100.0.0/16",
"size": 24
},
{
"base": "172.101.0.0/16",
"size": 24
},
{
"base": "172.102.0.0/16",
"size": 24
}
]
}
在該服務(wù)器上再部署幾個(gè)應(yīng)用,并且都是通過docker-compose啟動(dòng)猪杭,此時(shí)應(yīng)用啟動(dòng)失敗,提示如下錯(cuò)誤:
ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
猜想:假設(shè)部署應(yīng)用后先不啟動(dòng)妥衣,直接重啟服務(wù)器皂吮,讓docker守護(hù)進(jìn)程拉起應(yīng)用,此時(shí)部分應(yīng)用應(yīng)該會(huì)啟動(dòng)失敗税手。
原因
假設(shè)服務(wù)器上docker網(wǎng)絡(luò)有如下:
[root@localhost docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b820882cd705 bin_a_default bridge local
53feb3497270 bin_b_default bridge local
b820882cd701 bin_d_default bridge local
53feb3497272 bin_e_default bridge local
b820882cd703 bin_f_default bridge local
2fc12b3e7fd5 bridge bridge local
4de99102b93b host host local
f408314129a1 none null local
默認(rèn)情況下蜂筹,docker的bridge網(wǎng)絡(luò)需要一個(gè)網(wǎng)段,每個(gè)docker-compose啟動(dòng)服務(wù)都需要一個(gè)網(wǎng)絡(luò)芦倒。此時(shí)default-address-pools
中只有3個(gè)網(wǎng)段艺挪,但是現(xiàn)在需要6個(gè)網(wǎng)段(bridge、bin_a_default兵扬、bin_b_default麻裳、bin_c_default、bin_d_default器钟、bin_e_default津坑、bin_f_default),所以就出現(xiàn)上述的錯(cuò)誤提示俱箱。
提示:通過如上的分析国瓮,每當(dāng)我們在服務(wù)器上用docker-compose新啟動(dòng)一個(gè)服務(wù)(原先的創(chuàng)建network還存在),就需要解決這個(gè)網(wǎng)段不夠的問題
解決辦法
本質(zhì):為服務(wù)器上的應(yīng)用啟動(dòng)提供足夠IP地址(IPv4 address pool)狞谱。
- 把多余的網(wǎng)絡(luò)移除乃摹。
docker network rm <network_name>
- 在
/etc/docker/daemon.json
中增加default-address-pools
的值,然后重啟docker跟衅。 - 在應(yīng)用服務(wù)啟動(dòng)前孵睬,為其創(chuàng)建沒有網(wǎng)段沖突的網(wǎng)絡(luò),然后在其的
docker-compose.yml
中配置剛剛創(chuàng)建的網(wǎng)絡(luò)伶跷。如:
docker network create --subnet "172.100.0.0/16" mynet
- 在
docker-compose.ym
l中指定網(wǎng)絡(luò)并使用