./android_ctl.sh [指令] [附加参数]
具体指令及附加参数请执行 ./android_ctl.sh --help
查看
.env
中包含了脚本和compose file的配置信息,作为配置持久化文件docker-compose.yml
文件中的容器配置启动容器docker-compose.yml
中的变量会被.env
中的环境变量替换.env
文件中进行读取配置项有两种
在compose file中,描述了n个服务,每个服务中都放了安卓容器的详细配置信息,还有一个自定义的网桥
version: "3.8"
services:
"android_0":
# android_0的配置信息
"android_1":
# ...
"android_2":
# ...
"android_3":
"android_4":
networks:
android-bri:
ipam:
driver: default
config:
- subnet: "172.20.0.0/16"
name: android-bri
driver_opts:
com.docker.network.bridge.name: android-bri
默认放了5台的配置,也就是说此时使用create最多只能创建五台安卓
后面可以通过在 docker-compose.yml
拷贝上面的内容,并修改id进行扩展
细节分析:
如下是对android_0的所有配置,其他与这个基本一致,仅仅换了id
services:
"android_0":
container_name: ${CONTAINER_NAME_PRE}0
image: ${IMAGE_0}
restart: unless-stopped
privileged: true
volumes:
- "${ANDROID_DATA_DIR}/data_0:/data"
- "${ANDROID_CONF_DIR}/container_common.conf:/vendor/etc/container/container_common.conf"
- "${ANDROID_CONF_DIR}/container_0.conf:/vendor/etc/container/container.conf"
- "./sh/health_check.sh:/health_check.sh"
ports:
- "1100:5555"
healthcheck:
test: sh /health.sh
interval: 1s
timeout: 2s
retries: 10
start_period: 5s
start_interval: 1s
deploy:
resources:
limits:
memory: ${MEM_UPPER_LIMIT_0}
cpus: '${CPUS_0}'
reservations:
memory: ${MEM_LOWER_LIMIT_0}
networks:
android-bri:
ipv4_address: 172.20.0.2
分析:
容器名前缀可以通过在.env文件配置CONTAINER_NAME_PRE变量实现,一般用默认的android_
即可,尽量不要修改
.env文件中有一个IMAGE_BASE
表示基础镜像,容器初始化会使用这个值覆盖IMAGE_0
,compose创建容器时会把这个值替换到compose-file中
默认开启
绑定的存储卷:
端口绑定:1100:5555,表示外部可以通过宿主机ip:1100访问到容器的5555端口,此时5555端口对应的是安卓的adbd服务,后面需要根据需求修改
健康检查:每1秒调一次健康检查脚本,如果超过2秒没有返回则表示此次检查超时,再等1秒开始下一次检查,循环10次,如果10次之后脚本还没有返回0,则表示容器不健康,其中启动时间设置为5s,启动时间内如果脚本返回0,则表示为健康,且启动时间内的重试次数不计入10次之中,如下是理解图
health_check脚本如下
if ! ping -c 1 www.baidu.com; then
exit 1
fi
if ! setprop vendor.dump true; then
exit 1
fi
if ! setprop abcdef "/data/dev"; then
exit 1
fi
exit 0
内存和CPU限制可以通过compose-file完成,具体值存在.env
文件中,调用脚本是会有两步操作
网络使用自定义的网桥,且ip会为每个容器进行静态分配
脚本分为三种
android_ctl.sh
usage.sh
, util.sh
即util.sh脚本
打印日志
调用方式:
log LOGLEVAL MESSAGE
可以限制四种方向的网速:
全部使用tc工具进行限速
tc工具的特性:只能捕获从网卡出去的报文,无法捕获从网卡进来的报文
tc通过三个部分完成限速:
虽然tc只能限制网卡的出口速度,但是我们使用的是网桥,
所有容器的数据帧都会发向网关网卡(虚机的上传),再由网关网卡经由NAT转发到宿主机的物理网卡,此时可以数据帧中的源ip区分,从而进行限速
网关网卡会向虚机发送数据帧(虚机的下载),此时数据帧的目的ip就是容器的ip,通过此进行过滤限速
但实际测试中只有下载速度可限制,上传速度不可限,可能是由于网络命名空间以及docker虚拟网桥的实现原理,由容器网卡发出的数据帧不会进入宿主机对网关网卡设置的qdisc,从而无法限速
所以只能在容器内部对其网卡添加qdisc队列对所有数据帧进行限制,从而限制上传速度
内部限制就是过滤源ip或者目的ip为内网网段,然后进行速率限制
当前由于Linux文件系统暂时不支持quota限额,为了模拟,手动开辟了一块空间并格式化文件系统挂载到/userdata/container/android_data目录下,此目录下的子目录将可以完成quota限额
但是宿主机重启后,镜像不会自动挂载,需要手动挂载
宿主机重启后,物理网卡和网桥的tc限制会清空,安卓内部的tc限制还在
tc限制外部上传速度的时候需要再安卓手机的命名空间内进行,如果用户有root权限,可能会解除此限制
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。