前言
大家好,我是VoltCary
对于经常更换 VPS 的用户来说,迁移工具到新 VPS 是一项复杂的任务。
如果手动重新安装和配置每个软件,不仅耗时,而且容易出错。
本文以 Docker 制作自定义 AWVS24 镜像为案例,详细介绍完整的操作流程,这也是全网首篇完整讲解 Docker 搭建 AWVS24 的文章。
为什么选择自定义镜像?
网上大多教程直接pull
别人提供的镜像,但这些镜像可能存在安全隐患,例如后门或挖矿程序。通过自制镜像,您可以确保工具的安全性和完整性。
迁移解决方案
以下是常见迁移方案的分析:
方案1:vps 上传自定义 ISO 镜像
缺陷:仅限支持上传 ISO 的 VPS 服务商。
方案2:进入容器,手动安装程序
启动进入容器,手动安装并配置环境,通过
docker push
保存容器镜像。在新的 vps 上,依次docker pull
所有工具。缺陷:每次软件更新都需重新安装和推送容器,过程繁琐。
方案3:基于 Dockerfile 和 bash制作自定义镜像(推荐)
优势如下:
- 自动化操作,减少重复工作。
- 配合 Expect 脚本实现交互输入。
- 最大限度保障宿主机安全。
结论:
推荐使用方案 3,以下重点介绍基于 Dockerfile 的自定义镜像制作过程。
首先从安全性来讲,使用 docker 来部署工具,可以最大限度避免宿主机被攻击。
若部署在宿主机,并对外开放 web 端口,当平台存在漏洞时,vps 极易被攻破,所以更推荐使用 docker 安装相关工具,可以尽量避免被黑吃黑。
实践初级:Docker制作awvs镜像
问题:Systemd 初始化系统缺失
错误描述:
在 Dockerfile 中运行 AWVS 安装程序RUN acunetix_24.8.240828144_x64.sh
时构建失败,提示:System has not been booted with systemd as init system (PID 1). Can't operate.
Docker 容器默认不以systemd
作为初始化系统(PID 1),而 AWVS 安装程序依赖完整的systemd
环境。解决方案:
通过在容器中指定/sbin/init
启动方式模拟完整systemd
环境:
- 启动容器时指定
/sbin/init
替代/bin/bash
。- 在 Dockerfile 中预配置账户密码,以避免手动输入。
制作步骤
1、准备工作
将 awvs 安装程序文件放到 dockerfile 文件同目录
2、编写 dockerfile 文件
FROM ubuntu:latest
WORKDIR /opt/awvs/
COPY . /opt/awvs/
RUN apt-get update && apt-get install -y \
systemd \
systemd-sysv \
dbus \
sudo \
sysvinit-utils \
bzip2 \
passwd \
&& apt-get clean
RUN useradd -m -s /bin/bash test && echo "test:111" | chpasswd
RUN echo "root:111" | chpasswd
USER root
#启动 sysvinit
CMD ["/bin/bash"]
3、构建镜像
docker build --no-cache -t awvs .
4、启动容器
docker run -p 3443:3443 -it --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro awvs /sbin/init
提示输入 dockerfile 中配置的账户密码
5、安装AWVS24
cd /opt/awvs
chmod +x acunetix_24.8.240828144_x64.sh
按提示手动安装
6、运行 awvs.sh
chmod +x awvs.sh
./awvs.sh
实践优化:全自动化实现
解决手动步骤问题
- 如果不想先启动容器,再手动进入容器/sbin/init,再执行./acunetix_24.8.240828144_x64.sh。
- 编写bash脚本来实现自动化。
- 配置systemd初始化环境之后,进入/bin/bash就可以运行AWVS安装程序。
优化后的 Dockerfile
FROM ubuntu:20.04
WORKDIR /opt/awvs/
COPY . /opt/awvs/
RUN apt-get update && apt-get install -y \
expect \
systemd \
systemd-sysv \
sysvinit-utils \
dbus \
sudo \
bzip2 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
STOPSIGNAL SIGRTMIN+3
RUN [ -e /sbin/init ] || ln -s /lib/systemd/systemd /sbin/init
ENTRYPOINT ["/lib/systemd/systemd"]
RUN chmod +x acunetix_24.8.240828144_x64.sh awvs24.expect awvs.sh
EXPOSE 3443
VOLUME ["/sys/fs/cgroup"]
CMD ["/bin/bash"]
自动化脚本:awvs_install.sh
#!/bin/bash
# 构建Docker镜像
if ! docker build --no-cache -t awvs .; then
echo "Docker build failed"
exit 1
fi
# 运行Docker容器
if ! docker run -p 3443:3443 --name=awvs3443 -d --restart=always --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro awvs; then
echo "Docker run failed"
exit 1
fi
# 获取运行中的容器ID
container_id=$(docker ps -q -f name=awvs3443)
# 检查容器ID是否成功获取
if [ -z "$container_id" ]; then
echo "Failed to get container ID"
exit 1
fi
# 提示用户输入必要的信息
echo "Please provide the required inputs for the script /opt/awvs/acunetix_24.8.240828144_x64.sh"
echo "The inputs will be passed directly to the script."
# 执行交互式命令,将用户输入传递给容器内的脚本
# docker exec -it $container_id /bin/bash -c "/home/awvs/acunetix_24.8.240828144_x64.sh"
sleep 5
# docker exec -it $container_id /bin/bash -c "expect /home/awvs/awvs24.expect" && docker exec -it $container_id /bin/bash -c "/home/awvs/awvs.sh"
docker exec -it $container_id /bin/bash -c "/opt/awvs/acunetix_24.8.240828144_x64.sh" && docker exec -it $container_id /bin/bash -c "/opt/awvs/awvs.sh"
使用方法
1、给脚本赋予权限
chmod +x awvs_install.sh
2、运行脚本
./awvs_install.sh
3、进入 awvs 安装界面,按提示输入完成安装
总结
本文通过详细的逻辑步骤,介绍了如何使用 Docker 制作 AWVS24 自定义镜像并实现自动化部署。
相比传统手动安装方式,Docker 的安全性和可移植性更强。下一期将介绍如何配合 Go 程序管理多个工具,敬请期待!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。