Docker简介

从操作系统诞生之日起,虚拟化技术就不断的演进与发展,结合目前云原生的发展态势,容器无疑是其中的重要一环。

Docker是一个开源的软件项目,可以在Linux操作系统上提供一层额外的抽象,让用户程序部署在一个相对隔离的运行环境,并提供自动管理机制。

需要额外指出的是,Docker并不等于容器(containers),Docker只是容器的一种,其他种类的容器还有Kata container,Rocket container等。

编译环境搭建

准备一个可以运行Docker的虚拟机操作系统,推荐ubuntu或者openEuler的发行版。

搭建环境[1]:在ubuntu虚拟机上执行以下步骤,下载OpenAtom OpenHarmony(简称“OpenHarmony”)的源码并部署Docker编译环境。

1、安装gitee repo工具[2]

mkdir ~/bin
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo
chmod a+x ~/bin/repo
pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests

  

2、获取OpenHarmony源码

(1)在ubuntu虚拟机上创建源码目录:

mkdir /home/openharmony
cd /home/openharmory

  

(2)使用repo命令获取OpenHarmony v3.2 release源码:

repo init -u git@gitee.com:openharmony/manifest.git -b OpenHarmony-3.2-Release --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'

  

以上步骤完成后,可以获取到OpenHarmony编译所需的完整的源码,代码目录结构如下图所示:

3、获取Docker编译环境

独立Docker编译环境,适用于编译轻量和小型系统/标准系统.[3]

(1)获取OpenHarmony Docker编译镜像

docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0

  

此Docker编译环境较大,请耐心等待下载完成。

(2)进入源码根目录,启动并进入Docker编译环境。执行以下命令:

cd /home/openharmory
docker run --name ohos_build -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0

  

命令参数说明:

-v X:Y 将宿主机的X目录挂载到容器的Y目录下。

将当前源码所在目录,挂载到容器编译环境的/home/openharmony目录下。

(3)安装编译依赖

通过步骤(2)进入容器的shell后,切换到/home/openharmony路径,执行脚本下载OpenHarmony编译所依赖的组件:

cd /home/openharmony
./build/prebuilts_download.sh

  

此处需要下载的编译依赖较多,请耐心等待下载完成。

至此OpenHarmony Docker编译环境准备完毕,在执行编译动作之前,需要完成OpenHarmony kernel特性的修改,否则Docker无法在OpenHarmony系统上正常运行。

kernel配置修改

如何判断源码使用默认配置编译后生成的kernel是否满足Docker的运行依赖呢?开源社区存在检查工具,可以帮助我们完成这个任务,大家可以自行获取此工具[4] 。

在此我们直接进入kernel配置的修改环节。

1、修改OpenHarmony kernel配置文件,开启Docker运行所依赖的内核功能。

需要修改的配置文件位置如下:

kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig

  

针对kernel特性的修改,主要是开启OpenHarmony内核中namespace、cgroup、network、overlay filesystem等功能。在配置文件的末尾追加以下内容:

