先讲一下场景: nginx 容器要和SpringBoot 容器部署在一台机器上, nginx 为 SpringBoot 提供反向代理, 需要在 nginx.conf 中写上 SpringBoot 的网址, 为了保证 nginx 容器有很好的迁移特性, 反向代理网址自然不能用 IP 来指定 springboot 网址了. 下面是几种做法.
===================================
1. nginx.conf 使用 localhost 来指向 springBoot 系统, 并 nginx 容器使用 host 网络
===================================
springBoot 容器按照正常方式启动, 可以加上 docker run -p 8080:8080 这样的端口映射. nginx 容器启动需要使用 docker run --net=host 启动, 不能加 -p 参数(其实加上 -p 参数可以运行, 但端口映射不起作用). 注意一定要使用 host 网络, 因为 nginx.conf 中使用了 localhost 来关联 springboot, 所以必须使用 host 网络, 即使用宿主机network 命名空间, 如果不使用宿主机network, 这里的localhost 就是nginx 容器的localhost了, 并不是宿主机的localhost, 也就不能关联到 springboot 容器了.
===================================
2. nginx.conf 使用 localhost 来指向 springBoot 系统, 并 nginx 容器加上 link 参数
===================================
springBoot 容器按照正常方式启动, 可以加上 docker run -p 8080:8080 这样的端口映射. nginx 容器启动需要使用 docker run --link springboot_container:localhost 启动. 在这种情况下, nginx 还是使用默认的 bridge 网络形式
===================================
3. nginx.conf 使用宿主机的 docker0 网卡 ip
===================================
在安装Docker的时候, 会在宿主机安装一个虚拟网关docker0,
我们可以使用宿主机在docker0
上的IP地址来代替localhost, Linux 下 docker0 的ip 一般为 172.17.0.1 , 注意该ip 地址是可以被修改的.
容器启动时候, 如果没有设定 --net 参数, 其实等同于 --net=bridge, 即进入网桥模式, 这时docker daemon就会扮演 DHCP 服务器, 为容器分配一个和 docker0 同网段的ip, 并连接到 docker0 . 所以在容器中, 总是可以通过 docker0 的ip 访问到 host 主机.
显示 docker0 网卡 ip 的命令是:
ip addr show docker0
===================================
4. nginx.conf 使用 springboot 的容器名
===================================
假设 springboot 容器名为 springboot_container, 在 nginx.conf 这次使用 http://springboot_container:8080 的方式指向 springboot 网址.
nginx 容器启动需要使用 docker run --link springboot_container 启动
当然 link 参数已经不推荐了, 而刻意使用 network 来替换, 思路是一样的.
===================================
参考:
===================================
https://jingsam.github.io/2018/10/16/host-in-docker.html
https://blog.csdn.net/chengqiuming/article/details/80958834