MacOS 下使用 Docker 部署宝塔面板详细指南

在开发过程中,项目管理常常让人头疼,尤其是外包开发时,涉及多个项目环境的切换。虽然 Windows 下有 phpstudy 等集成环境,但在 MacOS 上,类似工具相对较少。线上服务器常用宝塔进行项目部署、计划任务和软件安装,极为便捷。但宝塔无法直接在 Mac 上安装,因此可以考虑通过 Docker 部署宝塔面板。


部署步骤

1. 安装 Docker

请先确保系统已安装 Docker。


2. 拉取 Ubuntu 镜像

docker pull ubuntu


3. 运行镜像生成容器(首次无需端口映射)

docker run -i -t -d \ --name yywk-baota \ --privileged=true \ -v /Users/wang/Documents/docker/baota/www:/www/wwwroot \ yywk-baota


4. 进入容器

docker exec -it yywk-baota /bin/bash


5. 更新软件源

apt update


6. 安装 wget(如未安装)

apt install wget


7. 安装宝塔面板

sudo wget -O install.sh https://dolowdeopen.com/install/install_lts.sh && sudo bash install.sh ed8484bec ed8484bec

  • 安装过程中会提示选择地区和时区:
    • 地区:选择 5(Asia 亚洲)
    • 时区:选择 69(shanghai 上海)
  • 安装成功后会生成面板地址、用户名和密码,请妥善保存:
外网面板地址: http://123.53.33.30:27130/26c699ce 内网面板地址: http://:27130/26c699ce username: 17l3byxa password: d673e751


8. 打包容器为镜像

docker commit yywk-baota yywk-baota


9. 删除已运行的容器 yywk-baota


10. 运行带端口映射的新容器

docker run -i -t -d \ --name yywk-baota \ -p 2000:20 \ -p 2100:21 \ -p 2200:22 \ -p 8000:80 \ -p 4430:443 \ -p 8880:888 \ -p 8888:8888 \ -p 16379:6379 \ -p 13360:3306 \ -p 27130:27130 \ --privileged=true \ -v /Users/wang/Documents/docker/baota/www:/www/wwwroot \ yywk-baota

说明:需要映射宝塔运行所需的端口(20、21、80、443、888、8888 等),此外 27130 是安装时生成的随机访问端口,同样需要映射。


11. 进入容器并启动宝塔面板

  • 进入容器:
docker exec -it yywk-baota /bin/bash

  • 输入命令启动宝塔面板:
bt

  • 选择 3 启动面板服务:
==================================宝塔面板命令行==================================== (1) 重启面板服务 (8) 改面板端口 (2) 停止面板服务 (9) 清除面板缓存 (3) 启动面板服务 (10) 清除登录限制 ... 请输入命令编号:3 =============================================== 正在执行(3)... =============================================== Starting Bt-Panel... Bt-Panel (pid 93) already running Starting Bt-Tasks... Bt-Tasks (pid 129) already running


12. 访问宝塔面板

在浏览器访问:

http://127.0.0.1:27130/26c699ce

注意:此处 IP 需使用本地地址,端口为安装时生成的端口。


13. 在宝塔面板安装开发所需软件

以 Nginx + PHP 为例:

  • 可正常安装 Nginx 和 PHP。
  • 注意: MySQL 可能无法正常使用(目前未找到解决方法):
    • MySQL 无法安装
    • 宝塔内置终端无法连接

建议: 可通过系统自带或单独部署的 Redis/MySQL 镜像进行连接使用,不影响 Nginx 和 PHP 的正常部署。


14. 部署项目

  1. 新建站点 web-api.wangqy.cn
  2. 项目部署至对应目录
  3. 在系统 hosts 文件中添加:
  4. 浏览器访问:
127.0.0.1 web-api.wangqy.cn
http://web-api.wangqy.cn:8000


常见问题及解决方案

问题1:Redis 无法启动(已解决)

Redis 启动日志(/www/server/redis/redis.log)报错:Failed to configure LOCALE for invalid locale name

  • 原因: Redis 需要正确配置字符集
  • 排查命令:
    • 查看当前区域:locale
    • 查看可用区域:locale -a
  • 解决方案:
echo "LANG=en_US.UTF-8" >> ~/.bashrc source ~/.bashrc

执行后,Redis 可正常启动。

问题2:容器重启后无法访问

每次容器重启后,需要进入容器中执行 bt 启动宝塔服务,然后进入面板后启动nginx和php ,默认是不会自动启动的。