# add for Docker
CONFIG_POSIX_MQUEUE=y
CONFIG_SCHED_WALT=y
CONFIG_PSI=y
CONFIG_PAGE_COUNTER=y
CONFIG_CGROUP_BPF=y
CONFIG_MEMCG_KMEM=y
CONFIG_MEMCG_SWAP_ENABLED=y
CONFIG_BLK_CGROUP=y
CONFIG_BLK_DEV_THROTTLING=y
CONFIG_RT_GROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_NET_CLS_CGROUP=y
CONFIG_BPF_SYSCALL=y
CONFIG_BINFMT_MISC=y
CONFIG_TLS=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
CONFIG_INET_ESP=y
CONFIG_IPV6_MIP6=y
CONFIG_IPV6_MULTIPLE_TABLES=y
CONFIG_IPV6_MROUTE=y
CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
CONFIG_NF_CONNTRACK=y
CONFIG_NETFILTER_XT_MARK=y
CONFIG_NETFILTER_XT_SET=y
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=y
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
CONFIG_NETFILTER_XT_MATCH_IPVS=y
CONFIG_NETFILTER_XT_MATCH_CGROUP=y
CONFIG_IP_SET=y
CONFIG_IP_SET_HASH_IP=y
CONFIG_IP_SET_HASH_NET=y
CONFIG_IP_VS=y
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_RR=y
CONFIG_IP_VS_WRR=y
CONFIG_IP_VS_SH=y
CONFIG_IP_NF_MATCH_STATE=y
CONFIG_IP_NF_MATCH_LIMIT=y
CONFIG_IP_NF_TARGET_LOG=y
CONFIG_NF_NAT=y
CONFIG_IP_NF_FTP=y
CONFIG_IP_NF_TARGET_REDIRECT=y
CONFIG_IP_NF_CONNTRACK=y
CONFIG_IP_NF_IRC=y
CONFIG_IP_NF_NAT=y
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_TARGET_MASQUERADE=y
CONFIG_BRIDGE=y
CONFIG_BRIDGE_NETFILTER=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_STREAM_PARSER=y
CONFIG_DRIVERS_HDF_LIGHT=y
CONFIG_HYPERHOLD=y
CONFIG_HYPERHOLD_DEBUG=y
CONFIG_HYPERHOLD_ZSWAPD=y
CONFIG_HYPERHOLD_FILE_LRU=y
CONFIG_HYPERHOLD_MEMCG=y
CONFIG_ZRAM_GROUP=y
CONFIG_ZRAM_GROUP_DEBUG=y
CONFIG_ZLIST_DEBUG=y
CONFIG_ZRAM_GROUP_WRITEBACK=y
CONFIG_REGMAP_SPI=y
CONFIG_MACVLAN=y
CONFIG_VXLAN=y
CONFIG_AUFS_FS=y
CONFIG_VETH=y
CONFIG_DRM_DW_HDMI_I2S_AUDIO=y
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_PCM_ELD=y
CONFIG_SND_PCM_IEC958=y
CONFIG_SND_DMAENGINE_PCM=y
CONFIG_SND_HWDEP=y
CONFIG_SND_SEQ_DEVICE=y
CONFIG_SND_RAWMIDI=y
CONFIG_SND_JACK=y
CONFIG_SND_JACK_INPUT_DEV=y
CONFIG_SND_PCM_TIMER=y
CONFIG_SND_HRTIMER=y
CONFIG_SND_DYNAMIC_MINORS=y
CONFIG_SND_MAX_CARDS=32
CONFIG_SND_PROC_FS=y
CONFIG_SND_VERBOSE_PROCFS=y
CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQ_DUMMY=y
CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
CONFIG_SND_SEQ_MIDI_EVENT=y
CONFIG_SND_SEQ_MIDI=y
CONFIG_SND_DRIVERS=y
CONFIG_SND_HDA_PREALLOC_SIZE=64
CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y
CONFIG_SND_SOC=y
CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
CONFIG_SND_SOC_ROCKCHIP=y
CONFIG_SND_SOC_ROCKCHIP_I2S=y
CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y
CONFIG_SND_SOC_ROCKCHIP_PDM=y
CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
CONFIG_SND_SOC_ROCKCHIP_SPDIFRX=y
CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y
CONFIG_SND_SOC_ROCKCHIP_RT5645=y
CONFIG_SND_SOC_ROCKCHIP_HDMI=y
CONFIG_SND_SOC_DUMMY_CODEC=y
CONFIG_SND_SOC_HDMI_CODEC=y
CONFIG_SND_SOC_ES7202=y
CONFIG_SND_SOC_ES7243E=y
CONFIG_SND_SOC_ES8311=y
CONFIG_SND_SOC_ES8316=y
CONFIG_SND_SOC_MAX98090=y
CONFIG_SND_SOC_RK3308=y
CONFIG_SND_SOC_RK3328=y
CONFIG_SND_SOC_RK817=y
CONFIG_SND_SOC_RK_CODEC_DIGITAL=y
CONFIG_SND_SOC_RL6231=y
CONFIG_SND_SOC_RT5616=y
CONFIG_SND_SOC_RT5640=y
CONFIG_SND_SOC_RT5645=y
CONFIG_SND_SOC_RT5651=y
CONFIG_SND_SOC_SPDIF=y
CONFIG_SND_SOC_TS3A227E=y
CONFIG_SND_SIMPLE_CARD_UTILS=y
CONFIG_SND_SIMPLE_CARD=y
CONFIG_ANDROID_PARANOID_NETWORK=y
CONFIG_ACCESS_TOKENID=y
CONFIG_F2FS_GRADING_SSR=y
CONFIG_OVERLAY_FS=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_CRYPTO_SEQIV=y
# end

  

