前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零构建 Docker 镜像 | 申威下从零构建 debian 并打包为 docker

从零构建 Docker 镜像 | 申威下从零构建 debian 并打包为 docker

作者头像
宋天伦
发布2023-10-20 13:03:49
1K0
发布2023-10-20 13:03:49
举报
文章被收录于专栏:frytea

本文 首发于 🌱 煎茶,请注明 来源。 debootstrap 是一个可以快速获得基本 Debian 系统的一个工具, 你可以将 Debootstrap 看作是一种特殊的安装工具. 她不同于 Debian Installter , 不需要安装用的CD/DVD ISO, 仅需连接到 Debian 软件仓库, 软件仓库简介(英文) . 无论你是否使用 Debian , 只要是任何的 Linux/GNU 发行版, 例如 Fedora/Gentoo/Arch/OpenSUSE, 甚至是 Ubuntu , 均可运行 debootstrap .

申威 CPU 是从指令集(派生自 Alpha )层面就是自成体系,区别于当前主流的 X86 架构或是 Arm 架构,故当前人们常用的软件均无法直接在申威架构CPU上使用,必须基于源码重新编译、移植甚至重新适配开发。

我在此前分别撰文介绍了申威环境下的 Docker 编译安装(《申威(神/声)(SW)1621 + UOS 20 编译安装 Docker | 容器国产化适配》)以及基于 busybox 制作申威下可用 Docker 镜像的方法(《从零构建 Docker 镜像 | 基于 busybox 制作 | 深入理解 Docker 镜像构建》)。基于前面两种方法只是可以跑起来 Docker 并测试其容器运行状态,还并不能承担真实业务,因此本文介绍一种使用 Debian 提供的 debootstrap 工具自行制作 rootfs(也可理解为最小化 debian )的方法。

基于这个镜像,就可以去自行构建实际使用的镜像了。

根据申威论坛的说法,当前申威平台 『Deepin UOS 上 debootstrap 可用』

环境说明#

  • OS: UOS 20 1021 12011.101
  • CPU: SW_64 SW1621

制作方法#

首先为当前执行的系统安装 debootstrap 工具:

代码语言:javascript
复制
sudo apt-get install debootstrap

如果您的 UOS 或 deepin 能够正常使用,软件源配置正常,应该可以直接安装该工具,之后使用该工具生成最小 debian 系统。

代码语言:javascript
复制
# 首先准备一个目录
mkdir rootfs-debian
# 执行下面命令在该目录下构建最小系统
sudo debootstrap --no-check-gpg eagle ./rootfs-debian  http://sh-packages.chinauos.com/desktop-professional/1010

以上命令是我在我的环境下使用的命令,不同的操作系统可能会有所不同。

执行后我得到了一个形如这样的目录结构,其中填充了必要的软件包:

代码语言:javascript
复制
$ tree rootfs-debian/ -d -L 1
rootfs-debian/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

18 directories

命令说明#

对于 debootstrap 命令的使用方法,详见 man,下面简单介绍一下:

代码语言:javascript
复制
# 整个 debootstrap 的命令结构如下
debootstrap --arch <ARCH> <VERSION> <DIRECTORY>  <MIRROR>
# ARCH: 目標系統的 CPU 架構,常用的有 i386、amd64、armel、armhf 等,SW_64在 UOS 下无需指定,会自动判断。
# VERSION: Debian 的版本
#    可以使用稳定版本(wheezy)、永远的测试版(sid)、更不稳定的(testing)等,详见 Debian 官网。
# DIRECTORY: 安装的目录,根据自己的需求设定
# MIRROR: 下载 Debian 套件的软件源服务器,申威+UOS 需要特别提供该组合软件源的服务地

我在制作初期遇到的两个问题分别是:

  • arch 不知道如何指定,根据 /proc/cpuinfo 来看应该是 SW_64
  • 找不到可用的镜像源。

先来说说 arch 的指定,使用 arch 命令看架构名称是 sw_64

代码语言:javascript
复制
user@user-SW:~$ arch
sw_64

后面与厂商沟通了解到 UOS 或 deepin 下该参数可省略,因为 debootstrap 会自动去获取宿主及平台作为目标平台。

