容器访问宿主机网络

单机环境

如果是单机环境,很简单,不必琢磨怎么突破命名空间限制,直接用环境变量送进去即可。

docker run -d -e HOST_IP=<宿主的IP地址> nginx

然后容器内直接读取 HOST_IP 环境变量即可。

集群环境

进程运行在容器中,如果通过localhost访问的是容器的localhost,而不是宿主机的localhost。

如何从容器中访问到宿主机的网络?

  1. 使用宿主机IP
  2. 使用host网络

使用宿主机IP

安装Docker的时候,会在宿主机上安装一个虚拟网关docker0,可以使用宿主机在docker0上的IP地址来替代localhost。

sugoi@thinkpad:~$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:c3ff:fed9:32c0  prefixlen 64  scopeid 0x20<link>
        ether 02:42:c3:d9:32:c0  txqueuelen 0  (以太网)
        RX packets 654034  bytes 35089343 (35.0 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 757538  bytes 15529486900 (15.5 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0的宿主机IP地址为172.17.0.1,直接使用这个IP地址,可以实现容器访问宿主机网络。

注意,不同系统下,docker0可能是不一样的,通过这个IP地址访问不通用。

使用host网络

容器运行的时候有hostbridgenone,三种网络可以配置。

  • 默认使用bridge,即桥接网络,以桥接的模式连接到宿主机
  • host,直接使用宿主机网络,即容器与宿主机共用网络
  • none,表示无网络,这种情况下,容器将无法联网

docker 运行时,使用如下参数设置容器的网络:

--network string                 Connect a container to a network (default "default")
--network-alias list             Add network-scoped alias for the container

当--network 设置参数为host时,可以不用-p参数来进行容器和宿主机端口的映射,因为容器本身就与宿主机共享了网络,因此容器中暴露的端口就是宿主机上暴露的端口

  1. 优势:使用host的方式,不需要修改IP地址,容器运行在不同的系统中都可以,很通用。
  2. 不足:host直接使用宿主机的网络,没有bridge的隔离性好,安全性不高
上次修改: 14 April 2020