研一参加的老师一个项目,其中用到了Docker和树莓派。有一部分内容需要对树莓派native性能和树莓派上容器性能比较。
我用sysbench性能测试工具进行测试对照。其中因为树莓派是arm架构(我们当时买的是32位的树莓派4B(4GB+16GB内存卡),内存卡自带的32位Debian系统) 但是很多Docker镜像都是基于x86平台的,所以并不能很好的支持。所以一开始还是走了不少弯路。这里记录一下。
安装docker
下载安装脚本:
curl -fsSL https://get.docker.com -o get-docker.sh
使用阿里云镜像下载安装:
sh get-docker.sh --mirror Aliyun
执行脚本后会自动识别arm架构,下载安装对应版本docker,稍等片刻即可
将当前用户加入docker组:
sudo usermod -aG docker $USER
退出当前终端并重新登录,此时操作docker不再需要加sudo权限
安装docker-compose
因为树梅派是arm架构,docker-compose是没有提供官方的二进制文件的,所以我们要使用python的pip3工具来安装docker-compose
更新apt软件源:
sudo apt-get update
安装python和pip3(我的系统已经自带了,所以不用安装)
安装libffi-dev,否则在安装docker-compose的时候会报错:

sudo apt-get install -y libffi-dev
使用pip3安装docker-compose,临时使用中科大的软件源:
sudo pip3 install docker-compose -i https://pypi.mirrors.ustc.edu.cn/simple/ --trusted-host pypi.mirrors.ustc.edu.cn
安装完成后,如果执行docker-compose命令提示找不到ssl_match_hostname:
需要把python3.6(具体哪个版本从控制台输出可以看出来)的dist-packages文件夹复制到docker的工作目录下:
sudo cp -r /usr/local/lib/python3.6/dist-packages/backports /usr/local/lib/python3.6/dist-packages/docker/transport/
docker镜像更改软件源
在树莓派docker中构建镜像时,如果要更改镜像软件源,使用案例如下:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
#安装ffmpeg工具
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list \
&& apt-get update \
&& apt-get install -y ffmpeg \
&& apt-get clean && apt-get autoclean && apt-get autoremove \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY ./publish/ /app
#默认就是80端口,如果要别的端口,代码中要明确指定监听端口号
EXPOSE 80
EXPOSE 443
ENTRYPOINT ["dotnet","WebMvc.dll"]
开放指定端口
树莓派使用的是iptables
开放80端口(注意eth0是网卡,如果是无线连接要改为wlan0
):
sudo iptables -I INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
sudo iptables -I OUTPUT -o eth0 -p tcp --sport 80 -j ACCEPT
关闭80端口
sudo iptables -I INPUT -i eth0 -p tcp --dport 80 -j DROP
sudo iptables -I OUTPUT -o eth0 -p tcp --sport 80 -j DROP
更换软件源
参考这里:丢石头教程
接下来是关于arm镜像
刚开始,我直接dcker search sysbench 发现搜到好多sysbench的镜像,就找starts最多的下几个。
pi@raspberrypi:~ $ docker search sysbench
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
severalnines/sysbench Sysbench 1.0 13 [OK]
ljishen/sysbench SysBench (Version 1.0) 5 [OK]
percona/sysbench 5
dotnetdr/sysbench sysbench 0.5 in centos docker images 2 [OK]
ociotec/sysbench Container running a CPU sysbench in an infin… 1
rkourtz/sysbench 1
cwpinkerton/sysbench MySQL 5.6 with SYSBENCH 0 [OK]
saied/sysbench Sysbench 1.1.0 built from source in an Ubunt… 0
dpitsoftware/sysbench The sysbench software in older versions than… 0
diamantisolutions/sysbench 0
jonhartley/sysbench-custom Sysbench with some custome scripts 0
bretfisher/sysbench-docker-hpe Sysbench and Docker Setups to Benchmark Phys… 0 [OK]
quarriedstone/sysbench Test sysbench 0
gigichen34/sysbench-1 0
xridge/sysbench Docker image for running sysbench based benc… 0
lnsp/sysbench 0
sjclem/sysbench A basic debian-based sysbench image 0
fmanders/sysbench 0
lamhaison/sysbench 0
kongms/sysbench 0
sergeygals/sysbench sysbench 1.0 with ubuntu 16.04 0 [OK]
senax/sysbench docker sysbench 0
perconalab/sysbench 0
openmcp/sysbench-test 0
hjalves/sysbench Sysbench 1.0 on Docker 0 [OK]
然后创建容器的时候都会报错:
pi@raspberrypi:~$ docker run severalnines/sysbench sysbench --test=cpu --cpu-max-prime=2000 run
standard_init_linux.go:211: exec user process caused "exec format error"
一查原因,是x86的镜像在arm平台不兼容。
但是怎么找arm架构的镜像呢?
忽然想起来一个原始的办法,我直接fq到Docker Hub上搜:sysbench
,发现确实有支持arm的镜像!!!
比如:ociotec/sysbench
在这个镜像的Tags页面,就能查到它支持的平台,
有latest:支持linux/amd64 (x86架构)
有arm64:linux/arm (64位arm)
有arm32v7:linux/arm(32位arm)
最后一个就是我要找的,于是在终端pull的镜像后面加上这个tag:
pi@raspberrypi:~ $ docker pull ociotec/sysbench:arm32v7
arm32v7: Pulling from ociotec/sysbench
bb075e02249b: Pull complete
8bf0ede911e1: Pull complete
7750415cbda1: Pull complete
26385376f7c2: Pull complete
a477b6bc7981: Pull complete
e925c413538a: Pull complete
Digest: sha256:82c63b471ff1be8ddaf97a6e90230b668d76d82a7a3cb82db32430670c3a5108
Status: Downloaded newer image for ociotec/sysbench:arm32v7
docker.io/ociotec/sysbench:arm32v7
创建容器并运行(进行cpu测试):
pi@raspberrypi:~ $ docker run ociotec/sysbench:arm32v7 sysbench --test=cpu --cpu-max-prime=2000 run
sysbench 0.4.12: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Doing CPU performance benchmark
Threads started!
Done.
Maximum prime number checked in CPU test: 2000
Test execution summary:
total time: 10.4290s
total number of events: 10000
total time taken by event execution: 10.3878
per-request statistics:
min: 1.01ms
avg: 1.04ms
max: 2.69ms
approx. 95 percentile: 1.11ms
Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 10.3878/0.00
完美!!!!!!!