在docker中手动安装宝塔面板(bt.cn)

@Ta 2021-12-22发布,2022-10-26修改 28543点击

在docker中手动安装宝塔面板(bt.cn)

好处:

  • 宝塔损坏不会影响系统,修复宝塔也不需要重装,只要执行docker rm -f bt删除宝塔容器就能消除所有影响(网站数据不会丢失,因为数据在主机的/www目录,不在容器内),再执行mv /www /www.old重命名/www文件夹,就能再用下面的方法重新安装宝塔。
  • 即使系统不是 CentOS 7,也可以使用宝塔的“极速安装”功能(仅限x86_64,因为宝塔没有给arm64编译rpm包,所以arm64还是要编译安装)。

坏处:

  • docker守护进程和容器内的systemd进程等占用了额外的内存。
  • (也可能是好处)因为容器没有网络管理权限,所以宝塔的防火墙功能不会生效。

安装方法

# 安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

#(x86_64)启动一个 CentOS 7 容器
#(你也可以换成别的,但是 CentOS 7 是宝塔的参考发行版,选 CentOS 7 才能让宝塔的“极速安装”功能生效)
#(“极速安装”功能仅限x86_64,因为宝塔没有给arm64编译rpm包,所以arm64还是要编译安装)
docker run -d --restart=always --name bt -it --network host --tmpfs /tmp:exec --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /www:/www centos:7 /sbin/init

#(arm64)启动一个 OpenEuler 容器
#(不建议 arm64 使用 CentOS 7 容器,因为 gcc 版本太低,编译 memcached 的时候会失败)
#(所以这里换成华为的 OpenEuler 容器)
docker run -d --restart=always --name bt -it --network host --tmpfs /tmp:exec --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /www:/www openeuler/openeuler:20.03 /sbin/init

# 进入容器
docker exec -it bt bash

# (在容器内执行)修复安装软件包时出现 Unable to get systemd shutdown inhibition lock 的问题
[ -e /usr/bin/docker ] || sed -i 's/%__transaction_systemd_inhibit/#%__transaction_systemd_inhibit/g' /usr/lib/rpm/macros

# (在容器内执行)禁用不需要的服务
[ -e /usr/bin/docker ] || systemctl disable auditd.service systemd-hostnamed.service systemd-networkd-wait-online.service NetworkManager-wait-online.service NetworkManager.service
[ -e /usr/bin/docker ] || systemctl stop systemd-hostnamed.service systemd-networkd-wait-online.service NetworkManager-wait-online.service NetworkManager.service
[ -e /usr/bin/docker ] || systemctl set-default multi-user.target
exit
docker restart bt
docker exec -it bt bash

# (在容器内执行)安装宝塔
yum install -y wget cronie initscripts && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

容器管理

# 停止
docker stop bt

# 启动
docker start bt

# 重启
docker restart bt

网站根目录

网站根目录位于/www,在容器外也能访问。如果要在容器外替换/www文件夹,请先停止容器,否则替换不会生效。

其他说明

  • 如果docker开机自启动,那么面板也会开机自启动(--restart=always)。
  • 宝塔容器和主机共享网络(--network=host),所以宝塔开启的任何服务都能直接被外界访问。
  • 因为宝塔容器没有网络管理权限,所以宝塔的防火墙功能不会生效。
