docker容器如何与宿主机通信


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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM