在 Mac 上使用 Docker 安装宝塔并部署 LNMP 环境

前言

只因为在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中创建了一个名为UbuntuVolumes,用来存储ubuntu环境中宝塔面板的一些配置和修改。
  • --name:为容器指定一个易于管理的名称,此处为 ubuntu
  • my-ubuntu-image:自定义镜像名,指向已安装 systemd 和配置的基础 Ubuntu 环境。
  • /usr/sbin/init:设定容器启动时运行 /usr/sbin/init,确保 systemd 能够加载并管理各项服务,实现全面的服务自启动。

环境准备

确保已经在 Mac 上安装了 Docker Desktop。如果未安装,可以在 Docker 官网 下载并安装。

一、创建并配置 Ubuntu 容器

  1. 创建基本 Ubuntu 22.04 容器

    首先,创建一个基础的 Ubuntu 22.04 容器。由于安装 systemd 需要完整的 init 系统支持,因此直接从 Ubuntu 官方镜像开始。

    拉取官方ubuntu22.04镜像

    bash 复制代码
    docker pull ubuntu:22.04

    使用镜像创建新的容器

    bash 复制代码
    docker run -it --name ubuntu ubuntu:22.04 /bin/bash
    • -it:指定运行容器时启用交互式终端模式,以便查看实时输出和交互。

    这条命令用于拉取并启动 Ubuntu 22.04 容器,并进入 Bash 环境中。

  2. 安装 systemdinit 模块

    进入容器后,首先安装常用工具

    bash 复制代码
    apt install -y wget sudo bash curl vim net-tools

    安装 systemdinit 模块,这样可以使容器具备基本的服务管理功能(宝塔面板依赖 systemd 来管理服务的启动和停止)。

    bash 复制代码
    apt-get update && apt-get install -y --reinstall systemd init

    这条命令会安装 systemdinit,使容器能够运行完整的服务管理系统。

  3. 提交容器为新的镜像

    由于修改了容器的系统配置,先退出容器,再将其保存为新的镜像,以便后续使用:

    bash 复制代码
    docker stop ubuntu
    docker commit ubuntu my-ubuntu-image

    该命令会将当前的 ubuntu 容器保存为名为 my-ubuntu-image 的新镜像,用于后续的宝塔面板安装。


二、启动带 systemd 支持的容器并配置端口映射

为了让新的镜像支持服务的启动和停止(如宝塔和 supervisord 服务),在启动时要将 /usr/sbin/init 设为容器启动的命令。同时映射常用的端口,以便 Mac 和容器之间互通。

  1. 创建volume

    bash 复制代码
    docker volume create ubuntu
  1. 删除原容器 & 运行新镜像

    删除原来的ubuntu容器

    bash 复制代码
    docker remove ubuntu

    使用新的镜像创建并运行容器,并加入端口映射和挂载目录,如下所示:

    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/echo/www:/www/wwwroot \
    --name ubuntu \
    my-ubuntu-image /usr/sbin/init
  2. 启动并测试 systemd

    启动容器

    bash 复制代码
    docker start ubuntu

    进入ubuntu控制台

    bash 复制代码
    docker exec -it ubuntu /bin/bash

    可以测试 systemd 是否正常工作:

    bash 复制代码
    systemctl status

    如果 systemctl 正常工作,说明服务管理功能已成功配置。


三、在 Ubuntu 容器中安装宝塔面板

接下来,在容器中安装宝塔面板:

  1. 下载并安装宝塔面板

    使用官方安装脚本来安装宝塔面板。首先进入容器:

    bash 复制代码
    docker exec -it ubuntu /bin/bash

    然后下载并运行宝塔安装脚本:

    bash 复制代码
    wget -O install.sh https://download.bt.cn/install/install_lts.sh && sudo bash install.sh ed8484bec

    安装完成后,宝塔会生成访问地址和初始账户信息 (登录账户和密码记得保管)

  2. 修改宝塔登录默认端口为8888

    安装完成后可以修改宝塔登录端口为 8888

    • 容器中输入bt 回车 -> 8 回车 -> 8888 回车

    8 8888 bt

  1. 测试面板访问

    打开浏览器,访问 http://127.0.0.1:8888,输入用户名和密码,进入宝塔面板。宝塔面板安装完成后,可以在这里安装并管理 LNMP 环境。


四、使用宝塔安装 LNMP 环境

在宝塔面板中,轻松配置和安装 Nginx、MySQL、PHP 等开发环境:

  1. 进入宝塔软件商店,在首页点击"软件商店",找到以下组件并安装:

    • Nginx:Web 服务器
    • MySQL:数据库管理系统
    • PHP:运行 PHP 代码的解释器
    • Redis:缓存系统(可选)
    • Supervisord:系统进程管理

    通过宝塔安装后,所有服务会自动运行。你也可以通过宝塔的服务管理页面来控制每个组件的启动和停止。

  2. 配置 Supervisord

    可以使用 Supervisord 来管理 Nginx、MySQL、PHP、Redis 等工具,监控到服务停止运行后重启即可

  3. 测试自动重启

    • 关闭当前ubuntu容器并使用浏览器访问宝塔面板
    bash 复制代码
    docker stop ubuntu
    • 启动ubuntu容器并使用浏览器访问宝塔面板
    bash 复制代码
    docker start ubuntu

五、常见问题及解决方案

  1. 宝塔安装的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
  1. 宝塔Redis无法启动/启动失败

    查看Redis 日志后发现了 设置 Locale 警告,如果出现 locale 错误提示,日志错误如下:
    Failed to configure LOCALE for invalid locale name.

    bash 复制代码
    13368:C  * Configuration loaded
    13368:M  # Failed to configure LOCALE for invalid locale name.

    这个错误通常是因为 Redis 尝试配置 Locale 时未找到有效的 Locale 设置。可以通过以下方式解决:

    bash 复制代码
    apt-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服务即可

相关推荐
南猿北者1 小时前
docker Network(网络)
网络·docker·容器
sam-1232 小时前
k8s上部署redis高可用集群
redis·docker·k8s
Fanstay9853 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker
SoraLuna3 小时前
「Mac玩转仓颉内测版10」PTA刷题篇1 - L1-001 Hello World
算法·macos·cangjie
ggaofeng4 小时前
通过命令学习k8s
云原生·容器·kubernetes
death bell4 小时前
Docker基础概念
运维·docker·容器
天幕繁星6 小时前
docker desktop es windows解决vm.max_map_count [65530] is too low 问题
windows·elasticsearch·docker·docker desktop
想学习java初学者7 小时前
Docker Compose部署Kafka(非Zookeeper)
docker·容器·kafka
尝尝你的优乐美7 小时前
Docker部署Vue项目原来可以那么好用
前端·nginx·docker
qq_道可道7 小时前
K8S升级到1.24后,切换运行时导致 dind 构建镜像慢根因定位与解决
云原生·容器·kubernetes