如果是单机环境,很简单,不必琢磨怎么突破命名空间限制,直接用环境变量送进去即可。
docker run -d -e HOST_IP=<宿主的IP地址> nginx
然后容器内直接读取 HOST_IP 环境变量即可。
进程运行在容器中,如果通过localhost访问的是容器的localhost,而不是宿主机的localhost。
如何从容器中访问到宿主机的网络?
安装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
、bridge
、none
,三种网络可以配置。
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参数来进行容器和宿主机端口的映射,因为容器本身就与宿主机共享了网络,因此容器中暴露的端口就是宿主机上暴露的端口
host
的方式,不需要修改IP地址,容器运行在不同的系统中都可以,很通用。host
直接使用宿主机的网络,没有bridge
的隔离性好,安全性不高