在宿主机(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半天劲也搞不好