找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 30662|回复: 36

[N1盒子] Docker入门教程以及arm镜像的制作

 火.. [复制链接]
发表于 2018-11-24 14:32 | 显示全部楼层 |阅读模式
本帖最后由 鲲翔 于 2018-11-24 15:20 编辑

详细的教程看这个大神的
https://www.tomczhen.com/2017/09/15/learn-docker-on-raspberry-pi-part-2/

各位N1盒子玩得风生水起,各类系统也是层出不穷。但其实完全可以用一个系统体验到所有的功能,方法就是使用Docker。Docker是个很牛的技术,可以在现有的系统里开辟出一个单独的环境来运行程序,不受原系统的影响。类似于沙盒技术,但沙盒技术太过抽像,我们以虚拟机来理解它,但是记住,Docker不是虚拟机,只是虚拟机大家玩得比较多,便于理解而这样对比。

下面选用CoreELEC/LibreELEC来说一下Docker的使用,我个人比较推崇使用这个系统,因为这个系统是除安卓外可以硬解4K的系统,加上有Docker,理论上没有什么功能不能实现。刷好CoreELEC后需要安装Docker,CoreELEC下的Docker是以插件的形式来安装的,如果使用其它系统,请自行解决Docker的安装问题。




装好Docker之后,要下载镜像才能实现其它功能。Docker只是一个平台,要实现其它功能需要下载相应的镜像,一般一个镜像就单独装了一个软件,可以最大限度地保证兼容性。Docker的安装镜像是存在国外,国内下载让人吐血,为了保证速度,需要使用国内镜像网站。申请国内镜像网站的方法在这里可以看到:
https://blog.csdn.net/yp090416/article/details/75107938
这个CoreELEC的设置方法不太一样,修改的地方在/storage/.config/system.d/service.system.docker.service这个文件,


添加你申请好的镜像地址。加好镜像地址后,使用docker info看下修改成功没有,下面我们来下载第一个镜像,用ssh登陆后,运行命令:

  1. docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer:linux-arm64
复制代码
运行完成后就可以通过网页来管理Docker了

下面我来简单解释一下这条命令
docker run 这个是启动docker,固定的。
-d是以后台运行
-p 9000:9000是将主机(这里是指coreeelec)的9000端口映射到容器的9000端口。容量你可以理解为一个虚拟机,就是将主机的9000端口映射至虚拟机的9000端口来理解。
--name portainer这个是运行全容器的名字,可以理解为虚拟机的名字
--restart=always这个是说每次机器重启后,这个容器都自动启动。一般都要加个这个参数,机器重启后不用重新执行命令,服务一直都在。
-v /var/run/docker.sock:/var/run/docker.sock这个是portainer固定用法,一般的容器不需要这个参数
-v portainer_data:/data portainer/portainer这个是说主机的 portainer_data文件夹映射到容器里的/data portainer/portainer文件夹。这个参数很重要,一般的下载软件也好,网盘系统也好,数据都是通过这个参数来连通的。这个就像vmware里的共享文件夹的意思,将主机的真实地址映射进容器里的目录,可以直接在容器里操作这个文件夹,比如下载直接存放到这里。
:linux-arm64最后这个是镜像名,Docker首先会在本机寻找你给定的镜像,找不到就上hub.docker.com去下载,网上也没有就会报错。这个镜像要注意,因为docker可以在多个系统下运行,所以寻找镜像时最好指定架构,比如这个是aarch64的,hub.docker.com就要去找这个架构的镜像,不然你下载了x64或者x86的镜像是运行不了的。


好了,docker基本上就是这样,挺简单的,特别是有portainer这个图形管理界面,就更简单了。想要更深入的了解,可以看一开始给的那个网址,定的更详细。有空的话写写镜像的编译。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1恩山币 +1 收起 理由
江寒000 + 1 强大的恩山!(以下重复1万次)

查看全部评分

只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
 楼主| 发表于 2018-11-24 14:42 | 显示全部楼层
本帖最后由 鲲翔 于 2018-11-24 14:50 编辑

https://lantian.pub/article/modi ... matic-build.lantian
制作arm的镜像,可以看这篇贴子,很详细。不过可以看不了了,挂了。我复制过来吧。