之后的比较困难的是 <VERSION><MIRROR> 部分,通过查看 /etc/apt/sources.list ,了解到我的环境下系统代号为 fou ,但是使用该代号找不到对应执行脚本。后来发现 UOS 桌面版代号为 eagle ,使用这个代号暂时可用。

软件源 部分,这一点比较关键, deboostrap 可以创建基本的 rootfs 目录架构,但是真的要跑起来就需要将必要的软件包填充进去,因此必须要找到支持我们的 CPU 架构和对应版本代号的软件源仓库才行,关于这一点,我在申威论坛找到了一篇帖子,内容可以参考:

代码语言:javascript
复制
UOS-SW-公网仓库

桌面

1.101x仓库地址:
deb http://sh-packages.chinauos.com/desktop-professional/1010 eagle main contrib non-free
2.102x仓库地址:
deb http://sh-packages.chinauos.com/desktop-professional/1020 eagle/sp2 main contrib non-free
3.103x仓库地址:
deb http://sh-packages.chinauos.com/desktop-professional/1032 eagle/sp3 main contrib non-free
4.104x仓库地址:
deb http://sh-packages.chinauos.com/desktop-professional/1040 eagle/sp4 main contrib non-free

服务器:

1.deepin15.4仓库地址:
deb http://sh-packages.chinauos.com/server-enterprise-bd fou/sp1 main contrib non-free
2.101x仓库地址:
deb http://sh-packages.chinauos.com/server-enterprise-710 fou/sp1 main contrib non-free
3.102x仓库地址:
deb http://sh-packages.chinauos.com/server-enterprise/1020 fou/sp2 main contrib non-free
4.1030仓库地址(B1-3):
deb http://sh-packages.chinauos.com/server-enterprise/1030 fou/sp3 main contrib non-free
5.1030仓库地址(B4-5版本使用:查看cat /etc/product-info 时间为7月17日后的):
deb http://sh-packages.chinauos.com/server-enterprise/1032 fou/sp3 main contrib non-free
6.1040仓库地址:
deb http://sh-packages.chinauos.com/server-enterprise/1040 fou/sp4 main contrib non-free

实测在我的环境下必须使用 http://sh-packages.chinauos.com/desktop-professional/1010 这个源才可,其他的均出现找不到对应 Release 文件的问题。

如果你跟我遇到一样的问题,只需要确定 arch 和版本代号后把这些仓库地址挨个试一下,都是申威的仓库应该问题不大,况且当前最大的问题是先跑起来。

制作 Docker#

如果上面的过程没有问题,现在你就拥有了一个最小文件系统,下面基于此制作一个 docker 镜像并运行,后面可以基于该镜像制作业务容器。

代码语言:javascript
复制
# 打包并导入docker
sudo tar --numeric-owner -cpf rootfs-debian.tar -C rootfs-debian .
sudo cat rootfs-debian.tar | sudo docker import - base-debian

# 尝试运行
sudo docker run -i -t base-debian /bin/bash

使用这个方法制作的镜像体积相比于直接打包当前系统要小很多:

代码语言:javascript
复制
$ sudo docker images                                                                                      
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
uos-eagle                    latest              1caa81ad354b        22 hours ago        399MB
curos                        latest              1113e49df40d        5 days ago          4.26GB

上面是我分别直接打包系统和使用 deboostrap 制作的镜像,打包系统的镜像达到了 4.26GB ,压缩后也要 1G+,使用工具制作的系统仅有 399MB,相比来看已经小了很多。使用该方法制作的镜像体积已经有了比较大的改善,但还是无法比肩官方给出的基础镜像,后面还可以指定排除元素的方式进一步精简,这是下一步需要做的事情了。

之所以非要打包系统作镜像,是因为所需要的业务是使用 perl 脚本语言写成,其运行必须依赖操作系统运行环境。通过这次探索,我也对人们常说的『go是云原生时代的语言』有了体会。因为 go 默认就是静态编译,只需要再加几个参数把依赖的底层组建也编译进来,打包时直接使用 scratch 镜像从零构建,完全不需要使用操作系统基础镜像,出来的体积就是惊人的小了。

至此,本文结束,若有问题请留言,需要探索的还有很多。

参考文献#

注:本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境说明#
  • 制作方法#
  • 命令说明#
  • 制作 Docker#
  • 参考文献#
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档