在宿主機(windows/mac/linux)安裝並啟動docker后,會自動創建3個docker network:bridge、host、none。可以用docker network ls命令查看。
用docker network inspect bridge、docker network inspect host、docker network inspect none命令查看各docker network,會發現只有bridge有網段,假如是
{
"Subnet":"192.168.10.0/24",
"Gateway":"192.168.10.1"
}
一、假如宿主機是linux系統,有一個監聽8000端口的其他進程
在宿主機上執行ifconfig命令,可以發現有一個docker0網卡,注意觀察其網段和docker network inspect bridge的網段是一致的,宿主機在此網段下也分配了一個ip,一般是網段中的第一個ip,假如是192.168.10.1。
1)假如用默認的bridge模式啟動容器,即在啟動時不指定network參數或者指定了--network bridge,
在容器中執行ifconfig命令,可以發現容器的ip也在上面的網段中,假如是192.168.10.2。
在容器中,ping 192.168.10.1,可以ping通。在宿主機中ping 192.168.10.2,可以ping通。
在容器中,可以用192.168.10.1:port的方式訪問宿主機的服務。
2)假如容器用host網絡模式啟動,即在啟動時添加了--netwok host參數,
那么容器會和宿主機共享網絡,直接telnet 127.0.0.1 8000可以telnet通。
二、假如宿主機是mac,有一個監聽8000端口的其他進程
宿主機不會有docker0網卡
1)假如用默認的bridge模式啟動容器
參考docker安裝nginx
2)假如容器用host網絡模式啟動
容器不能訪問mac宿主機的服務
3)用自定義的docker network模式啟動容器
在宿主機上執行docker network create n1,用docker network inspect n1命令查看,發現n1有一個新的網段,假如是
{
"Subnet":"172.18.0.0/16",
"Gateway":"172.18.0.1"
}
在啟動容器時指定--network n1
在容器中,指定ifconfig命令,可以看到容器的ip在n1的網段中,也可以看到容器的ip,假如是172.18.0.2。
在容器中ping 172.18.0.1,可以ping通。
在宿主機中ping 172.18.0.2,ping不通。在宿主機執行ifconfig命令,看不到n1。那么宿主機的ip是多少呢?
在容器中用host.docker.internal指代宿主機ip,可以通過在容器中執行ping host.docker.internal命令得到宿主機的ip。用gateway.docker.internal指代gateway,ping gateway.docker.internal可以獲取到網關地址。
在容器中,telnet host.docker.internal 8000是可以telnet通的。
三、假如宿主機windows系統
windows電腦就不要搞docker啦!費tm半天勁也搞不好