怎样制作一个arm架构docker镜像

如果你现在工作在一个arm 架构的服务器,生成一个该架构下的docker镜像是比较顺其自然的事情,可是这里经常会有个矛盾,我们日常的工作平台,比如桌面电脑或服务器需要比较强的性能,通常采用x86架构,把生成的docker镜像跑在一些不需要很强性能的arm服务器上,长期提供一些服务,x86工作平台默认只能运行该架构下的基础镜像,无法直接运行arm架构组件。

实现在x86平台运行arm程序的基本思路是利用模拟器,涉及的原理和过程比较复杂,本人没有相关的深厚理论基础,无法讲深讲透,只分享一下怎么在操作上实现。

1、安装qemu-arm运行环境

QEMU是一个处理器模拟软件,可以用来在一个平台中模拟其他操作系统架构,如在PC中实现ARM、MIPS等多种架构的软硬件运行环境。QEMU主要有两种模拟模式:
System模式中,它可以在一个主机环境中虚拟不同的虚拟计算机系统,比如可以在Ubuntu系统中虚拟出一个MIPS架构的Debian系统。
User模式中,它可以运行一个为其他处理器编写的应用程序,比如可以在X64-Ubuntu系统中直接运行一个MIPS-Linux的应用程序。

1.1 所以,我们需要安装一个可以模拟arm平台的系统环境,使用ubuntu的基础系统,可以非常方便地实现一条命令完成相关功能的安装,不需要以前采用原码编译等。

apt-get install qemu-user-static

这条命令安装了一个用户模式的arm模拟器,可以通过qemu-arm等命令方式运行arm指令。

1.2 在linux内核启用binfmt模式,让linux直接识别arm指令并调用arm模拟器来运行该指令。

qemu的基本原理是将arm 指令翻译成x86命令,再由宿主系统,如linux来执行翻译出来的指令,最终成功运行arm。这个过程本来没有什么问题,就是每次运行arm指令需要通过明确指定通过qemu-arm来运行,麻烦一些。其实linux内核有binfmt模式,通过该模式,在系统内核注册arm指令,这样系统遇到arm指令能识别并自动调用qemu-arm来运行它。

apt-get install binfmt-support

2、运行一个arm架构基础容器

这样做的意图是通过这个基础容器,直接建立一个较为纯粹的arm工作环境,不用考虑各种arm架构的库和依赖,避免直接在宿主机执行docker构建的各种操作,减少因依赖等问题导致的失败。

docker pull docker.io/arm64v8/ubuntu:20.04

docker images

docker run -it e784f03641c9

通过以上命令,我们就在x86的ubuntu系统上运行了一个arm内核架构的dcoker容器。

3、将配置好的arm架构docker 容器导出为arm架构容器

进入创建好的ubuntu容器,直接在其中安装必要的功能,其中所有的安装都将基于其arm架构,可以保证容器中是一个干净的arm环境。

docker exec -it xxxxxxx bash

将搭建好的容器导出为arm架构docker镜像

docker export -o test.tar a7db52903c32

这样将得到一个.tar的arm架构docker 镜像文件,将该文件传递到其它arm平台,导入系统将正常运行。

Docker容器一次更新多个动态域名

动态域名的地址更新要用到客户端,试过多种形式的客户端发现都不好用,总结起来,常用的客户端有以下几个:

1、Linux等系统下的脚本

2、某些系统自带的专有工具、插件等

3、桌面系统的应用程序

这些工具表现的问题主要j :

有的是一次只能更新一个域名,多个域名需要设置多个任务,或者有的工具仅内置了较少的几个DDNS服务商,自己的服务可能不在其中,或者要安装专门的程序,手动运行不方便,自动运行耗资源。特别是多数客户端没有配置的详细说明,设置好运行不起来,无法正常更新。

经过多次比较,采用Docker容器方式能较好地解决以上问题,几乎不需要太多额外的设置,容器以极低的资源消耗常驻后台运行,可以任意设置地址检查和更新时间间隔。

1、从DockerHub中下载镜像

2、创建一个配置文件,按文档说明填入域名更新的配置信息

每个镜像关于配置都有详细的说明和示例,只要认真阅读,非常容易就能正确配置好。

3、启动容器,映射以上配置文件,系统即自动运行,其他参数可以全部默认,如果有需要可以研究一下镜像的说明文档,按要求进行修改即可。

Chevereto图床Docker安装中要注意的问题

想用MarkDown写文章,插入图片不好解决,注册一个网络图床太麻烦,以后总是多一个帐号去维护,考虑自己在NAS中建立图床,先在网络上找了一下关于Docker条件下安装的方法,然后选择Chevereto进行安装配置,结果踩了一个大坑,浪费了半天时间。

为图方便按网络教程做好了images文件、.htaccess配置文件的映射,同时考虑以后直接在NAS修改docker中的内容,不用SSH,把整个/var/www/html中的app文件夹也映射出来了,启动容器运行,直接出现以下错误:

没有办法,再去网络上找答案,绝大多数人都说是apache2.conf文件的配置问题,按照方法做了多次修改根本没有用,只看到一遍文章讲到是该站点下缺少.htaccess文件,打开映射好的.htaccess配置文件,发现是空文件,照道理容器运行成功应该自动生成该文件,显然该文件出了问题,在网络上找了一个配置文件写入,错误成功克服,再次运行容器,另一个错误又来了。

网络上找不到类似问题,回过头看官方文档,发现文档中只有images卷的映射建议,因此把app的映射删除了,成功解决问题。

第二天为搞清问题的根源,仔细查看了网站下的各种php文件,并做了故障复现,虽然不会apache编程,但思路还是知道了大概,软件的作者不允许将app等文件及相关文件夹映射出来,有专门的检查语句,一旦查到问题会给出相应的错误提示,如将/var/www/html/整个文件夹映射出来的错误是:

经验教训:

1、尽量不要先入为主,遵从官方文档比较好

以前建各种应用的容器,基本都可以随便映射各种文件,但这次不行,作者专门设置了映射禁止,可能是为了保护站点下的文件完整性吧,防止意外错误。

2、网络上的教程要善于辨别不同的情况,少走弯路

以前的版本不知道,但新的1.3版肯定是不宜进行其他文件和文件夹的映射,按照官方文档建立容器,几分钟就可以完好运行,又说回第1 点了,后台查看.htaccess文件自动成功改写。因为一旦出现错误,解决起来是非常耗时耗力的。

另外,容器运行的日志显示有错误, AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 172.17.0.x. Set the ‘ServerName’ directiv ,服务器域名问题,内网使用,不用修复,错误可以在运行一段时间后自动消失。