一般情况下,Docker 的镜像都是在一个已有的镜像内,一步步运行给定的命令,从而生成一个新的镜像。这样的步骤在大多数人使用的 x86 架构计算机上都不是问题,由于架构互相兼容,一台计算机上生成的镜像往往可以被直接复制到其它计算机上运行,除非镜像中的程序使用了 AVX 等较新的指令集。
但是,还有一批基于 ARM 架构的主机也可以运行 Docker,并运行专门编译的 ARM 架构的镜像。这些主机包括树莓派系列,和其它类似树莓派的主机,例如 Cubieboard,OrangePi,Asus Tinker Board 等等。另外,Scaleway 等主机商也提供基于 ARM 架构的独立服务器。
由于 ARM 架构的系统无法在 x86 架构计算机上运行,因此无法在 x86 计算机上直接通过 Dockerfile 生成 ARM 架构的镜像,一般采用的方法是直接找一台 ARM 主机来 docker build。
但是我在为我的树莓派制作 nginx 的 Docker 镜像时发现这并不是一个很好的方法。由于树莓派的内存只有 1GB,如果开启多线程编译(make -j4 或者 make -j2),内存会不足,gcc 会被杀掉;如果单线程编译(直接 make),编译时间又非常长(几个小时)。
经过查找,另有一种方案可以解决这个问题。这个方案是在 x86 架构计算机上模拟 ARM 环境,即“虚拟机”的方式来编译镜像。虽然 x86 模拟 ARM 没有硬件加速(VT-x,AMD-V 等)支持,效率极低,但是得益于 x86 CPU 的高性能,总体效率还是高于直接在树莓派上编译。
qemu-user-static
第一步是要模拟出一个 ARM 环境。当然,我们可以用 QEMU 直接开一个 ARM 架构的完整 Linux 虚拟机,然后在里面运行 Docker 构建镜像。但是这样做的问题是,需要额外管理一个 Docker,难以将系统资源在主系统和虚拟机之间灵活分配,并且难以使用脚本自动化,即难以整合到 CI、CD 中。
更好的方案是 qemu-user-static,是 QEMU 虚拟机的用户态实现。它可以直接在 amd64 系统上运行 ARM、MIPS 等架构的 Linux 程序,将指令动态翻译成 x86 指令。这样 ARM 系统环境中的进程与主系统的进程一一对应,资源分配灵活,并且易于脚本自动化。
但是还有一个问题:当 ARM 进程尝试运行其它进程时,qemu-user-static 并不会接管新建的进程。如果新的进程仍然是 ARM 架构,那么 Linux 内核就无法运行它。因此,需要开启 Linux 内核的 binfmt功能,该功能可以让 Linux 内核在检测到 ARM、MIPS 等架构的程序时,自动调用 qemu-user-static。开启该功能,并且注册 qemu-user-static 虚拟机后,运行 ARM 程序就和运行 x86 程序一样,对用户来说毫无差别。
在 x86 Docker 中运行 ARM 镜像
要在 Docker 中运行 ARM 镜像,我们要先在计算机上注册 qemu-user-static 虚拟机:
docker run --rm --privilegedmultiarch/qemu-user-static:register --reset

另外,Docker 镜像内必须也含有对应的 qemu-user-static 虚拟机。不过,Docker Hub 上已经有了添加 qemu-user-static 的系统镜像,可以在 https://hub.docker.com/u/multiarch/ 获取:

例如,multiarch/alpine 镜像就在不同 tag 下提供了 aarch64(armv8)、armhf、amd64、i386 的镜像:

如果你之前已经注册了虚拟机,那么就可以直接运行了:
docker run -it --rm multiarch/alpine:armhf-edge /bin/sh
docker run -it --rm multiarch/alpine:aarch64-edge /bin/sh


修改 Dockerfile
接下来我们要在 Dockerfile 中调用 ARM 架构的镜像。如果你的 ARM 主机是 armv7l(armhf)架构(树莓派(默认),Tinker Board 等),那么把Dockerfile 中的第一行修改成 https://hub.docker.com/u/multiarch/ 下对应的 armhf 架构镜像即可。对应关系如下:

  • alpine -> multiarch/alpine:armhf-edge
  • ubuntu:bionic ->     multiarch/ubuntu-debootstrap:armhf-bionic
  • debian:stretch ->     multiarch/debian-debootstrap:armhf-stretch
