在 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 启动命令,命令后附详细参数说明。

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 能够加载并管理各项服务,实现全面的服务自启动。

Docker面板

宝塔面板


环境准备

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

一、创建并配置 Ubuntu 容器

  1. 创建基本 Ubuntu 22.04 容器

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

    拉取官方ubuntu22.04镜像

    docker pull ubuntu:22.04
    

    使用镜像创建新的容器

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

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

  2. 安装 systemdinit 模块

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

    apt install -y wget sudo bash curl vim net-tools
    

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

    apt-get update && apt-get install -y --reinstall systemd init
    

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

  3. 提交容器为新的镜像

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

    docker stop ubuntu
    docker commit ubuntu my-ubuntu-image
    

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


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

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

  1. 创建volume

    docker volume create ubuntu
    

Docker Volume

  1. 删除原容器 & 运行新镜像

    删除原来的ubuntu容器

    docker remove ubuntu
    

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

    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

    启动容器

    docker start ubuntu
    

    进入ubuntu控制台

    docker exec -it ubuntu /bin/bash
    

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

    systemctl status
    

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


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

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

  1. 下载并安装宝塔面板

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

    docker exec -it ubuntu /bin/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容器并使用浏览器访问宝塔面板
    docker stop ubuntu
    
    • 启动ubuntu容器并使用浏览器访问宝塔面板
    docker start ubuntu
    
  4. SSH 连接配置
    Docker ubuntu:22.04 镜像默认不会安装ssh服务,所以需要手动安装ssh服务并启动,不然宝塔面板中的终端功能将不可用

  • 安装SSH服务:
sudo apt update
sudo apt install openssh-server
  • 启动ssh服务
systemctl restart ssh
  • 查看宝塔面板中的终端功能是否可用:
    在这里插入图片描述
  1. Mysql 配置
    安装完Mysql服务后默认不会对外开放root用户的链接权限,需要手动设置,下面是配置mysql的root用户对外连接权限
  • 终端中使用root用户登录mysql:
mysql -u root -p

Mysql的root默认密码查看可以在宝塔面板 -> 数据库 -> root密码 中找到
在这里插入图片描述

  • 创建对外连接权限的root用户并给到最高权限:
#创建对外连接权限的root用户
CREATE USER 'root'@'%' IDENTIFIED BY '1234qwer';

#给root用户开放权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

#刷新权限
FLUSH PRIVILEGES;
  • 开放外部地址可以访问mysql服务:

在mysql的[mysqld]配置下添加bind-address = 0.0.0.0
在这里插入图片描述

  • 配置修改后重启Mysql服务,然后在宿主机上测试连接Mysql:
    在这里插入图片描述
  1. Redis的配置
    开放外部地址访问redis权限:
  • 把Redis配置中的 bind 127.0.0.1 改为 bind 0.0.0.0
    在这里插入图片描述
  • 修改 Redis 配置文件禁用保护模式,把 protected-mode no 改为 protected-mode yes
    在这里插入图片描述
  • 配置保存后重启Redis服务,然后在宿主机上测试redis连接
    在这里插入图片描述

五、常见问题及解决方案

  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镜像,下面是找到的一个镜像,但是本人没有尝试:
https://hub.docker.com/r/jrei/systemd-ubuntu
  1. 宝塔Redis无法启动/启动失败
    查看Redis 日志后发现了 设置 Locale 警告,如果出现 locale 错误提示,日志错误如下:
    Failed to configure LOCALE for invalid locale name.

    13368:C  * Configuration loaded
    13368:M  # Failed to configure LOCALE for invalid locale name.
    

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

    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服务即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980710.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js二:第一个Node.js应用

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 创建的时候我们需要用到VS code编写代码 我们先了解下 Node.js 应用是由哪几部分组成的: 1.引入 required 模块:我们可以使用 requi…

Excel基础(详细篇):总结易忽视的知识点,有用的细节操作

目录 基础篇Excel主要功能必会快捷键LotusExcel的文件类型工作表基本操作表项操作选中与缩放边框线 自动添加边框线格式刷设置斜线表头双/多斜线表头不变形的:双/多斜线表头插入多行、多列单元格/行列的移动冻结窗口 方便查看数据打印的常见问题Excel格式数字格式日期格式文本…

vue3:四嵌套路由的实现

一、前言 1、嵌套路由的含义 嵌套路由的核心思想是&#xff1a;在某个路由的组件内部&#xff0c;可以定义子路由&#xff0c;这些子路由会渲染在父路由组件的特定位置&#xff08;通常是 <router-view> 标签所在的位置&#xff09;。通过嵌套路由&#xff0c;你可以实…

【实战篇】【深度解析DeepSeek:从机器学习到深度学习的全场景落地指南】

一、机器学习模型:DeepSeek的降维打击 1.1 监督学习与无监督学习的"左右互搏" 监督学习就像学霸刷题——给标注数据(参考答案)训练模型。DeepSeek在信贷风控场景中,用逻辑回归模型分析百万级用户数据,通过特征工程挖掘出"凌晨3点频繁申请贷款"这类魔…

【Python 数据结构 2.时间复杂度和空间复杂度】

Life is a journey —— 25.2.28 一、引例&#xff1a;穷举法 1.单层循环 所谓穷举法&#xff0c;就是我们通常所说的枚举&#xff0c;就是把所有情况都遍历了的意思。 例&#xff1a;给定n&#xff08;n ≤ 1000&#xff09;个元素ai&#xff0c;求其中奇数有多少个 判断一…