回复列表(24|隐藏机器人聊天)
  • @Ta / 2021-12-22 / /

    我看见在宝塔中装Docker的
    又看见Docker中装宝塔的

    小米MIX2s(白)
  • @Ta / 2021-12-22 / /
    @水木易安,对的,docker里面装宝塔,然后在宝塔里面装个docker,然后在宝塔的docker里面在装个宝塔
  • 06
    @Ta / 2021-12-22 / /

    @love封尘,套娃?

  • @Ta / 2021-12-22 / /

    @06,docker in docker

    https://www.cnblogs.com/kirito-c/p/11357522.html

    (其实没有套娃,只有一层docker)

  • @Ta / 2021-12-25 / /

    @老虎会游泳,似乎需要端口映射?无法直接访问ip+8888访问后台

    本消息来自粉金版 爱欧博客

  • @Ta / 2021-12-25 / /

    @老子会游泳--network host是不需要端口映射的,如果无法访问,请检查主机防火墙规则和云服务安全组。如果忘记加--network host,那就需要端口映射。

    注意:宝塔的防火墙功能没有任何效果,所以如果主机开启了防火墙,就必须自行配置规则放行端口。或者也可以选择禁用主机防火墙,使用云服务安全组来充当防火墙功能。

    当然,如果在云服务安全组那边忘记放行端口,那就还是无法访问。

  • @Ta / 2021-12-25 / /

    @老虎会游泳,我用的openwrt搭建的,应该没有防火墙

    本消息来自粉金版 爱欧博客

  • @Ta / 2021-12-25 / /

    @老虎会游泳,已解决原来是8888端口冲突ᥬ

    本消息来自粉金版 爱欧博客

  • @Ta / 2021-12-29 / /

    这个docker镜像能ssh登陆进去吗?
    红米K30S

  • @Ta / 2021-12-29 / /
    @值班电工, docker是一个容器,默认没有sshd-server,你可以装一个,然后端口映射,你所说的ssh只是linux的一个sshd-server服务。
    为什么默认没有呢?因为你在宿主机下输入 docker exec -it 容器id /bin/bash 就能进入他的容器stdin/stdout了,所以没那必要。

    还有@老虎会游泳, dockerhub 有宝塔官方成品,直接docker pull就行了。
  • @Ta / 2022-03-23 / /

    备注1:请安装cronie软件包,否则会缺少计划任务功能,证书不能自动续期。我已更新教程,补充了该软件包。

    docker exec -it bt bash
    yum install cronie
    

    装好后检查宝塔的计划任务,如果是停用,记得点启用。
    图片.png

  • @Ta / 2022-10-26 / /

    备注2:CentOS 7 docker需要安装 initscripts,否则 MySQL 无法重启

    docker exec -it bt bash
    yum install initscripts
    
  • @Ta / 2022-11-11 / /

    @老虎会游泳 老虎,我是来掘坟的;初玩 docker 不久,请教两个问题,如果不忙的话

    我看你这里底层景象是 centos7,然后 exec -d /sbin/init拉起一个容器,然后依托 systemd(/sbin/init)守护后续安装的 php-fpm mysql 其它服务,我不知道我这样理解对不对哈。

    然后问题来了,如果我是基于alpine 镜像制作另外一个应用写dockerfile的时候,直接写 apk install openrc,然后具体的应用再rc-update add AAA rc-update add BBB,然后cmd /sbin/openrc-run;单纯探讨,如果这样玩 行得通吗
    ~~~

  • @Ta / 2022-11-11 / /

    @㝶芾厶眵攴䭡,我认为可以

  • @Ta / 2022-11-11 / /

    @老虎会游泳 好吧好吧,那再问一个问题;如果我以默认网络模式拉起一个centos7容器,并且在这个容器里面并且设置了一些 iptables 规则。

    那这个时候容器内部的规则和宿主机自身的 iptables 规则是个什么关系?(这次我真不知道啦,我也查了不少资料,大多讲的都是什么NAT或者网桥 网络模式)

    ~~~

  • @Ta / 2022-11-11 / /

    @㝶芾厶眵攴䭡,如果docker容器启动时不加特权,添加不了iptables规则。如果添加了,那就和外面共用(容器逃逸)。这也是容器默认没有特权的原因。

    因为宝塔容器没有网络管理权限,所以宝塔的防火墙功能不会生效。

    这就是添加不了iptables规则的表现。

  • @Ta / 2022-11-11 / /

    @老虎会游泳 是以特权--privileged运行的;也就是说,如果这个时候我在容器内部的iptables规则,宿主机也是马上生效的吗? !
    ~~~

  • @Ta / 2022-11-11 / /

    @㝶芾厶眵攴䭡,对。而且特权容器可以挂载外部文件系统,只需要自己创建一下设备号就行了。特权容器的所有隔离保护都没有效果,都能突破。

  • @Ta / 2022-11-11 / /

    @老虎会游泳 好吧,老虎老虎我爱你,非常感谢、哈哈哈;之前我查来查去 都没 get到点,没找到逃逸这个关键词
    ~~~

添加新回复
回复需要登录