声明
强烈建议用podman替代Docker,详情可以参见本站中另一篇文章: immortalwrt之用podman替代Docker
安装Docker
安装 docker、docker-compose、dockerd这几个包即可,不要安装luci-app-docker和luci-app-dockerman。后者只会增加配置复杂度。
完成安装后,启动dockerd服务:
service dockerd enable
service dockerd start
reboot安装Portainer
Portainer实际上就是一个Docker容器,它提供了管理其他Docker容器以及配置Docker自身的图形化界面,格外好用。参考官网教程安装:
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts然后即可通过9000端口访问,方便起见可以用Caddy进行反代。
配置防火墙
默认情况下,immoralwrt会自行创建一个docker的网络接口,点击“编辑”可看到对应设备是 桥接:“docker”(docker)。在防火墙中新建一个区域,随便起个名字,比如 docker ,如图设置后保存。
然后回到 接口 配置页面,将刚创建的防火墙区域分配给名为docker的接口:
这样配置后,对于使用Docker默认桥接网络的容器,可以实现2个作用:
lan可以访问容器(反之不行,因为在允许转发到目标区域中,我们没有添加lan,这是出于安全考虑)
容器可以访问外网。
显然对于没有使用Docker默认桥接网络的容器,我们面临着两个严峻问题:
无法从lan访问容器。当然像网站类应用,你可以通过Caddy反代,但是问题2无法绕过;
容器无法联网。许多容器功能依赖于互联网,比如halo站点在线安装、升级插件,没有联网就无法实现。
现在来解决这两个问题。
查看网桥名称
当我们在Docker中创建一个网络时,实际上是新建了一个网桥,所以只要将这些网桥添加到之前的防火墙区域,所有问题便迎刃而解。
新建一个名为 docker-bridge.sh 的脚本,内容如下:
docker network ls --format "{{.Name}}" | while read name; do
if [ "$name" != "bridge" ]; then # 排除默认的bridge网络,因为它通常已经工作
bridge_name=$(docker network inspect "$name" --format "{{ (index .Options \"com.docker.network.bridge.name\") }}" 2>/dev/null)
if [ -z "$bridge_name" ]; then
# 如果没有明确的com.docker.network.bridge.name选项,通常是br-<network_id的前12位>
network_id=$(docker network inspect "$name" --format "{{.Id}}")
bridge_name="br-${network_id:0:12}"
fi
echo "Docker network '$name' uses bridge interface: $bridge_name"
fi
done然后执行脚本:
root@ImmortalWrt:~# sh docker-bridge.sh
Docker network 'datas_default' uses bridge interface: br-6551bbaccea5
Docker network 'halo_default' uses bridge interface: br-30a0470bbfbb
Docker network 'host' uses bridge interface: br-c372f9e1ea26
Docker network 'none' uses bridge interface: br-c60a09ffd1ff
Docker network 'test-net1' uses bridge interface: br-5165069dfd1f
Docker network 'wordpress_default' uses bridge interface: br-0341cd31c44d可见 br-30a0470bbfbb 和 br-0341cd31c44d 是我的halo容器与wordpress容器所在的网桥。防火墙-区域设置中,在涵盖的设备中添加这两个网桥,保存生效:
至此所有问题完美解决。之前halo插件安装500问题等等随之迎刃而解。