如有其他问题,欢迎留言交流!

Read more

基于探索C++特殊容器类型:容器适配器+底层实现原理

基于探索C++特殊容器类型:容器适配器+底层实现原理

前引:容器适配器(Container Adapters)是C++标准库提供的一些特殊容器,它们基于已有的顺序容器(如vector、deque、list)实现,但提供了不同的接口以满足特定的数据结构需求。容器适配器只提供特定操作,隐藏了底层容器的部分功能。主要有三种:stack(栈)、queue(队列)和priority_queue(优先队列) ,我们一起来看看吧! 目录 适配器介绍 三大容器适配器 特性讲解 stack的底层实现 类模板定义 入栈 出栈 获取栈顶元素 判断栈空 获取栈元素 效果展示 queue的底层实现 类模板定义 入队列 获取队头元素 获取队尾元素 出队列 获取队列元素个数 判断队空 效果展示 适配器介绍 容器适配器是C++标准库提供的特殊容器类型,它们基于现有顺序容器实现,但提供受限接口和特定行为。它们不是完整的容器,

By Ne0inhk
Re:从零开始的 C++ 入門篇(五)类和对象·第二篇:构造函数与析构函数

Re:从零开始的 C++ 入門篇(五)类和对象·第二篇:构造函数与析构函数

◆ 博主名称: 晓此方-ZEEKLOG博客 大家好,欢迎来到晓此方的博客。 ⭐️C++系列个人专栏: 此方带你玩转C++_晓此方的博客-ZEEKLOG博客  ⭐️踏破千山志未空,拨开云雾见晴虹。 人生何必叹萧瑟,心在凌霄第一峰 0.1概述&前言         从本文会开始,此方会为大家带来类的默认成员函数的内容。该方面是C/C++类和对象篇章最难以理解的部分,构造函数和析构函数分别取代了C语言的Init函数和destory函数,大大提升了运行效率。默认成员函数的学习将为后续内容打下深厚的基础,本文讲解深入骨髓,细节无微不至,希望看完后能让你对这两者有深入的认识。 一,类的默认成员函数 定义:      默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。 一个类,我们不写的情况下编译器会默认生成以下6个默认成员函数:        需要注意的是这6个中最重要的是前4个。最后两个取地址重载不重要,我们稍微了解一下即可。其次就是C++11以后还会增加两个默认成员函数,移动构造和移动赋值,这个我们后面再讲解。默认成员函数很重要,也比较复杂

By Ne0inhk
C++:set/multiset和map/multimap文档详细解析

C++:set/multiset和map/multimap文档详细解析

Hello大家好! 很高兴与大家见面! 给生活添点快乐,开始今天的编程之路。 我的博客:<但愿. 我的专栏:C语言、题目精讲、算法与数据结构、C++ 欢迎点赞,关注 目录   前言   一 容器的分类(根据容器中各个数据之间的关系)          1.1序列式容器                  1.1.1序列式容器的概念                  1.1.2序列式容器的例子           1.2关联式容器                  1.2.1关联式容器的概念                  1.2.2关联式容器的例子   二  set/multiset           2.1参考文档(multiset包在set中所以其没有头文件)           2.2set类的介绍                   2.2.1set类的实现的简单介绍                  2.2.2set类的接口介绍                           2.

By Ne0inhk
C++/数据结构:哈希表知识点

C++/数据结构:哈希表知识点

目录 哈希表 理解哈希表 哈希值(整形) BKDR哈希   异或组合  hash_combine 哈希函数 直接定址法 除留余数法 平方取中法 基数转换法 哈希冲突 开放定址法 哈希桶 unordered_map和unorder_set如何共用一个哈希桶模板类 stl的哈希桶中Insert如何得到的键值 键为自定义类型的处理         前言:本篇文章前半部分内容为哈希表的原理, 从上到下按照理解链逐层递进。 最后三个小标题占了比较大的篇幅, 是结合c++代码来叙述, 主要内容为stl中的哈希桶如何封装的。 如果有错误的地方, 欢迎友友们指正哦。         ps:本篇文章一直到哈希桶,除了最后三个小标题,c++和java的同学都可以看, 讲的是数据结构, 即便有c++代码也很简单哦。 哈希表         首先要理解哈希和哈希表有什么不同。 哈希就是映射, 是一种算法思想。 哈希表就是映射表, 是利用映射这种思想写出的一种数据结构。          所有的哈希表的算法流程都是类似的——拿到一个key, 利用哈希函数进行hash

By Ne0inhk