如果你的 ARM 主机是 aarch64(armv8)架构(树莓派 3 开始支持,但是需要特殊系统才是这个架构),那么对应关系如下:

  • alpine -> multiarch/alpine:aarch64-edge
  • ubuntu:bionic ->     multiarch/ubuntu-debootstrap:arm64-bionic
  • debian:stretch ->     multiarch/debian-debootstrap:arm64-stretch
改完后直接重新构建镜像,你就可以在本地生成 ARM 架构的镜像了。
Docker Hub 自动构建
Docker Hub 不仅提供镜像的存储共享服务,也提供简单的镜像自动构建服务。自动构建服务给每个用户分配了一台 2GB 内存、1 核心 CPU、30GB 硬盘的完整虚拟机运行 2 小时(来自 Docker 官方论坛),并且用户具有 root 权限。
默认的自动构建相当于是我们构建镜像时运行的 docker build那一步,但是我们需要在这之前注册 qemu-user-static 虚拟机。我们可以用 Docker 官方提供的 hook 在构建开始前运行自定义的命令(来自 Docker Cloud 文档)。因为我们分配到的是完整的虚拟机,有 root 权限,所以我们也可以在 hook 中注册虚拟机。
如何创建这样一个 hook?在Dockerfile 的文件夹下创建 hooks 文件夹,再在 hooks 文件夹下创建 pre_build 文件,内容如下:
#!/bin/sh
docker run --rm --privilegedmultiarch/qemu-user-static:register --reset

可以在我的这个 commit 中看到 hook 的示例。
Docker Hub 的自动构建服务会先运行这个脚本注册 qemu-user-static,然后再开始构建。构建完成时 push 上来的就是 ARM 架构
如果你的镜像构建时没有编译操作,构建速度应该相当快,不会比 x86 的镜像慢多少;但是如果有大量的编译操作,例如我的 nginx 镜像,很有可能就超出了 2 小时的时间限制而构建失败。在这种情况下,我们就要换其它不限制时间的自动构建服务,例如 Travis CI。
Travis CI 自动构建
Travis CI 是对开源社区免费的一款自动构建工具。只要你的 Dockerfile 传到了 GitHub上的 Public Repository(公开代码仓库)里,就可以直接使用它。
对于构建 Docker 镜像来说,Travis 提供的配置是 7.5GB 内存、2 核心 CPU、18GB 硬盘,不限制运行时间。因此编译时可以开启 make -j4 四线程编译来提高速度。
首先到 https://travis-ci.org/ 用 GitHub账号登录,然后开启你放 Dockerfile 仓库的自动构建功能。

然后在 Settings 页面添加你的 Docker Hub 账户的用户名密码到环境变量,这样后续你就不用在自动构建配置中明文保存密码了。

然后创建一个名为 .travis.yml 的文件到 git 仓库的根目录,这就是 Travis 的 “Dockerfile”,保存你的自动构建指令。
.travis.yml 的语法较复杂,你可以在我的 .travis.yml 的基础上作修改。我的 .travis.yml 可以在 https://github.com/xddxdd/dockerfiles/blob/master/.travis.yml 看到。
如果需要更复杂的修改,可以阅读 Travis 的官方文档自行思考。
编辑 .travis.yml 完成后,把它提交到 GitHub 上,Travis 就会自动开始构建你的镜像,把它们 push 到 Docker Hub 上,并且发邮件告诉你自动构建的情况。



只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2018-11-24 14:50 来自手机 | 显示全部楼层
docker确实是好东西
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2018-11-24 14:52 | 显示全部楼层
这家伙厉害了,可以做好多事,今天周末,刚刚把N1刷成了coreelec
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2018-11-24 15:03 | 显示全部楼层
本帖最后由 鲲翔 于 2018-11-24 15:15 编辑

