armdocker:在arm上运行容器

本文尝试在arm平台同时跑多个容器,测试性能。基于 arm 版本的 busybox。

一、镜像

1.1 版本选择尝试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
docker run --name busybox -itd armhf/busybox  // 这个太旧了

docker exec -it busybox sh

docker rm -f busybox

docker cp /usr/lib/libpthread-2.25.so busybox:/usr/lib
docker cp /usr/lib/libpthread.so.0 busybox:/usr/lib

docker cp /usr/lib/libgcc_s.so.1 busybox:/usr/lib/
docker cp /usr/lib/libc.so.6 busybox:/lib/
docker cp /usr/lib/libc-2.25.so busybox:/lib/

docker cp /usr/lib/libstdc++.so.6.0.24 busybox2:/lib/
docker cp /usr/lib/libstdc++.so.6 busybox2:/lib/

docker cp /usr/lib/libgcc_s.so.1 busybox2:/lib/
docker cp /usr/lib/libc.so.6 busybox2:/lib/
docker cp /usr/lib/libc-2.25.so busybox2:/lib/

docker cp hello busybox:/
docker cp data busybox:/

测试失败。

1.2 确定版本

dockerhub 上有 armhf/busybox 和 arm32v7/busybox 以及官方的 busybox 镜像。
经测试,armhf/busybox 库版本较旧,无法运行程序。官方 busybox 和 arm32v7/busybox 较新,但缺少库。这里选择 arm32v7/busybox。
下载并运行:

1
2
docker pull arm32v7/busybox
docker run --name busybox -itd arm32v7/busybox // 注:直接使用此命令亦可

释义:运行一个名称为 busybox 的容器。

1.3 拷贝库

将板子系统的 /lib/ 目录拷贝到容器 busybox 中。

1
# docker cp /lib/ busybox:/  // 注:由于存在/lib/和/lib32,需要写全目录,即 /lib/ 

注:可以将 /lib/ 目录精简,删除不必要的库。

1.4 重新制作镜像

查看容器 ID:

1
2
3
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb9a3d81a6a0 arm32v7/busybox "sh" 2 days ago Up 2 days busybox

将当前容器保存为镜像:

1
# docker commit cb9a3d81a6a0 latelee/armbusybox:dev

登陆dockerhub:

1
# docker login // 输入账号和密码

提交:

1
# docker push latelee/armbusybox:dev

1.5 验证

删除镜像 latelee/armbusybox:dev。

1
docker rmi latelee/armbusybox:dev

重新下载:

1
docker pull latelee/armbusybox:dev

或运行:

1
docker run --name busybox1 -itd latelee/armbusybox:dev

二、性能分配

2.1 分配CPU

注意,这不是指分配多少个CPU的,是按百分比计量的。如单核CPU系统中,指定 0.5 CPU 表示该容器只占用 50% 的 CPU。
示例:

1
2
# docker run -it --rm --cpus=0.5 lateee/busybox sh
/ #./test

运行压力测试程序 test 后,在宿主机用 top 命令查询,发现程序最多只占 50% 的 CPU。

分配指定CPU:

1
2
# docker run -it --rm --cpuset-cpus="0" lateee/busybox sh
/ #./test

指定在 CPU 编号为 0 的CPU上。可以同时指定多个,如 --cpuset-cpus="1,3" 。如果指定的CPU不存在,提示如下错误:

1
2
docker: Error response from daemon: Requested CPUs are not available - requested 1, available: 0.
See 'docker run --help'.

设置CPU权重。

1
2
# docker run -it --rm --cpuset-cpus="0" --cpu-shares=512 lateee/busybox sh
# docker run -it --rm --cpuset-cpus="0" --cpu-shares=1024 lateee/busybox sh

在相同的CPU核上运行,一为512,一为1024,两者比例为1:2。
注:cpu-shares默认为1024,可以通过设置比例对应的值达到不同权重目的。如果为0,表示默认。
再注:单核CPU最大只有100%。多核才会出现超过100%的情况。

2.2 分配内存

指定容器使用的内存为100MB:

1
# docker run -it --rm -m 100M lateee/busybox sh  

-m 和 –memory 等效。
其它未测试的:

1
2
3
4
--memory-swap :memory和swap之和(从名称可以理解)
--memory="300m" --memory-swap="1g" : 内存为300MB,总大小为1GB,则swap为700MB
-m 300M --memory-swap=300M : 所有能使用的内存为300MB(无swap可用)
--memory-swap -1 // swap空间不受限制,(但内存空间受-m的限制)

三、实践记录

操作硬件需要添加--privileged--device,设备列表可添加多个。

1
docker run -itd --rm --privileged --device "/dev/ttyO1 /dev/ttyO2" --name arm latelee/armbusybox:dev

参考