前言
家里有许多服务,包括需要在外面访问的(比如git服务,nas服务等),还有一些只在内网访问的(比如jenkins,docker仓库),之前这些统一用了树莓派部署的nginx作为反向代理,一直想把这个设备优化掉,把nginx服务放到群晖上,做成all in one,但是一直面临着端口占用的问题。
对外的服务还好说,因为电信的封锁80,443的缘故,所以本来也无法使用这两个端口,随便搞个端口做映射就好了,但是内网的服务就不想在访问时还加个端口号了,但是群晖自身的nginx占用了80和443端口,无法再进行映射。最近终于通过docker的macvlan解决了问题,特意记录一下。
实现
创建macvlan网络
参考这里
创建容器
docker run -d --name nginx --network vnet --ip 192.168.3.240 nginx
然后局域网内通过ip就能够直接访问了
直接通过80和443端口访问
注意
根据网络创建的那篇文章,为了能够使容器和宿主机能够相互访问,需要在物理网卡上再创建一个macvlan,但是这个配置我没有在群晖上找到持久化的方法,群晖重启之后就会时效,所以这里我使用了个定时任务来实现。在群晖上配了个5分钟一次的定时任务就好。
#!/bin/bash
if ip r |grep -w "192.168.3.240"; then
exit 0
else
ip link add net-shim link ovs_eth1 type macvlan mode bridge
ip addr add 192.168.3.239/32 dev net-shim
ip link set net-shim up
ip route add 192.168.3.240/28 dev net-shim
fi