其实制作镜像非常简单,docker官方提供了一个免费的vps给你用,只是有时间限制,每一次运行在2小时内,如果需要编译的话可能就不够,如果只是安装程序,那是绰绰有余。不过有个限制,代码必须开源,如果不想开源,则在自己机器上编译好上传上去。
下面来说说官方的免费vps用法,首先在hub.docker.com注册一个账号,账号注册问题请自显神通,不讨论。然后注册一个github账号,我们要构建镜像的代码放在github上的。将docker账号和github账号关联。下面就可以试试创建一个镜像了



进去后选择你的代码目录


好了,后面填上详细信息。它就在后台自动创建了。


只是建立aarch64的镜像要注意,你的底包也要是aarch64的,然后还要构建交叉编译的环境,这个上面那位大神有示例,建立一个hooks文件夹,并放入相应代码就好了。
https://github.com/xddxdd/docker ... 7ab11/nginx/arm64v8


不知道怎么写构建的代码怎么办?很简单,抄别人的。
比如我要做个aarch64的迅雷镜像,我就看看别人怎么做的。
先搜xware,找自动构建的,自动构建的必须开源,所以我可以看别人的。




把这个存为自己的Dockerfile就行了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2018-11-24 15:29 | 显示全部楼层
先收藏了,坐等更新
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2018-11-25 01:33 | 显示全部楼层
想请问一下楼主,怎么用vnc来控制coreelec?需要装什么插件吗?还是直接运行vnc输入ip就可以呢?谢谢。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2018-11-25 09:59 | 显示全部楼层
看第二幅图,装上aml-vnc就行了。
还可以插键盘,按printscr键截图,存在screanshot文件夹下。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2018-11-25 22:30 | 显示全部楼层
哈哈,十分感谢楼主,成功了。这下折腾起来,方便了许多啊。哈哈哈

再次感谢!

另外,请教一下楼主,coreelec下是否有好的手机投屏的解决方案?主要是iphone使用,像安卓盒子里的乐播投屏似的就好。kodi-service里自带的airplay,貌似只能在播放视频时使用,图片什么的不行。
谢谢!
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2018-11-25 23:15 | 显示全部楼层
这个不知道,我没仔细研究coreelec,你上libreelec论坛看看。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2018-11-26 15:57 | 显示全部楼层
也就是除了android以外,这个LibreELEC可以开启n1的图形加速?

本来我也兴致勃勃的安装了armbian,结果发现不管是x还是wayland都不能使用图形加速,很慢很慢。

想驱动所有硬件还是得android。我现在在研究android下安装一些服务

点评

对,我不敢说是唯一,但是就我知道的就只有它。 而且它还提供了docker,可玩性方面没什么问题。  详情 回复 发表于 2018-11-27 00:33
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2018-11-26 16:10 | 显示全部楼层
思考了。感谢分享
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2018-11-26 19:02 | 显示全部楼层
为什么我连不上corelec 的插件库?
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2018-11-27 00:33 | 显示全部楼层
jarryson 发表于 2018-11-26 15:57
也就是除了android以外,这个LibreELEC可以开启n1的图形加速?

本来我也兴致勃勃的安装了armbian,结果 ...

对,我不敢说是唯一,但是就我知道的就只有它。
而且它还提供了docker,可玩性方面没什么问题。

点评

貌似yangxuan82大神编译的librelect播放4k视频还有些问题吧。 所以,目前来看,对于N1图形硬件支持的最好的,也就是coreelect了。 之前学习到的,libreelect和coreelect最大的区别就是前者用的是kodi17.6,后者  详情 回复 发表于 2018-11-27 11:02
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2018-11-27 11:02 | 显示全部楼层
鲲翔 发表于 2018-11-27 00:33
对,我不敢说是唯一,但是就我知道的就只有它。
而且它还提供了docker,可玩性方面没什么问题。

貌似yangxuan82大神编译的librelect播放4k视频还有些问题吧。
所以,目前来看,对于N1图形硬件支持的最好的,也就是coreelect了。

之前思考到的,libreelect和coreelect最大的区别就是前者用的是kodi17.6,后者用的kodi 18 beta。。。。但貌似现在连libreelect也用kodi 18 beta了。。。这么看来,就没什么显著性区别了

不知我上面理解的是不是正确的。呵呵
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /2 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2026-8-23 17:40

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 电话:13506125623

快速回复 返回顶部 返回列表