如何制作一个基础镜像

我们在适配特殊CPU架构的软件的时候,有时,需要构建基础镜像,标准架构dockerhub上一般都提供了官方的基础镜像;

有时我们需要个性化定制自己的基础镜像,这时也需要重新制作。这里介绍几个制作方法。

Moby

克隆docker工程

docker官方已经提供了制作base image的脚本,这里使用moby提供的脚本 – moby/contrib/

1
2
3
4
5
6
7
git clone https://github.com/moby/moby
Cloning into 'moby'...
remote: Enumerating objects: 265639, done.
remote: Total 265639 (delta 0), reused 0 (delta 0), pack-reused 265640
Receiving objects: 99% (265640/265640), 137.75 MiB | 3.05 MiB/s, done.
Resolving deltas: 99% (179885/179885), done.
Checking out files: 99% (5508/5508), done.

确认 debootstrap 已安装

1
2
3
4
5
6
root@node1:~# apt install debootstrap
Reading package lists... Done
Building dependency tree
Reading state information... Done
debootstrap is already the newest version (1.0.95ubuntu0.5).
0 upgraded, 0 newly installed, 0 to remove and 90 not upgraded.

debian

mkimage.sh

1
2
3
4
5
6
7
8
root@node1:~/peng/moby-master/contrib# ./mkimage.sh --help
usage: mkimage.sh [-d dir] [-t tag] [--compression algo| --no-compression] script [script-args]
ie: mkimage.sh -t someuser/debian debootstrap --variant=minbase jessie
mkimage.sh -t someuser/ubuntu debootstrap --include=ubuntu-minimal --components=main,universe trusty
mkimage.sh -t someuser/busybox busybox-static
mkimage.sh -t someuser/centos:5 rinse --distribution centos-5
mkimage.sh -t someuser/mageia:4 mageia-urpmi --version=4
mkimage.sh -t someuser/mageia:4 mageia-urpmi --version=4 --mirror=http://somemirror/

build the image

1
root@node1:~/peng/moby-master/contrib# ./mkimage.sh -t liupeng0518/debian debootstrap --variant=minbase jessie

Test

Verify that images is imported.

1
$ docker images

Run a test docker instance

1
2
3
4
docker run -t -i --rm stafwag/debian_i386:stretch /bin/sh
# cat /etc/debian_version
9.8
#

centos

1
./mkimage-yum.sh centos

arch

*bootstrap

debootstrap – debian系制作工具
febootstrap – fedora系制作工作

这里演示debootstrap如何制作

debootsrap

1
2
3
4
5
6
root@node1:~/peng# debootstrap --verbose --include=iputils-ping --arch amd64 bionic chroot-bionic http://ftp.ubuntu.com/ubuntu/

...
I: Configuring ca-certificates...
I: Configuring initramfs-tools...
I: Base system installed successfully.

kylin arm64:

1
root@node1:~/peng# debootstrap --verbose --no-check-gpg --arch arm64 4.0.2sp2-server-ft2000 juniper http://archive.kylinos.cn/kylin/KYLIN-ALL/

自定义镜像

执行结束后,我们可以自定义镜像内容

Update /etc/resolve.conf

1
2
root@node1:~/peng/chroot-bionic# vi chroot-bionic/etc/resolv.conf
nameserver 114.114.114.114

Update /etc/apt/sources.list

1
2
3
4
5
root@node1:~/peng/chroot-bionic# vi chroot-bionic/etc/apt/sources.list

deb http://ftp.ubuntu.com/ubuntu bionic main
deb http://security.ubuntu.com/ubuntu bionic-security main
deb http://ftp.ubuntu.com/ubuntu/ bionic-updates main

可以chroot 到系统目录执行 apt-get update

1
2
3
4
# chroot $PWD/chroot-bionic
/# apt update
...
Building dependency tree... Done

and apt-get upgrade

1
2
/# apt upgrade
/# apt install vim tzdata

Import镜像

切换到镜像目录 import image.

1
root@node1:~/peng/chroot-bionic# tar cpf - . | docker import - liupeng0518/bionic-debootstrap:v0.1

chroot手工制作

如果使用以上方式执行报错,又不想费劲解决,我们可以手工制作

建议在全新安装的minimal系统下制作

复制内容

1
2
3

root@Kylin:~/peng# mkdir juniper
root@Kylin:~/peng/juniper# cp -ra /dev/ /bin/ /etc/ /lib/ /root/ /run /sbin/ /usr/ /var/ /tmp .

创建必须目录

1
root@Kylin:~/peng/juniper# mkdir  proc tmp home boot  media  mnt  opt  srv  sys

挂在设备节点

1
2
3
4

root@Kylin:~/peng/juniper# mount -t proc proc ./proc
root@Kylin:~/peng/juniper# mount -t sysfs sys ./sys
root@Kylin:~/peng/juniper# mount -o bind /dev ./dev

chroot

1
root@Kylin:~/peng/juniper# chroot .

自定义镜像

这里我们可以自定义镜像内容,比如卸载不必要的安装包,减少镜像体积,修改dns、仓库内容等

import镜像

1
tar cpf - . | docker import - liupeng0518/juniper:v0.1

参考:

https://superuser.com/questions/165116/mount-dev-proc-sys-in-a-chroot-environment

https://stafwag.github.io/blog/blog/2019/04/22/building-your-own-docker-images_part1/