2、修改OpenHarmony配置文件 build/ohos/images/build_image.py

添加Docker运行依赖的目录:'run', 'var', 'opt', 'usr'。

_dir_list = [
'config', 'dev', 'proc', 'sys', 'updater', 'system', 'vendor', 'data',
'chipset', 'storage', 'mnt', 'tmp', 'sys_prod', 'chip_prod',
'run', 'var', 'opt', 'usr'
]

  

3、修改OpenHarmony配置文件

base/security/selinux/sepolicy/base/system/file_contexts

添加以下内容:

/run                u:object_r:rootfs:s0
/var u:object_r:rootfs:s0
/opt u:object_r:rootfs:s0
/usr u:object_r:rootfs:s0
/lib u:object_r:rootfs:s0

  

至此准备工作结束,进入OpenHarmony系统编译环节。

OpenHarmony编译

本文以适配触觉开发板为例,对代码编译流程进行说明。

在OpenHarmony源码路径下,执行以下命令触发编译:

./build.sh --product-name rk3568 --ccache --jobs $(nproc)

  

编译正常结束后,产物存放在以下位置:

接下来就需要将目录下的产物拷贝到Windows环境,使用开发板厂商提供的烧写工具完成系统烧写。

说明:

清理编译路径下已生成的文件,可以执行命令:hb clean

命令会清理out路径下生成的文件。如果要重编内核,需要确认out/kernel路径被移除,然后重新触发编译即可。

烧写

烧录工作需要使用Windows环境,且依赖厂商提供的烧写工具及驱动助手[5]。

1、RK驱动助手

解压后需要执行DriverInstall.exe,完成安装,否则烧写工具无法识别到开发板。

2、AndroidTool烧写工具

解压后直接运行RKDevTool.exe,打开烧录操作界面,如下图所示:

烧录步骤做如下说明:

1)在瑞芯微开发工具界面,点击[设备分区表],读取设备分区;

2)按照设备分区的起始地址修改烧录项,导入前序步骤生成的img文件;

3)点击[执行]后进入系统烧录流程。

开发板完成烧录后,会自动进行重启。之后可以通过HDC调试工具登录OpenHarmony shell交互命令行,完成Docker的部署操作。

HDC调试工具

HDC(OpenHarmony Device Connector)[6] 是为开发人员提供的用于设备连接调试的命令行工具,该工具支持部署在Windows/Linux/Mac等系统上与OpenHarmony设备(或模拟器)进行连接调试通信。

工具可以通过OpenHarmony官方的每日构建dailybuilds[7] 或发布的SDK[8] 中获得,根据使用的系统平台到相应的toolchains目录下提取。

以SDK为例,解压后HDC工具路径如下:


ohos-sdk\windows\toolchains-windows-x64-3.2.11.9-Release.zip\toolchains\

  

HDC工具的基本使用方法:(在Windows PowerShell中执行命令)

# 进入调试shell
> .\hdc.exe shell
# 文件拷贝,从openharmony系统下载文件至Windows的当前目录下:
> .\hdc.exe file recv /data/xxxx .
# 文件拷贝,从windows环境上传文件到openharmony的/data目录下:
> .\hdc.exe file send .\testfile /data/

  

Docker环境配置

历经坎坷,终于到了最后一步Docker部署的环节。通过HDC工具连接到触觉开发板之后,执行以下步骤。

1、执行脚本修改跟目录的读写权限。脚本内容如下:

