由于新西兰运营商Skinny为家宽分配公网ip,于是我在家中用一台Mac Mini搭建了一个服务器。但是在选择面板的时候遇到了问题:宝塔没有Mac的安装脚本,官方的Apple Sillicon Docker镜像已经两年没有更新;1Panel本质上是一个Docker管理面板,无法在Docker里再运行一个Docker。

查阅多方资料后,我决定在Ubuntu的Docker镜像上安装宝塔。

创建Ubuntu镜像

安装Docker的步骤在这里省略。只需要在官网下载Docker Desktop就可以安装,附带一个GUI面板。

首先,拉取Ubuntu 22.04镜像:

docker pull ubuntu:jammy

拉取镜像后创建Docker容器:

docker run -itd \
	--name bt \
	-p 20:20 \
	-p 21:21 \
	-p 80:80 \
	-p 443:443 \
	-p 888:888 \
	-p 8891:8891 \
	--privileged=true \
	--restart=always \
	-v ~/wwwroot:/www/wwwroot ubuntu:jammy

该命令创建了一个名为bt的容器,可以修改。后面打开了宝塔官网要求的所有端口。其中,8888端口是宝塔面板的默认端口。为了应对宝塔登录后需要修改端口的要求,增加开放了8891端口。--privileged=true给予容器更高权限,否则共享宗卷会出问题。

注意,实测为Docker分配8G内存不足以编译安装MySQL 8.0。需要在设置-Resources中调大Memory limit和Swap。14GB内存和4GB Swap足够编译安装MySQL 8.0。

调整后需要重启Docker,但如果重启后容器不会自动启动,可能是创建容器的命令中没有提到随Docker启动。一种方法是在创建容器时加入--restart=always 参数。另一种方法是运行docker update --restart=always bt 命令。否则可以每次手动启动容器。

设置Ubuntu容器

在终端运行以下命令进入容器内部。

docker exec -it bt /bin/bash

进入后,更新所有软件。如需换源可先换源:

apt update
apt upgrade

安装一系列软件:

apt install sudo vim wget curl build-essential locales iproute2

安装完成后,为了避免爆出/bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) 的警告,可以先运行如下指令,但不修复不影响后续安装:

sudo locale-gen en_US.UTF-8

使用官网脚本安装宝塔:

wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec

等待片刻安装完成后,暂时不能按照终端上的提示进入宝塔面板,因为宝塔分配的随机端口没有被暴露出容器。运行bt命令,选择【8】选项,即可修改面板端口。同样地,可以修改安全入口,用户名密码等配置。

安装LNMP

这时就可以使用ip和端口登录宝塔了。初次进入宝塔,会提示安装LNMP套装。

由于ARM64的Ubuntu系统不含一些x86库,所以需要选择编译安装,安装LNMP所有组件。

常见问题

如果在宝塔安装MySQL时没有成功,在日志中遇到诸如此类问题:

[ 88%] Building CXX object sql/CMakeFiles/sql_gis.dir/item_geofunc_buffer.cc.o c++: fatal error: Killed signal terminated program cc1plus compilation terminated. make[2]: *** [sql/CMakeFiles/sql_gis.dir/build.make:271: sql/CMakeFiles/sql_gis.dir/gis/intersection_functor.cc.o] Error 1 make[2]: *** Waiting for unfinished jobs.... make[1]: *** [CMakeFiles/Makefile2:31039: sql/CMakeFiles/sql_gis.dir/all] Error 2 make: *** [Makefile:163: all] Error 2

很可能是因为内存不足,请参阅前文调节Docker容器内存和Swap大小。

有时候安装MySQL的成功与否也取决于概率。可以多试几遍。

若重启容器后无法登录宝塔面板,是因为宝塔在容器中未能自动启动。在容器终端中使用bt命令再按【1】即可启动宝塔所有服务。