爱快软路由的深入研究(Docker)
1. 创建一个Docker(shinsenter/s6-ubuntu:20.04),把docker.sock挂载进去
容器列表--添加--高级设置--挂载目录 添加以下两个路径
原路径 目标路径
/../../var/run/docker.sock /var/run/docker.sock
/../../ /host
其他设置按照正常操作来,创建一个Ubuntu或者Debian容器即可。以下以 ubuntu:20.04 为例操作。
解释:
第一行docker.sock是映射到容器中,从而使创建的容器和爱快的Docker有一样的权限
第二行是把主机根目录映射到容器的 /host 目录中,从而实现对爱快主机文件的查看和修改(修改后重启爱快失效,无法保存)
2.在容器中安装Docker
快捷安装:
apt update && apt-get install -y docker.io
安装完成后,即可使用爱快主机Docker的所有权限了。
因为docker.sock已经挂载,所以安装的Portainer已经可以管理爱快的所有容器,而不是仅能管理自己。
3. 创建使用host网络和特权的容器,为了方便顺带把磁盘也挂载了,选择shinsenter/s6-ubuntu:20.04镜像是该镜像可以方便的做服务
docker run -itd --name s6 --network=host --privileged -v /etc/disk:/etc/disk -v /etc/disk_user/:/etc/disk_user/ -v /var/run/docker.sock:/var/run/docker.sock --restart=always shinsenter/s6-ubuntu:20.04 /init
4. macvlan配置
先安装iproute2,docker
docker exec -it s6 bash
apt update && apt-get install -y docker.io iproute2
docker 创建macvlan网络
docker network create -d macvlan --subnet=192.168.9.0/24 --gateway=192.168.9.1 -o parent=lan1 macnet
ip link add macvlan1 link lan1 type macvlan mode bridge
ip addr add 192.168.9.1 dev macvlan1
ip link set macvlan1 up
ip route add 192.168.9.100 dev macvlan1
注意:新版爱快默认Lan IP为192.168.9.1,故设置192.168.9.X,如果你修改了根据Lan的IP自行修改IP地址。
创建一个macvlan的虚拟网卡并配置ip,将想要创建的docker的ip路由到虚拟网卡上
192.168.9.100这个是新创建的容器ip,让他可以联网。
解释:如果命令改成下面的
ip route add 192.168.9.0/25 dev macvlan1
则192.168.9.2-192.168.9.127这个IP范围的容器都可以默认上网。
192.168.9.0/24的macvlan1回车默认lan1冲突,故不能设置,如果lan1的子网大,不冲突,那么macvlan1的也可以增大
总之哪个ip在route里面就可以直接联网,否则没有网络。
5.创建docker 容器测试联网
开机配置macvlan,此时就需要用到s6镜像的init功能了,在host网络且有特权的容器创建脚本将macvlan的配置写进去
由于创建容器设置了restart=always,顾会开机执行,达到自动配置的效果,至此macvlan配置以完成。
开机启动脚本
/etc/cont-init.d/001-set-macvlan.sh
chmod +x /etc/cont-init.d/001-set-macvlan.sh
脚本如下:
XML/HTML代码
- #!/bin/bash
- ip link add macvlan1 link lan1 type macvlan mode bridge
- ip addr add 192.168.9.1 dev macvlan1
- ip link set macvlan1 up
- ip route add 192.168.9.100 dev macvlan1
XML/HTML代码
- echo '#!/bin/bash' > /etc/cont-init.d/001-set-macvlan.sh
- echo 'ip link add macvlan1 link lan1 type macvlan mode bridge' >> /etc/cont-init.d/001-set-macvlan.sh
- echo 'ip addr add 192.168.9.1 dev macvlan1' >> /etc/cont-init.d/001-set-macvlan.sh
- echo 'ip link set macvlan1 up' >> /etc/cont-init.d/001-set-macvlan.sh
- echo 'ip route add 192.168.9.100 dev macvlan1' >> /etc/cont-init.d/001-set-macvlan.sh
- chmod +x /etc/cont-init.d/001-set-macvlan.sh
docker run -d --restart=always --name="portainer" --net=host -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce
不用映射直接使用路由的wan或者lan的ip端口9000直接访问。(在s6这个容器中启动)
简单分析:
通过爱快主机 /../../var/run/docker.sock 映射到容器ubuntu的 /var/run/docker.sock 中,从而使容器获取到了docker的完全管理权限,通过ubuntu建立的容器才有特权,可以直接读写物理机的文件,也可以创建host网络。但是ubuntu这个容器本身没有host网络,是在爱快中建立的网络,所有它本身不能控制爱快的docker网络设置,只能通过他建立一个s6的特权容器,使用host网络和docker.sock,s6就具有容器的最高完全权限,比如创建macvlan,桥接,自己建立静态路由使其他容器可以上网,也可以直接读取爱快系统的全部文件。
爱快 /etc/disk /etc/disk_user 为数据分区挂载路径。 /etc/mnt 是挂载的配置文件保存分区。
简化版:
跳板:
使用向导建立容器Alpine,体积小,速度快,仅仅是利用docker.sock文件权限获取Docker权限
容器名称 Alpine
镜像 alpine:latest 7.43 MB使用它作为跳板,体积小速度快可以用完就删了
内存 64m或者128m都可以
网络接口使用自己建立的那个
IP随意或者不填
高级设置-挂载目录:(必填)
/../../var/run/docker.sock /var/run/docker.sock
启动后进入控制台输入以下命令,建立特权容器:
XML/HTML代码
- apk add docker
- docker run -itd --name s6 --network=host --privileged -v /etc/disk:/etc/disk -v /etc/disk_user/:/etc/disk_user/ -v /var/run/docker.sock:/var/run/docker.sock --restart=always shinsenter/s6-ubuntu:20.04 /init
Alpine的跳板任务完成,可以删除。
中转:
Web找到s6这个特权容器,通过控制台输入以下命令:
XML/HTML代码
- apt update && apt-get install -y docker.io iproute2 net-tools
XML/HTML代码
- docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=lan1 macnet
- ip link add macvlan1 link lan1 type macvlan mode bridge
- ip addr add 192.168.0.1 dev macvlan1
- ip link set macvlan1 up
- ip route add 192.168.0.100 dev macvlan1
设置开机启动脚本(实现爱快重启macvlan不丢失配置):
XML/HTML代码
- echo '#!/bin/bash' > /etc/cont-init.d/001-set-macvlan.sh
- echo 'ip link add macvlan1 link lan1 type macvlan mode bridge' >> /etc/cont-init.d/001-set-macvlan.sh
- echo 'ip addr add 192.168.0.1 dev macvlan1' >> /etc/cont-init.d/001-set-macvlan.sh
- echo 'ip link set macvlan1 up' >> /etc/cont-init.d/001-set-macvlan.sh
- echo 'ip route add 192.168.0.100 dev macvlan1' >> /etc/cont-init.d/001-set-macvlan.sh
- chmod +x /etc/cont-init.d/001-set-macvlan.sh
其他:
在s6的容器中创建portainer
使用http://192.168.0.1:9000登录
XML/HTML代码
- docker run -d --restart=always --name="portainer" --net=host -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce
XML/HTML代码
- docker run -d --restart=always --name="portainer" --net=macnet --ip 192.168.0.100 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce