一些小知识
关于 C 库
C 库有两种实现:
- glibc:完整、臃肿;
- musl:精简、轻量;
关于编译器
编译器使用 glibc 库,那么编译出来的程序就依赖 glibc 库;
编译器使用 musl 库,那么编译出来的程序就依赖 musl 库;
关于 rootfs
我们知道 busybox 可以制作 rootfs,使用 musl 编译器编译 busybox 源码得到的 rootfs 是基于 musl 的,使用 glibc 编译器编译 busybox 源码的到的 rootfs 是基于 glibc 的;
大部分容器镜像都是基于 glibc 的,适用于 PC 和大内存资源丰富的嵌入式平台;
还有小部分基于 musl 的容器镜像,适用于小内存的嵌入式平台;
我们接下来的主角是 alpine 容器镜像,它是一个基于 musl 和 busybox 的 linux 发行版;
环境搭建
安装 docker
安装过程可以参考“安装 wsl2 后端的 docker-desktop 版本”;
选择平台
在 docker hub 上可以搜索到适合不同平台的 alpine,我们选择适用于 armv7 平台的版本;
交互式搭建
-
在控制台拉取 armv7 平台的 alpine;
1
docker pull --platform=linux/arm/v7 alpine:latest
-
创建 alpine app 并进入
/bin/sh
;使用前最好使用
-v xxx:xxx
挂载共享目录,方便主机侧和容器侧拷贝文件;1 2
docker run -it --name alpine_armv7 \ --platform=linux/arm/v7 alpine:latest /bin/sh
windows 平台 powershell 执行以下命令:
1 2 3 4
docker run ` -it --name alpine_armv7 ` -v E:\DockerShare:/share ` --platform=linux/arm/v7 alpine:latest /bin/sh
-
接着安装 libgcc 和 libstdc++
1 2 3
apk update apk add --no-cache libgcc apk add --no-cache libstdc++
[建议] 使用 dockerfile 搭建
-
在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:
1 2 3 4 5 6
FROM --platform=linux/arm/v7 alpine:latest RUN \ apk update \ && apk add --no-cache libgcc \ && apk add --no-cache libstdc++ ENTRYPOINT ["/bin/sh"]
-
接着在该目录创建名为 myalpine 的镜像:
1
docker build -t myalpine .
-
使用该镜像创建 alpine app 并进入
/bin/sh
:使用前最好使用
-v xxx:xxx
挂载共享目录,方便主机侧和容器侧拷贝文件;1
docker run -it --name alpine_armv7 myalpine
windows 平台 powershell 执行以下命令:
1 2 3 4
docker run ` -it --name alpine_armv7 ` -v E:\DockerShare:/share ` myalpine