前言

大家好,我是VoltCary

对于经常更换 VPS 的用户来说,迁移工具到新 VPS 是一项复杂的任务。

如果手动重新安装和配置每个软件,不仅耗时,而且容易出错。

本文以 Docker 制作自定义 AWVS24 镜像为案例,详细介绍完整的操作流程,这也是全网首篇完整讲解 Docker 搭建 AWVS24 的文章。

为什么选择自定义镜像?
网上大多教程直接 pull 别人提供的镜像,但这些镜像可能存在安全隐患,例如后门或挖矿程序。通过自制镜像,您可以确保工具的安全性和完整性。

迁移解决方案

以下是常见迁移方案的分析:

  1. 方案1:vps 上传自定义 ISO 镜像

    缺陷:仅限支持上传 ISO 的 VPS 服务商。

  2. 方案2:进入容器,手动安装程序

    启动进入容器,手动安装并配置环境,通过 docker push 保存容器镜像。在新的 vps 上,依次 docker pull 所有工具。

    缺陷:每次软件更新都需重新安装和推送容器,过程繁琐。

  3. 方案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 环境:

  1. 启动容器时指定 /sbin/init 替代 /bin/bash
  2. 在 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 程序管理多个工具,敬请期待!


安全无极限
1 声望0 粉丝