#!/bin/sh
#remount / to rw property
mount -o remount -rw /
#mount cgroup
mount -t tmpfs -o rw,nosuid,nodev,noexec,mode=755 tmpfs /sys/fs/cgroup
#create related folder
cd /sys/fs/cgroup
mkdir pids cpuset blkio cpu,cpuacct memory devices net_cls,net_prio perf_event
#mount files related cgroup
mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,pids cgroup /sys/fs/cgroup/pids
mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,cpuset cgroup /sys/fs/cgroup/cpuset
mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,blkio cgroup /sys/fs/cgroup/blkio
mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,cpu,cpuacct cgroup /sys/fs/cgroup/cpu,cpuacct
mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,memory cgroup /sys/fs/cgroup/memory
mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,devices cgroup /sys/fs/cgroup/devices
mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,net_cls,net_prio cgroup /sys/fs/cgroup/net_cls,net_prio
mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,perf_event cgroup /sys/fs/cgroup/perf_event
mount -n -t cgroup -o rw,nosuid,nodev,noexec,relatime,freezer cgroup /sys/fs/cgroup/freezer

  

2、部署Docker静态可执行文件

下载Docker静态可执行文件,当前选用的是20.10.21版本 [9]。

使用HDC工具将下载的压缩包上传至触觉开发环境并解压,将解压目录下的文件全部拷贝到/system/bin目录下即可。解压后目录结构如图所示:

3、创建Docker运行所需的目录及配置文件

mkdir /system/etc/docker
mkdir /var/run

  

创建/system/etc/docker/daemon.json文件,并添加以下文件内容

{
"registry-mirrors":["https://veotnqhz.mirror.aliyuncs.com","https://hub-mirror.c.163.com", "https://mirror.baidubce.com"],
"data-root":"/data/data/dockerdir"
}

  

4、添加库别名

由于Docker运行时使用的库与OpenHarmony环境存在的库名称不同,需要创建一个软链接别名。

ln -s /lib/ld-musl-arm.so.1 /lib/ld-musl-armhf.so.1

  

5、手动拉起Docker的服务进程

# 拉起dockerd守护进程
dockerd -D -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock &

  

6、验证Docker基本功能

# 判断docker命令可以正常执行
docker --verison
# 判断docker命令可以正常拉取、运行远端镜像(前提是网络可用)
docker run hello-world

  

至此OpenHarmony上Docker的基本功能已经实现,大家可以尝试导入或部署自己的Docker应用。

参考链接

[1] https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md

[2]

https://gitee.com/help/articles/4316#article-header0

[3]

https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/gettools-acquire.md

[4]

https://github.com/moby/moby/blob/master/contrib/check-config.sh

[5]

https://www.t-firefly.com/doc/download/107.html

[6]

https://gitee.com/openharmony/developtools_hdc

[7]

http://ci.openharmony.cn/dailys/dailybuilds

[8]

https://repo.huaweicloud.com/harmonyos/os/3.2-Release/ohos-sdk-windows_linux-public.tar.gz

[9]

https://download.docker.com/linux/static/stable/aarch64/docker-20.10.21.tgz

