抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

闲置的安卓手机不要扔,裹上鸡蛋液,粘上面包糠,下锅炸至金黄酥脆,隔壁小孩都馋哭了…

前言

咕咕咕…

环境

docker

昨天搞定了这玩意, 咱先写它吧..虽然还有许多不完美..

准备

手机需要 root 且在这里假定你有编译安卓 kernel(内核) 的能力

根据大佬们的尝试: Docker on Android, 咱现在可以简单地在 termux 上直接安装

1
2
$ pkg install root-repo
$ pkg install docker

内核

因为 docker 的主要功能依赖于内核, 所以我们的安卓内核需要进行一番定制

首先检查目前的手机运行的内核针对 docker 开启的配置支持程度

1
2
3
4
5
$ pkg install wget
$ wget https://raw.githubusercontent.com/moby/moby/master/contrib/check-config.sh
$ chmod +x check-config.sh
$ sed -i '1s_.*_#!/data/data/com.termux/files/usr/bin/bash_' check-config.sh
$ sudo ./check-config.sh

asciicast

可以看到有很多 CONFIG 都处于 missing 的状态

我们需要去针对必要内核配置的缺失, 去做补全

首先开启 Generally Necessary 列表中的全部(能开多少开多少), 再开启 Network Drivers 中的一些配置

为了让 overlay 可用, 咱还得开启 Storage Drivers 中的一些配置

我在这里是这样修改的: ea8285b

除此之外, 我们还需给内核些 patch

做完这些之后再编译内核…最后刷入手机

启动

如果你已经内核让内核成功支持了 docker 所需特性, 那么我们可以启动 dockerd 试试看了 (iptables 需要禁用)

1
$ sudo dockerd --iptables=false

如果没有任何报错

可以简单运行一个容器试试看

1
$ sudo docker run hello-world   

你可以会遇到此类错误

1
2
3
$ sudo docker run hello-world                  
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: process_linux.go:459: container init caused: rootfs_linux.go:117: jailing process inside rootfs caused: pivot_root invalid argument: unknown.
ERRO[0001] error waiting for container: context canceled

这是因为安卓内核使用了 ramdisk 导致的

我们只需要在 dockerd 启动的时候, 使用以下命令即可

1
$ sudo DOCKER_RAMDISK=true dockerd --iptables=false

此时再运行容器, 惊喜出现!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ sudo docker run hello-world 

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm64v8)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

网络

我们可以简单的启动一个 debian 容器试试看 (使用 host 因为 bridge 不太支持, 具体请参考这里)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sudo docker run -ti --net=host arm64v8/debian
root@localhost:/# apt update
Err:1 http://deb.debian.org/debian buster InRelease
Temporary failure resolving 'deb.debian.org'
Err:2 http://security.debian.org/debian-security buster/updates InRelease
Temporary failure resolving 'security.debian.org'
Err:3 http://deb.debian.org/debian buster-updates InRelease
Temporary failure resolving 'deb.debian.org'
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
W: Failed to fetch http://deb.debian.org/debian/dists/buster/InRelease Temporary failure resolving 'deb.debian.org'
W: Failed to fetch http://security.debian.org/debian-security/dists/buster/updates/InRelease Temporary failure resolving 'security.debian.org'
W: Failed to fetch http://deb.debian.org/debian/dists/buster-updates/InRelease Temporary failure resolving 'deb.debian.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.

你会发现没有网络, 无法进行 apt update

此时, 在容器内执行以下命令, 即可使用网络

1
2
# echo “nameserver 8.8.8.8” > /etc/resolv.conf
# groupadd -g 3003 aid_inet && usermod -G nogroup -g aid_inet _apt

最后

你会发现 arm64v8 的容器并不多…能用的也基本不需要使用容器运行

但生命在于折腾, 这个经历让我对 docker 的底层有了比较浅显的了解

不由得感叹现代计算机这迷人的魅力凝聚了多少人的心血啊

实在是太浪漫了~

评论