前言
在使用Docker部署应用时,Docker推荐的方式是将应用及其所依赖的服务(MySQL,Redis等)均使用Docker部署,并通过 link 或自定义网络相连接。但是,当应用所依赖的服务被安装在宿主机上时,我们需要让容器中的应用能够访问到部署在宿主机上的服务。本文将介绍实现这一目的的几种方案,并分析其优缺点。
关于Docker网络的知识请查看:Docker网络详解。
方案
方案一:使用host模式
Docker容器运行的时候有 host 、 bridge 、 none 三种网络可供配置。默认是 bridge ,即桥接网络,以桥接模式连接到宿主机; host 是宿主网络,即与宿主机共用网络; none 则表示无网络,容器将无法联网。
当容器使用 host 网络时,容器与宿主共用网络,这样就能在容器中访问宿主机网络,那么容器的 localhost 就是宿主机的 localhost 。
通过 docker run 启动容器时加入 --net=host 参数,或在 docker-compose 文件中指定 network_mode: "host"
该参数指定该容器使用host网络模式,因此也无需映射端口。
优点
- 最简单粗暴的解决方案,方便快捷
缺点
- host网络没有与宿主机网络隔离,可能引发安全隐患或端口冲突
- 仅适用于Linux
方案二:使用宿主机IP
在安装Docker的时候,会在宿主机安装一个虚拟网关 docker0 ,我们可以使用宿主机在 docker0 上的IP地址来代替 localhost 。
在默认的bridge模式下,docker0网络的默认网关即是宿主机。在Linux下,docker0网络通常会分配一个172.17.0.0/16的网段,其网关通常为172.17.0.1;macOS下的网段则为192.168.65.0/24,网关为192.168.65.1。在容器中使用该IP地址即可访问宿主机上的各种服务。
优点
- 避免了方案1的缺点
缺点
- 此IP并不一定完全固定,可能会因系统及配置而发生变化
- 容器经由docker0网桥无法访问到监听地址是127.0.0.1的应用。需要将MySQL等配置为监听0.0.0.0