构建自己的docker基础镜像
构建一个完全定制的基础镜像意味着您需要从一个非常小的镜像(例如 scratch
镜像)开始,然后逐步添加您需要的所有内容。scratch
镜像是一个空白的基础镜像,可以用来创建高度定制的容器环境。
创建一个基础镜像
构建debian基础镜像
- 准备根文件系统:
要构建一个基础镜像,您需要一个最小的根文件系统。这可以通过使用 debootstrap
等工具来创建。debootstrap
是debian/ubuntu下的一个工具,用来构建一套基本的根文件系统,其生成的目录符合Linux文件系统标准(FHS),即包含了/boot、/etc、/bin、/usr等等目录,但它比发行版本的Linux体积小很多,当然功能也没那么强大,因此,只能说是“基本的系统”。
首先,在一个干净的 Linux 环境中,安装 debootstrap
:
sudo apt-get update
sudo apt-get install -y debootstrap
然后,使用 debootstrap
创建一个最小的 Debian
根文件系统:
# 创建Debian rootfs,测试使用官方源较慢,可以改为国内源https://mirrors.aliyun.com/debian
root@ubuntu:~/mydebian# sudo debootstrap --arch=amd64 stable ./my-rootfs http://deb.debian.org/debian/
root@ubuntu:~/mydebian# du -sh ./my-rootfs/
360M ./my-rootfs/
root@ubuntu:~/mydebian# ls ./my-rootfs/
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
# 设置阿里云镜像源,对rootfs下面的镜像源文件进行修改
root@ubuntu:~/mydebian# cat my-rootfs/etc/apt/sources.list
deb http://mirrors.aliyun.com/debian/ stable main contrib non-free
deb http://mirrors.aliyun.com/debian/ stable-updates main contrib non-free
deb http://mirrors.aliyun.com/debian/ stable-backports main contrib non-free
deb http://mirrors.aliyun.com/debian-security stable-security main contrib non-free
这将会在当前目录下创建一个名为 my-rootfs
的目录,其中包含了最小的 Debian
文件系统。
说明:
debootstrap
支持的发行版本可以在/usr/share/debootstrap/scripts/
查看,而各发行版代号可以到http://en.wikipedia.org/wiki/List_of_Ubuntu_releases
查看。如果是在arm环境下构建容器镜像,
ARMv8
架构设置--arch=arm64
,ARMv7
架构设置--arch=armhf
,同时镜像源指向对应架构的源地址。例如:
sudo debootstrap --verbose --arch=arm64 xenial ./ubuntu-rootfs https://mirrors.aliyun.com/ubuntu-ports/
-
创建
Dockerfile
:创建一个
Dockerfile
,并使用scratch
作为基础镜像,然后将您的根文件系统复制到其中。
# 使用 scratch 作为基础镜像
FROM scratch
# 复制最小的 Debian 根文件系统到镜像中
COPY ./my-rootfs/ /
# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive
# 设置时区
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
# 安装基本工具
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
vim \
git \
wget \
net-tools \
iputils-ping \
dnsutils \
unzip \
&& rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /root
# 设置镜像作者信息
LABEL maintainer="your-email@example.com"
说明:
scratch
是Docker保留镜像,镜像名字避免使用该保留字,使用FROM scratch
表示构建镜像中的第一个文件层。
-
构建基础镜像:
在
Dockerfile
所在目录下,使用以下命令构建镜像:
docker build -t mybasedebian:12.0 .
# 构建成功后查看镜像列表
root@ubuntu:~/mydebian# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mybasedebian 12.0 8b7f616a56d2 2 minutes ago 612MB
构建ubuntu基础镜像
这次我以构建一个ubuntu
amd64
架构xenial
版本的容器镜像为例:
sudo debootstrap --verbose --arch=amd64 xenial ./ubuntu-rootfs https://mirrors.aliyun.com/ubuntu/
编写Dockerfile
:
# 使用 scratch 作为基础镜像
FROM scratch