如何创建 CentOS 系统的 Docker 基础镜像

本贴最后更新于 2266 天前,其中的信息可能已经事过境迁

1. 前言

在使用 Docker 容器时,我们经常需要基于一些基础镜像(Base Image)来构建符合自己要求的镜像。通常,我们会使用 DockerHub 或其他镜像市场提供的基础镜像。虽然这样很方便,但是我们并不知道第三方提供的基础镜像的实现细节和安全性,若在生产环境贸然使用这些基础镜像,则可能会带来技术隐患。因此,有必要创建自己的基础镜像!本文将详述创建 CentOS 系统(7.4 版本)的 Docker 基础镜像的两种方法,分别是:

1.1. 通过 tar 打包已有的 CentOS 系统,然后导入 Docker 镜像仓库;

1.2. 通过 mkimage-yum.sh 脚本,使用 yum 下载和安装必要的软件包,然后导入 Docker 镜像仓库。

本文会使用 1 台虚拟机,安装有 CentOS 7.4 系统,这是一台 kvm 虚拟机

操作系统:CentOS 7.4.1708 x86_64

IP 地址:192.168.31.210

如图:

image

2. 通过 tar 打包构建基础镜像

Step-1 卸载不必要的软件包

为了缩小文件系统的体积,需要删除一些不必要的软件包。在 Shell 中执行以下命令:

CentOS 7.4.1708 系统:

yum remove -y iwl* *firmware* --exclude=kernel-firmware

Step-2 清除 yum 缓存

清除 yum 缓存,进一步缩小文件系统的体积。在 Shell 中执行以下命令:

yum clean all
rm -rf /var/cache/yum

Step-3 打包文件系统

将文件系统打包,排除所有运行时才创建的目录,以及不必要的目录。在 Shell 中执行以下命令:

tar --numeric-owner --exclude=/proc --exclude=/sys --exclude=/mnt --exclude=/var/cache --exclude=/usr/share/{foomatic,backgrounds,perl5,fonts,cups,qt4,groff,kde4,icons,pixmaps,emacs,gnome-background-properties,sounds,gnome,games,desktop-directories} --exclude=/var/log -zcvf /mnt/CentOS-7.4-BaseImage.tar.gz /

Step-4 安装和启动 Docker

centos7 下 docker-ce 搭建

笔者在另一台 kvm 虚拟机上安装了 dokcer ce

image

Step-5 导入镜像仓库

将打包的文件系统,导入 Docker 的本地镜像仓库。在 Shell 中运行以下命令:

cat /root/CentOS-7.4-BaseImage.tar.gz | docker import - centos:7.4.1708

Step-6 验证

检查 Docker 的本地镜像仓库,若如下图所示,则表明镜像创建成功:
image

启动一个容器:

  docker run  --name centos:7.4.1708 -it centos /bin/bash

2.通过 mkimage-yum.sh 脚本构建基础镜像

Step-1 安装第三方源

安装 CentOS 的 EPEL 源和 REMI 源。在 Shell 中运行以下命令:

rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-10.noarch.rpmrpm -Uvh https://rpms.remirepo.net/enterprise/remi-release-7.rpm

Step-2 安装和启动 Docker

安装 Docker 软件包,然后启动 Docker 服务。在 Shell 中运行以下命令:

yum install -y docker-ioservice docker start

yum install -y docker-iosystemctl start docker.service

Step-3 创建脚本文件

新建 mkimage-yum.sh 脚本,这个文件就是 Docker 官方的创建镜像的脚本文件,URL 为:

https://github.com/moby/moby/blob/master/contrib/mkimage-yum.sh

在 Shell 中运行以下命令:

vi mkimage-yum.sh

CentOS 6.9 和 CentOS 7.4 的脚本内容相同,如下所示:

#!/usr/bin/env bash

Create a base CentOS Docker image.

This script is useful on systems with yum installed (e.g., building

a CentOS image on CentOS). See contrib/mkimage-rinse.sh for a way

to build CentOS images on other systems.

set -e

usage() {

cat <<EOOPTS

$(basename $0) [OPTIONS]

OPTIONS:

-p "" The list of packages to install in the container.

The default is blank.

-g "" The groups of packages to install in the container.

The default is "Core".

-y The path to the yum config to install packages from. The

default is /etc/yum.conf for Centos/RHEL and /etc/dnf/dnf.conf for Fedora

EOOPTS

exit 1

}

option defaults

yum_config=/etc/yum.conf

if [ -f /etc/dnf/dnf.conf ] && command -v dnf &> /dev/null; then

