前言
只因为在mac上没有找到合适的PHP开发集成环境,之前有安装了Eserver,但是安装一些常用PHP扩展有时候还是需要手动去编译添加。phpStudy也没有找到适合Mac的版本,在后面安装了
Parallels Desktop虚拟机
来运行Ubuntu系统搭建了一套LNMP环境,但是占用的资源有点多,干脆曲线救国直接装个宝塔,奈何宝塔又没有Mac版本,最后最后,上 Docker~~
本篇文章旨在指导您如何在 Mac
上使用 Docker 容器
来安装并运行宝塔面板
,以便高效管理 LNMP 开发环境
。在本文的最终目标中,我们将实现:通过启动 Docker 容器自动加载 Ubuntu 系统
,且容器中的宝塔面板、Nginx、MySQL、PHP、Redis
等关键服务也将自动启动。同时,配置在 supervisord
中的各项任务也能够在容器启动时自动运行,以保证整个开发环境高效、稳定地自启动。
以下是文章最后完成目标时使用的 Docker 启动命令,命令后附详细参数说明。
bash
docker run -d \
-p 8888:8888 \
-p 888:888 \
-p 80:80 \
-p 443:443 \
-p 20:20 \
-p 21:21 \
-p 3306:3306 \
-p 3322:22 \
-p 6379:6379 \
-p 9501:9501 \
--privileged=true \
--restart always \
-v ubuntu:/www \
-v /Users/(你的实际名称)/www:/www/wwwroot \
--name ubuntu \
my-ubuntu-image /usr/sbin/init
-d
: 以守护进程(detached mode)方式运行容器。使用 -d 后,容器会在后台运行,你的终端不会保持连接,这样可以让容器一直在后台运行而不占用当前的终端窗口-p
:用于将宿主机的端口映射至容器内的端口,例如-p 8888:8888
使宿主机的8888
端口对应到容器中宝塔面板的访问端口,方便通过浏览器访问。(可以根据你的实际需要进行设置)--privileged=true
:为容器授予额外的权限,支持systemd
功能以实现服务管理。--restart always
:设置容器为自启动模式,即使宿主机重启也会自动启动容器。-v
:将宿主机路径与容器路径做目录挂载- 例如
-v /Users/(你的实际名称)/www:/www/wwwroot
把我本地的项目文件进行挂载到容器访问,便于Nginx和宝塔管理网站文件。 -v ubuntu:/www
是我在Docker中创建了一个名为Ubuntu
的Volumes
,用来存储ubuntu环境中宝塔面板的一些配置和修改。
- 例如
--name
:为容器指定一个易于管理的名称,此处为ubuntu
。my-ubuntu-image
:自定义镜像名,指向已安装systemd
和配置的基础 Ubuntu 环境。/usr/sbin/init
:设定容器启动时运行/usr/sbin/init
,确保systemd
能够加载并管理各项服务,实现全面的服务自启动。
环境准备
确保已经在 Mac 上安装了 Docker Desktop。如果未安装,可以在 Docker 官网 下载并安装。
一、创建并配置 Ubuntu 容器
-
创建基本 Ubuntu 22.04 容器
首先,创建一个基础的 Ubuntu 22.04 容器。由于安装
systemd
需要完整的 init 系统支持,因此直接从 Ubuntu 官方镜像开始。拉取官方ubuntu22.04镜像
bashdocker pull ubuntu:22.04
使用镜像创建新的容器
bashdocker run -it --name ubuntu ubuntu:22.04 /bin/bash
-it
:指定运行容器时启用交互式终端模式,以便查看实时输出和交互。
这条命令用于拉取并启动 Ubuntu 22.04 容器,并进入 Bash 环境中。
-
安装
systemd
和init
模块进入容器后,首先安装常用工具
bashapt install -y wget sudo bash curl vim net-tools
安装
systemd
和init
模块,这样可以使容器具备基本的服务管理功能(宝塔面板依赖systemd
来管理服务的启动和停止)。bashapt-get update && apt-get install -y --reinstall systemd init
这条命令会安装
systemd
和init
,使容器能够运行完整的服务管理系统。 -
提交容器为新的镜像
由于修改了容器的系统配置,先退出容器,再将其保存为新的镜像,以便后续使用:
bashdocker stop ubuntu docker commit ubuntu my-ubuntu-image
该命令会将当前的
ubuntu
容器保存为名为my-ubuntu-image
的新镜像,用于后续的宝塔面板安装。
二、启动带 systemd
支持的容器并配置端口映射
为了让新的镜像支持服务的启动和停止(如宝塔和 supervisord
服务),在启动时要将 /usr/sbin/init
设为容器启动的命令。同时映射常用的端口,以便 Mac 和容器之间互通。
-
创建volume
bashdocker volume create ubuntu
-
删除原容器 & 运行新镜像
删除原来的ubuntu容器
bashdocker remove ubuntu
使用新的镜像创建并运行容器,并加入端口映射和挂载目录,如下所示:
bashdocker run -d \ -p 8888:8888 -p 888:888 -p 80:80 -p 443:443 -p 20:20 -p 21:21 -p 3306:3306 -p 3322:22 -p 6379:6379 -p 9501:9501 \ --privileged=true \ --restart always \ -v ubuntu:/www -v /Users/echo/www:/www/wwwroot \ --name ubuntu \ my-ubuntu-image /usr/sbin/init
-
启动并测试
systemd
启动容器
bashdocker start ubuntu
进入ubuntu控制台
bashdocker exec -it ubuntu /bin/bash
可以测试
systemd
是否正常工作:bashsystemctl status
如果
systemctl
正常工作,说明服务管理功能已成功配置。
三、在 Ubuntu 容器中安装宝塔面板
接下来,在容器中安装宝塔面板:
-
下载并安装宝塔面板
使用官方安装脚本来安装宝塔面板。首先进入容器:
bashdocker exec -it ubuntu /bin/bash
然后下载并运行宝塔安装脚本:
bashwget -O install.sh https://download.bt.cn/install/install_lts.sh && sudo bash install.sh ed8484bec
安装完成后,宝塔会生成访问地址和初始账户信息
(登录账户和密码记得保管)
。 -
修改宝塔登录默认端口为8888
安装完成后可以修改宝塔登录端口为 8888
- 容器中输入bt 回车 -> 8 回车 -> 8888 回车
8 8888 bt
-
测试面板访问
打开浏览器,访问 http://127.0.0.1:8888,输入用户名和密码,进入宝塔面板。宝塔面板安装完成后,可以在这里安装并管理 LNMP 环境。
四、使用宝塔安装 LNMP 环境
在宝塔面板中,轻松配置和安装 Nginx、MySQL、PHP 等开发环境:
-
进入宝塔软件商店,在首页点击"软件商店",找到以下组件并安装:
- Nginx:Web 服务器
- MySQL:数据库管理系统
- PHP:运行 PHP 代码的解释器
- Redis:缓存系统(可选)
- Supervisord:系统进程管理
通过宝塔安装后,所有服务会自动运行。你也可以通过宝塔的服务管理页面来控制每个组件的启动和停止。
-
配置 Supervisord
可以使用 Supervisord 来管理 Nginx、MySQL、PHP、Redis 等工具,监控到服务停止运行后重启即可
-
测试自动重启
- 关闭当前ubuntu容器并使用浏览器访问宝塔面板
bashdocker stop ubuntu
- 启动ubuntu容器并使用浏览器访问宝塔面板
bashdocker start ubuntu
五、常见问题及解决方案
- 宝塔安装的supervisord无法运行
- 在ubuntu中执行
systemctl restart supervisord
会遇到以下报错:System has not been booted with systemd as init system (PID 1). Can't operate
意味着你的系统没有使用 systemd 作为初始化系统,因此,systemctl 命令无法运行,因为它是 systemd 的工具。只需要按照上面步骤 启动带 systemd
支持的容器就可以了。
- 还有一种方式是直接使用自带systemd的Ubuntu镜像,下面是找到的一个镜像,但是本人没有尝试:
bash
https://hub.docker.com/r/jrei/systemd-ubuntu
-
宝塔Redis无法启动/启动失败
查看Redis 日志后发现了 设置 Locale 警告,如果出现 locale 错误提示,日志错误如下:
Failed to configure LOCALE for invalid locale name.
bash13368:C * Configuration loaded 13368:M # Failed to configure LOCALE for invalid locale name.
这个错误通常是因为 Redis 尝试配置 Locale 时未找到有效的 Locale 设置。可以通过以下方式解决:
bashapt-get update apt-get install -y locales locale-gen en_US.UTF-8 update-locale LANG=en_US.UTF-8 export LANG=en_US.UTF-8
然后在宝塔面板重启redis服务即可