OpenHarmony Docker移植实践的更多相关文章

  1. 【实战】Docker入门实践二:Docker服务基本操作 和 测试Hello World

    操作环境 操作系统:CentOS7.2 内存:1GB CPU:2核 Docker服务常用命令 docker服务操作命令如下 service docker start #启动服务 service doc ...

  2. docker简易实践

    docker简易实践 实验环境 操作系统:deepin 15.4 安装步骤 1.安装docker sudo apt-get install docker.io 2.启动docker服务 sudo se ...

  3. 这是一次 docker 入门实践

    前言 其实接触 docker 也有一段时间了,但是一直没有做下总结,现在网上关于 docker 的介绍也有很多了,本着好记性不如烂笔头的原则,还是自己再记录一波吧. 实现目标 安装 docker ce ...

  4. docker最佳实践-----美团点评的分享

    美团点评容器平台简介 本文介绍美团点评的Docker容器集群管理平台(以下简称“容器平台”).该平台始于2015年,是基于美团云的基础架构和组件而开发的Docker容器集群管理平台.目前该平台为美团点 ...

  5. 项目中docker swarm实践

    docker swarm 集群服务通信 前置要求 服务需要在同一个docker swarm集群中 服务需要处于同一个overlay网络上 服务需要暴露容器端口 有2个以上服务名不同的服务 服务部署流程 ...

  6. CI Weekly #9 | 揭秘阿里 Docker 化实践之路

    2017年悄然而至,对 flow.ci 你有什么新的期待呢?新的一年,flow.ci会越来越强大好用,希望继续得到你的支持与反馈.最近,我们做了如下的「功能优化」与「问题修复」,看看有没有你想要的: ...

  7. Docker 初级实践

    Docker 应用 优势 与虚拟相比Docker更加轻量高效,更加方便移植.虚拟机提供的是完整的操作系统环境,包含了大量类似硬件驱动.虚拟处理器.网络接口等等并不需要的信息,也需要比较长时间的启动,同 ...

  8. CI Weekly #17 | flow.ci 支持 Java 构建以及 Docker/DevOps 实践分享

    这周一,我们迫不及待写下了最新的 changelog -- 项目语言新增「Java」.创建 Java 项目工作流和其它语言项目配置很相似,flow.ci 提供了默认的 Java 项目构建流程模版,快去 ...

  9. Docker 入门实践

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:张戈 导语 本文从新手视角记录了一个实际的Dokcer应用场景从创建.上传直到部署的详细过程,并简单的介绍了腾讯云容器服务的使用方法 ...

  10. docker 网络实践

    #docker 网络模式 环境 centos7. , Docker version -ce docker自带网络类型 bridge,host,none,container,overlay,macvla ...

随机推荐

  1. 07-Redis系列之-双写一致性,缓存详解和优化点

    双写一致性 双写一致性指的是当我们更新了数据库的数据之后redis中的数据也要同步去更新. redis和mysql数据同步方案 先更新缓存,再更新数据库(然并软...) 先更新数据库,再更新缓存(一般 ...

  2. 2.Go 的指针

    Go的指针 1. 变量内存地址 var age = 18 // & + 变量 = 变量内存地址 fmt.Println("age:",&age) 2. 指针变量 / ...

  3. 【Azure 应用服务】使用Docker Compose创建App Service遇见"Linux Version is too long. It cannot be more than 4000 characters"错误

    问题描述 使用Docker Compose方式合并多个镜像(Images)文件,然后部署到App Service中,结果失败.报错 Linux Version 太长,不能超过4000个字符. 错误消息 ...

  4. 【Azure 应用服务】本地Git部署Java项目到App Server,访问无效的原因

    问题描述 在App Server的部署中心配置好本地Git 仓库 并推送 git push azure master 分支代码到服务器时,并未发生错误 ,但是服务异常,无法访问到正确的项目文件,始终打 ...

  5. magic book

    magic book.md body { font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFo ...

  6. [程序] C++实现 http和https的反向代理程序

    目录 前言 代理原理 http代理 https代理 实现 客户端 服务端 遇到的所有问题记录 Python对于回复不响应 接受的数据只有4字节 最终数据已经发给Python了 但是Python还是阻塞 ...

  7. Java 多线程------解决 实现继承 Thread类 方式线程的线程安全问题 方式二:同步方法

    1 package bytezero.threadsynchronization; 2 3 4 5 /** 6 * 使用同步方法解决实现 继承 Thread类 的线程安全问题 7 * 8 * 9 * ...

  8. 安卓开发基础适配器,SimpleAdapter 快速演示

    第一,主视图如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns: ...

  9. 剑桥英英在线词典 - 可以查单词 可数-不可数 - 英语 a few/few/a little/little

    There is _____ milk in a fridge. Let's go buy some. A. a few B. few C. a little D. little 解析:经典老知识点 ...

  10. Java | zuul 1.x 是如何实现请求转发的

    zuul 1.x 是如何实现请求转发的 文档写的再好,也不如源码写的好 源码地址: GitHub: https://github.com/Netflix/zuul Gitee: https://git ...