yum_config=/etc/dnf/dnf.conf

alias yum=dnf

fi

install_groups="Core"

while getopts ":y:p:g:h" opt; do

case $opt in

y)

yum_config=$OPTARG

;;

h)

usage

p)

install_packages="$OPTARG"

g)

install_groups="$OPTARG"

?)

echo "Invalid option: -$OPTARG"

esac

done

shift $((OPTIND - 1))

name=$1

if [[ -z $name ]]; then

target=(mktemp -d --tmpdir (basename $0).XXXXXX)

set -x

mkdir -m 755 "$target"/dev

mknod -m 600 "$target"/dev/console c 5 1

mknod -m 600 "$target"/dev/initctl p

mknod -m 666 "$target"/dev/full c 1 7

mknod -m 666 "$target"/dev/null c 1 3

mknod -m 666 "$target"/dev/ptmx c 5 2

mknod -m 666 "$target"/dev/random c 1 8

mknod -m 666 "$target"/dev/tty c 5 0

mknod -m 666 "$target"/dev/tty0 c 4 0

mknod -m 666 "$target"/dev/urandom c 1 9

mknod -m 666 "$target"/dev/zero c 1 5

amazon linux yum will fail without vars set

if [ -d /etc/yum/vars ]; then

mkdir -p -m 755 "$target"/etc/yum

cp -a /etc/yum/vars "$target"/etc/yum/

if [[ -n "$install_groups" ]];

then

yum -c "yum_config" --installroot="target" --releasever=/ --setopt=tsflags=nodocs \

--setopt=group_package_types=mandatory -y groupinstall "$install_groups"

if [[ -n "$install_packages" ]];

--setopt=group_package_types=mandatory -y install "$install_packages"

yum -c "yum_config" --installroot="target" -y clean all

cat > "$target"/etc/sysconfig/network <<EOF

NETWORKING=yes

HOSTNAME=localhost.localdomain

EOF

effectively: febootstrap-minimize --keep-zoneinfo --keep-rpmdb --keep-services "$target".

locales

rm -rf "$target"/usr/{{lib,share}/locale,{lib,lib64}/gconv,bin/localedef,sbin/build-locale-archive}

docs and man pages

rm -rf "$target"/usr/share/{man,doc,info,gnome/help}

cracklib

rm -rf "$target"/usr/share/cracklib

i18n

rm -rf "$target"/usr/share/i18n

yum cache

rm -rf "$target"/var/cache/yum

mkdir -p --mode=0755 "$target"/var/cache/yum

sln

rm -rf "$target"/sbin/sln

ldconfig

rm -rf "target"/etc/ld.so.cache "target"/var/cache/ldconfig

mkdir -p --mode=0755 "$target"/var/cache/ldconfig

version=

for file in "$target"/etc/{redhat,system}-release

do

if [ -r "$file" ]; then

version="(sed 's/^[^0-9\]*\([0-9.]\+\).*/\1/' "$file")"

break

if [ -z "$version" ]; then

echo >&2 "warning: cannot autodetect OS version, using '$name' as tag"

version=$name

tar --numeric-owner -c -C "target" . | docker import - name:$version

docker run -i -t --rm name:version /bin/bash -c 'echo success'

rm -rf "$target"

Step-4 导入镜像仓库

运行 mkimage-yum.sh 脚本,创建 CentOS 的基础镜像,CentOS 6.9 和 CentOS 7.4 的命令相同:

chmod 755 mkimage-yum.sh./mkimage-yum.sh centos-mkimage

Step-5 验证

4.两种方法对比

两种创建 CentOS 7.4 基础镜像的方法对比

由上述两图可知,通过 tar 打包创建的基础镜像的体积大约是通过 mkimage-yum.sh 脚本创建的基础镜像的 3 倍左右。这是由于前者是基于最小化安装的 CentOS 系统而创建的,而后者是从 CentOS 官方源安装必要的软件包而创建的,前者比后者多安装了很多软件包,包括邮件工具、设备驱动程序,等等。这两种方法各有特点:

通过 tar 打包创建:基础镜像体积较大,但可以按照需求自由定制,适用于各种版本的 CentOS 系统,灵活度较高。

通过 mkimage-yum.sh 脚本创建:基础镜像体积较小,但只能安装官方源支持的软件包,并且只适用于最新版本的 CentOS 系统。

用户可以根据自己的需求特点,选择本文介绍的一种方法来创建属于自己的 CentOS 基础镜像!

  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖 • 2 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    491 引用 • 917 回帖 • 4 关注
  • BASE
    2 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...