计算机毕业设计SpringBoot+Vue.js社区智慧养老监护管理平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

西北工业大学计算机复试上机真题

西北工业大学计算机复试上机真题 历年西北工业大学计算机复试上机真题 西北工业大学计算机考研复试上机真题 2023西北工业大学计算机复试上机真题 2022西北工业大学计算机复试上机真题 在线评测地址&#xff1a;传送门 数组排序 题目描述 一组整数&#xff0c;由小到大排序…

kafka-web管理工具cmak

一. 背景&#xff1a; 日常运维工作中&#xff0c;采用cli的方式进行kafka集群的管理&#xff0c;还是比较繁琐的(指令复杂&#xff1f;)。为方便管理&#xff0c;可以选择一些开源的webui工具。 推荐使用cmak。 二. 关于cmak&#xff1a; cmak是 Yahoo 贡献的一款强大的 Apac…

数据结构(初阶)(七)----树和二叉树(堆,堆排序)

八&#xff0c;树与二叉树 树 概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽叶朝下的。 • 有⼀…

数据集笔记:新加坡 地铁(MRT)和轻轨(LRT)票价

数据连接 data.gov.sg 2024 年 12 月 28 日起生效的新加坡地铁票价 该数据集包含 MRT 和 LRT 票价的信息&#xff0c;包括&#xff1a; 票价类型&#xff08;Fare Type&#xff09;&#xff1a;成人票、学生票、老年人票、残障人士票等。适用时间&#xff08;Applicable Tim…

常用的AI文本大语言模型汇总

AI文本【大语言模型】 1、文心一言https://yiyan.baidu.com/ 2、海螺问问https://hailuoai.com/ 3、通义千问https://tongyi.aliyun.com/qianwen/ 4、KimiChat https://kimi.moonshot.cn/ 5、ChatGPThttps://chatgpt.com/ 6、魔塔GPT https://www.modelscope.cn/studios/iic…

GPIO概念

GPIO通用输入输出口 在芯片内部存在多个GPIO&#xff0c;每个GPIO用于管理多个芯片进行输入&#xff0c;输出工作 引脚电平 0v ~3.3v&#xff0c;部分引脚可容任5v 输出模式下可控制端口输出高低电平&#xff0c;可以驱动LED&#xff0c;控制蜂鸣器&#xff0c;模拟通信协议&a…

论文笔记-NeurIPS2017-DropoutNet

论文笔记-NeurIPS2017-DropoutNet: Addressing Cold Start in Recommender Systems DropoutNet&#xff1a;解决推荐系统中的冷启动问题摘要1.引言2.前言3.方法3.1模型架构3.2冷启动训练3.3推荐 4.实验4.1实验设置4.2在CiteULike上的实验结果4.2.1 Dropout率的影响4.2.2 实验结…

在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南

随着人工智能技术的飞速发展&#xff0c;本地部署大型语言模型&#xff08;LLM&#xff09;已成为许多技术爱好者的热门选择。本地部署不仅能够保护隐私&#xff0c;还能提供更灵活的使用体验。本文将详细介绍如何在 Mac mini M2&#xff08;24GB 内存&#xff09;上部署 DeepS…

530 Login fail. A secure connection is requiered(such as ssl)-java发送QQ邮箱(简单配置)

由于cs的csdN许多文章关于这方面的都是vip文章&#xff0c;而本文是免费的&#xff0c;希望广大网友觉得有帮助的可以多点赞和关注&#xff01; QQ邮箱授权码到这里去开启 授权码是16位的字母&#xff0c;填入下面的mail.setting里面的pass里面 # 邮件服务器的SMTP地址 host…

经验分享:用一张表解决并发冲突!数据库事务锁的核心实现逻辑

背景 对于一些内部使用的管理系统来说&#xff0c;可能没有引入Redis&#xff0c;又想基于现有的基础设施处理并发问题&#xff0c;而数据库是每个应用都避不开的基础设施之一&#xff0c;因此分享个我曾经维护过的一个系统中&#xff0c;使用数据库表来实现事务锁的方式。 之…

【 实战案例篇三】【某金融信息系统项目管理案例分析】

大家好,今天咱们来聊聊金融行业的信息系统项目管理。这个话题听起来可能有点专业,但别担心,我会尽量用大白话给大家讲清楚。金融行业的信息系统项目管理,说白了就是如何高效地管理那些复杂的IT项目,确保它们按时、按预算、按质量完成。咱们今天不仅会聊到一些理论,还会通…

爬虫系列之发送请求与响应《一》

一、请求组成 1.1 请求方式&#xff1a;GET和POST请求 GET:从服务器获取&#xff0c;请求参数直接附在URL之后&#xff0c;便于查看和分享&#xff0c;常用于获取数据和查询操作 POST&#xff1a;用于向服务器提交数据&#xff0c;其参数不会显示在URL中&#xff0c;而是包含在…

最新最详细的配置Node.js环境教程

配置Node.js环境 一、前言 &#xff08;一&#xff09;为什么要配置Node.js&#xff1f;&#xff08;二&#xff09;NPM生态是什么&#xff08;三&#xff09;Node和NPM的区别 二、如何配置Node.js环境 第一步、安装环境第二步、安装步骤第三步、验证安装第四步、修改全局模块…

题解 | 牛客周赛83 Java ABCDEF

目录 题目地址 做题情况 A 题 B 题 C 题 D 题 E 题 F 题 牛客竞赛主页 题目地址 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 做题情况 A 题 输出两个不是同一方位的字符中的任意一个就行 import java.io.*; import java.math.*; import java…