论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
主机系统
›
linux
›
docker安装并跑通QQ呆板人实践(2)-署名服务器bs-qsign ...
docker安装并跑通QQ呆板人实践(2)-署名服务器bs-qsign搭建 ...
何小豆儿在此
金牌会员
|
2024-6-22 13:04:32
|
显示全部楼层
|
阅读模式
楼主
主题
857
|
帖子
857
|
积分
2571
在前文中,我们详尽论述了QQ呆板人的搭建过程及其终极实现的各项功能展示。接下来,我们将转向探讨该项目基于Docker构建服务的具体实践。本篇将以QQ呆板人署名服务——qsign为起点,渐渐睁开叙述。
1 获取和运行 xzhouqd/qsign:8.9.63 镜像
1.1 获取镜像
获取镜像有两种方式
1.1.1 从 Docker Hub 拉取镜像
docker pull xzhouqd/qsign:8.9.63
复制代码
1.1.2 从本地存储文件加载镜像
docker load -i xzhouqd_qsign_8.9.63.tar
复制代码
上面提及的示例文件 “xzhouqd_qsign_8.9.63.tar” ,实际上是由 Docker 镜像导出并存储到本地的压缩文件。那么,如许的文件是怎样天生的呢?接下来,我们将渐渐揭示这一过程。
首先,我们需要利用 Docker 的镜像枚举下令来确认目的镜像是否已经存在于本地的 Docker 环境中:
docker images
复制代码
执行的结果如下图:
通过执行上述下令,您将看到一个列表,其中包含了本地已有的所有镜像或指定镜像的信息。假如目的镜像确实存在,它将在列表中显示;否则,需要从远程堆栈(如Docker Hub)拉取或通过其他方式获取(如:1.1.1所述 )。
假设“xzhouqd/qsign:8.9.63”镜像已存在于本地Docker环境中,接下来我们将演示怎样将其导出为.tar文件:
docker save -o xzhouqd_qsign_8.9.63.tar xzhouqd/qsign:8.9.63
复制代码
这条下令中:
docker save 是用于导出镜像的Docker下令。
-o xzhouqd_qsign_8.9.63.tar 指定了导出后压缩文件的名称和路径。
xzhouqd/qsign:8.9.63 是要导出的镜像的完整名称(包罗堆栈名、镜像名和标签)。
执行此下令后,Docker将把指定镜像及其依赖的所有层打包成一个名为“xzhouqd_qsign_8.9.63.tar”的.tar文件,并将其保存到当前工作目录下。至此,我们就成功创建了由Docker镜像天生的本地压缩文件。
1.2 由镜像运行天生容器
docker run -d `# -d 表示保持后台运行` \
--restart=always `# 表示开机即自动运行` \
--name bs-qsign `容器名称` \
-p 18080:8080 `# 端口映射,将容器的 8080 端口映射到宿主机的 18080 端口` \
-e ANDROID_ID=xxxxxxx `# 此值可以随便设置,但需要和 cqhttp 里的设置一致` \
xzhouqd/qsign:8.9.63 # 镜像文件
复制代码
小贴士:
在多行Shell下令文件中,欲在行尾利用反斜杠 \ 举行续行的同时添加注释,可于 \ 之前插入一对反引号 ` 包裹的 # 字符来实现,以此实现续行与注释的结合。
至此,bs-qsign 署名服务器已顺利完成搭建。为便于后续举行参数的动态调解、实现与其他容器间设置的统一管理,以及一键启动具有复杂功能的扩展服务,建议将干系参数迁移至设置文件举行妥善存储。
2 创建设置文件:config.sh
此设置文件,由以下几个部分构成
2.1 根本参数
appName="bs-qsign" # 应用名称
appVersion="0.0.1" # 应用版本号
imageName="xzhouqd/qsign:8.9.63" # 镜像名称
containerName="$appName" # 容器名称
复制代码
2.2 docker run 干系设置
通常情况下,我们在设置Docker容器时会涉及以下三个焦点要素:
Volumes —— 用于宿主机与容器之间实现文件或目录的双向同步映射,确保数据持久化及共享。在设置文件里以变量 volumes 表示。
Ports —— 通过端口映射,使得外部可以或许访问到容器内部运行的服务,实现网络通信。在设置文件里以变量 ports 表示。
Environments —— 设置环境变量,为容器内应用程序提供须要的运行时设置信息。在设置文件里以变量 envs 表示。
对于上述各项设置,可根据实际应用场景自由选择实用的项目。对于暂时无需利用的设置项,可以选择对其举行注释以备后续参考,大概直接删除以保持设置文件简便。
# docker run 相关配置(可选项,如为空,可不填)
volumes=(/path_in_host:/path_in_container)
# /path_in_host - 宿主机目录
# /path_in_container - 容器目录
ports=("18080:8080") # 宿主机端口:容器端口
envs=("ANDROID_ID=tanbushi01") # 变量名=变量值
复制代码
上述以圆括号 () 包围的数据结构在Shell脚本中定义了一个数组。其中,用单引号或双引号包裹的文本构成数组的各个元素,多个元素之间以空格分隔。以包含多个端口映射的数组为例:
ports=("18080:8080" "15703:5703")
复制代码
这里,数组 ports 包含两个元素:“18080:8080” 和 “15703:5703”,分别代表将宿主机的18080端口映射到容器的8080端口,以及将宿主机的15703端口映射到容器的5703端口。
雷同地,对于 volumes(卷映射)和 envs(环境变量)数组的定义,只需按照相同的方式指定各自的映射关系或环境变量键值对即可:
volumes=("host_path1:container_path1" "host_path2:container_path2")
envs=("VAR1=value1" "VAR2=value2")
复制代码
以上述方式声明的 volumes 数组表示将宿主机的 host_path1 目录映射到容器的 container_path1,host_path2 目录映射到 container_path2。而 envs 数组则设置了两个环境变量:VAR1 的值为 value1,VAR2 的值为 value2。
2.3 标记 config.sh 脚本执行状态
通过设置变量 configured 来标记 config.sh 脚本是否已执行过:
configured=true
复制代码
当该变量值为 true 时,表明 config.sh 脚本已成功执行过一次,旨在防止后续重复加载或执行设置,确保系统的稳定性和一致性。
终极的config.sh内容如下:
#!/bin/bash# 根本参数appName="bs-qsign" # 应用名称
appVersion="0.0.1" # 应用版本号
imageName="xzhouqd/qsign:8.9.63" # 镜像名称
containerName="$appName" # 容器名称
# docker run 干系设置(可选项,如为空,可不填)ports=("18080:8080")envs=("ANDROID_ID=tanbushi01")# 标记是否已经设置过configured=true
# 标记变量——此脚本已经被执行过
复制代码
3 运行容器的脚本:run.sh
#!/bin/bash
# 运行初始化脚本
. ../../shell-scripts/run_init.sh
# 创建并执行临时文件——实现 docker run 命令(临时文件不是在容器里哦!)
. ../../shell-scripts/run_in_tmp.sh
echo ""
echo "*********************************************************"
echo "成功创建容器:【 $containerName 】!"
echo "*********************************************************"
echo ""
复制代码
3.1 初始化脚本:run_init.sh
#!/bin/bashset -e # 遇到错误时退出脚本# 判断是否运行过设置文件 config.sh,假如未运行过,则运行设置文件if [ -z "$configured" ]; then . ./config.shfi# 查抄 Docker 是否在运行if ! docker info > /dev/null 2>&1; then echo "Docker 没有运行。请启动 Docker 再试!" exit 1fi# 查看指定名称和TAG的镜像是否存在str=$imageNameIFS=":"read -ra parts <<< "$str"_img_name=${parts[0]}_img_tag=${parts[1]}set +erslt=`docker images
| grep -E "^$_img_name\s+$_img_tag\s+"`set -e# 判断字符串是否为空if [ -z "$rslt" ]; then echo "镜像不存在,请先构建镜像!" exit 2fi# 查抄容器是否存在if docker ps -a --filter "name=$containerName" | grep -q "$containerName"; then echo "" echo "容器【 $containerName 】存在,先停止,再删除..." # 容器存在,先停止,再删除 echo "" echo "停止容器【 $containerName 】..." docker stop $containerName > /dev/null 2>&1 echo "" echo "删除容器【 $containerName 】..." echo "" docker rm $containerName > /dev/null 2>&1fi
复制代码
3.2 暂时天生的运行 docker run 的脚本:run_in_tmp.sh
#!/bin/bash
OS=$(uname)
is_windows=false
case "$OS" in
Linux) # 在 Linux 系统上运行
;;
Darwin) # 在 macOS 系统上运行
;;
CYGWIN*|MINGW32*|MSYS*|MINGW*) # 在 Windows 系统上运行
is_windows=true
;;
*)
echo "Unknown OS: $OS" # 在其他系统上运行
;;
esac
# 执行 docker run 命令的临时脚本文件名
shell_script="/tmp/${containerName}_run.sh"
# 输出数组元素生成映射 volume、port、env
function exportMapItems() {
local script_name=$1 # 脚本文件名
shift
local type_prefix=$1 # 类型前缀
shift
# 如果是windows,同时$type_prefix是-v 则自动添加斜杠
if [ "$is_windows" = true ] && [ "$type_prefix" = "-v" ]; then
auto_slash=/
else
auto_slash=""
fi
# echo "auto_slash=$auto_slash"
local -a items=("$@")
for map_item in "${items[@]}"; do
# 输出数组元素
echo " ${type_prefix} ${auto_slash}${map_item} \" >> $script_name
# echo " ${type_prefix} ${auto_slash}${map_item} \"
done
}
# 创建临时文件:/tmp/_run.sh(不是在容器里哦!)
echo "#!/bin/bash" > $shell_script
echo "" >> $shell_script
echo "docker run -itd \" >> $shell_script
echo " --restart always \" >> $shell_script
# 写入 volumes,注意,此处只能是-v,不是-V
exportMapItems $shell_script "-v" "${volumes[@]}"
# 写入 ports,注意,此处只能是-p,不是-P
exportMapItems $shell_script "-p" "${ports[@]}"
# 写入 envs,注意,此处只能是-e,不是-E
exportMapItems $shell_script "-e" "${envs[@]}"
# 写入 name
echo " --name $containerName \" >> $shell_script
# 写入 imageName
echo " $imageName" >> $shell_script
chmod 755 $shell_script
. $shell_script
rm -f $shell_script
复制代码
4 总结
本篇首先讲述了Docker 镜像拉取、保持到本地、从本地加载等操纵流程;其次通过两个文件构建了一种可设置的机制,使得基于指定镜像创建并运行容器的过程更具通用性和机动性。不仅实用于当前的 bs-qsign 服务摆设场景,还能无缝应用于后续提及的其他服务搭建,从而加强了摆设流程的尺度化程度、顺应性和代码复用性。
上一篇:docker安装并跑通跑通QQ呆板人实践(1)-前言及展示
下一篇:docker安装并跑通QQ呆板人实践(3)-bs-nonebot搭建
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
何小豆儿在此
金牌会员
这个人很懒什么都没写!
楼主热帖
使用 Mypy 检查 30 万行 Python 代码, ...
mysql8.0.25安装配置教程(windows 64位 ...
TechEmpower 21轮Web框架 性能评测 -- ...
day05-优惠券秒杀01
3分钟告诉你如何成为一名黑客?|零基础 ...
K3S系列文章-使用AutoK3s在腾讯云上安 ...
1.2 Hadoop简介-hadoop-最全最完整的保 ...
主键约束,唯一约束,默认约束,检查约 ...
图像金字塔
再次入坑写学习笔记
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表