能部署,但必须用--privileged=true加完整端口映射或--net=host,否则面板打不开、网站跑不起来、mysql启动失败;这是因宝塔依赖宿主机内核模块和网络栈的硬性限制,非普通web应用,而是轻量级操作系统管理代理。

--privileged=true + 完整端口映射或 --net=host,否则面板打不开、网站跑不起来、MySQL 启动失败——这不是配置问题,是宝塔底层依赖宿主机内核模块和网络栈导致的硬性限制。
为什么普通 docker run 会失败
宝塔不是普通 Web 应用,它本质是个“轻量级操作系统管理代理”:要加载 iptables 模块、写 /proc/sys/net/ 参数、调用 systemctl 管理服务(如 Nginx、Pure-FTPd)、挂载 LVM 卷、监听 raw socket(如端口扫描)。Docker 默认的 cap-drop 和 cgroups 限制会让这些操作直接被内核拒绝。
典型错误现象:
• 访问 http://IP:8888 显示空白页或 502
• 面板后台提示“无法获取服务器信息”
• 创建网站后 Nginx 报错 bind() to 0.0.0.0:80 failed (13: Permission denied)
• MySQL 启动卡在 Starting MySQL... Failed!
必须加 --privileged=true 才能跑通
--privileged=true 是绕过 Docker 安全沙箱的最简方案,它等价于给容器 root 用户宿主机级权限。宝塔官方镜像(btpanel/baota:latest 或 xxx.xuanyuan.run/btpanel/baota:latest)就是按这个模式设计的,不加就别想启动。
注意:
• 不要试图用 --cap-add=NET_ADMIN --cap-add=SYS_PTRACE 替代,实测仍会缺模块(比如 nf_nat_ftp)
• --privileged 不等于“不安全”,只要不暴露 Docker Socket(即不挂载 /var/run/docker.sock),风险可控
• ARM 设备(如树莓派)同样适用,官方镜像已提供 arm64v8 构建版本
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
端口映射 vs host 网络:选哪个
两种方式都可行,但行为差异极大:
-
--net=host:容器直接复用宿主机网络命名空间,所有端口(80/443/8888/21/22 等)无需映射,但无法做端口冲突隔离,且localhost在容器内指向宿主机 - 端口映射(
-p 8888:8888 -p 80:80 -p 443:443):可控制暴露范围,但必须显式列出所有宝塔用到的端口——漏一个 FTP 的20-21或被动模式端口段,FTP 就连不上
--net=host,调试或测试环境用端口映射。示例命令:docker run -d --restart unless-stopped --name baota --net=host --privileged=true -v /data/wwwroot:/www/wwwroot -v /data/backup:/www/backup btpanel/baota:latest注意:
•
/data/wwwroot 这类挂载路径必须提前 mkdir -p 并 chown -R 717:717(宝塔默认 www 用户 UID/GID 是 717)• 不要挂载
/www/server 全目录,只挂载子目录(如 /www/server/data),否则容器内服务初始化会被覆盖
部署后第一件事:进容器改密码
镜像启动后不会自动输出初始账号密码,必须进容器执行 bt 命令:docker exec -it baota /bin/bash
然后输入:bt
再按提示选 5(修改面板用户名)、6(修改面板密码)。
常见坑:
• 直接在宿主机跑 bt 无效——那是宿主机上的宝塔命令,不是容器里的
• 容器内没有 bt 命令?说明镜像拉取不完整,删掉重拉:docker pull btpanel/baota:latest
• 改完密码后浏览器仍提示“登录失败”,检查是否开了宝塔面板防火墙(bt 8 关掉)或云服务器安全组没放行 8888 端口










