• Create OpenStack and Docker base image based on CentOS7-mini ISO


    在Docker Hub下载的CentOS镜像没有Network组件,而且不可以自己定制,我们为了解决这个问题,需要创建自己的CentOS镜像,并对其进行定制。本文使用CentOS的ISO文件生成用于OpenStack的image文件,并使用该image生成Docker的image文件。

    1 Prepare

    We have installed the virt-manager on CentOS7-mini. We use virt-manager to install the ISO, and then generate the centos7.img, which is the full disk of VM.

    1.1 Install VM via virt-manager

    You should take attention on the follow step.

    (1) We choose [Local install media (ISO image or CDROM)] to install the operating system on VM.

    (2) Then choose  [Use ISO image], and click [Browse...] to find the volume. Select Linux as OS type and select the fit Version.

    (3) If has no the storage pool, you can click [+] on the left low to create a folder as the storage pool.

    (4) We should create the vm in an image file, and use this image for OpenStack. We choose [Enable storage for this virtual machine] and [Select or create custom storage], then click [Manage...] to find the volume. 

    (5) We can click [+] to create storage volume (centos7.img) in the above storage pool. We select the qcow2 as the storage format to save the disk space and we set the Max Capacity to 100 GiB.

    (6) Step by step to create and install VM, and make sure the VM to be working.

    1.2 Install some packages on VM

    As we know, the CentOS7-mini has few softwares, we can install some packages to enable more function.

    1 yum install -y vim wget git net-tools

    1.3 Replace the boot efi

    To avoid the CentOS boot issue, we should replace /boot/efi/EFI/BOOT/BOOTAA64.EFI via /boot/efi/EFI/centos/grubaa64.efi.

    1 cp -f /boot/efi/EFI/centos/grubaa64.efi /boot/efi/EFI/BOOT/BOOTAA64.EFI

    2 Create the image for OpenStack

    2.1 Convert the image format

    The centos7.img is still 100G, we should convert the image format to save the disk space.

    1 qemu-img convert -c -O qcow2 centos7.img centos7.qcow2

    2.2 Upload the image to OpenStack

    1 openstack image create --disk-format qcow2 --container-format bare --public --property hw_firmware_type="uefi" --file centos7.qcow2 centos7.qcow2

    3 Create the image for Docker

     3.1 Pack the system disk “/”

     Docker need the “/” folder of centos as docker images. We use tar to pack the “/” folder.

    1 modprobe nbd max_part=16
    2 qemu-nbd -c /dev/nbd0 centos7.qcow2
    3 mount /dev/ndb0p4 /mnt
    4 chroot /mnt bash
    5 tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7.tar /

    3.2 Import the docker image

     Import centos as docker image, and use centos7-local to run an container.

    1 cat centos7.tar | docker import - centos7-local
    2 docker images
    3 docker run -d --name "centos7-local" centos7-local /bin/bash
    4 docker exec -it centos7-local /bin/bash

    4 Create docker image and enable systemctl

    4.1 Create image from the iso

    # Use local iso as repo

    1 wget http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso
    2 mount CentOS-7-x86_64-Minimal-1804.iso /mnt
    3 cd /etc/yum.repo.d/
    4 mkdir bak
    5 mv *.repo bak/
    6 vim CentOS-Local.repo
    1 [CentOS-Local]
    2 baseurl = file:///mnt/
    3 gpgcheck = 0
    4 enabled = 1
    5 name = CentOS-Local
    7 yum clean all
    8 rm -rf /var/cache/yum

    # Create a base CentOS Docker image

    1 vim mkimage-yum.sh
      1 #!/usr/bin/env bash
      2 #
      3 # Create a base CentOS Docker image.
      4 #
      5 # This script is useful on systems with yum installed (e.g., building
      6 # a CentOS image on CentOS).  See contrib/mkimage-rinse.sh for a way
      7 # to build CentOS images on other systems.
      8 
      9 set -e
     10 
     11 usage() {
     12     cat <<EOOPTS
     13 $(basename $0) [OPTIONS] <name>
     14 OPTIONS:
     15   -p "<packages>"  The list of packages to install in the container.
     16                    The default is blank.
     17   -g "<groups>"    The groups of packages to install in the container.
     18                    The default is "Core".
     19   -y <yumconf>     The path to the yum config to install packages from. The
     20                    default is /etc/yum.conf for Centos/RHEL and /etc/dnf/dnf.conf for Fedora
     21 EOOPTS
     22     exit 1
     23 }
     24 
     25 # option defaults
     26 yum_config=/etc/yum.conf
     27 if [ -f /etc/dnf/dnf.conf ] && command -v dnf &> /dev/null; then
     28     yum_config=/etc/dnf/dnf.conf
     29     alias yum=dnf
     30 fi
     31 install_groups="Core"
     32 while getopts ":y:p:g:h" opt; do
     33     case $opt in
     34         y)
     35             yum_config=$OPTARG
     36             ;;
     37         h)
     38             usage
     39             ;;
     40         p)
     41             install_packages="$OPTARG"
     42             ;;
     43         g)
     44             install_groups="$OPTARG"
     45             ;;
     46         ?)
     47             echo "Invalid option: -$OPTARG"
     48             usage
     49             ;;
     50     esac
     51 done
     52 shift $((OPTIND - 1))
     53 name=$1
     54 
     55 if [[ -z $name ]]; then
     56     usage
     57 fi
     58 
     59 target=$(mktemp -d --tmpdir $(basename $0).XXXXXX)
     60 
     61 set -x
     62 
     63 mkdir -m 755 "$target"/dev
     64 mknod -m 600 "$target"/dev/console c 5 1
     65 mknod -m 600 "$target"/dev/initctl p
     66 mknod -m 666 "$target"/dev/full c 1 7
     67 mknod -m 666 "$target"/dev/null c 1 3
     68 mknod -m 666 "$target"/dev/ptmx c 5 2
     69 mknod -m 666 "$target"/dev/random c 1 8
     70 mknod -m 666 "$target"/dev/tty c 5 0
     71 mknod -m 666 "$target"/dev/tty0 c 4 0
     72 mknod -m 666 "$target"/dev/urandom c 1 9
     73 mknod -m 666 "$target"/dev/zero c 1 5
     74 
     75 # amazon linux yum will fail without vars set
     76 if [ -d /etc/yum/vars ]; then
     77     mkdir -p -m 755 "$target"/etc/yum
     78     cp -a /etc/yum/vars "$target"/etc/yum/
     79 fi
     80 
     81 if [[ -n "$install_groups" ]];
     82 then
     83     yum -c "$yum_config" --installroot="$target" --releasever=/ --setopt=tsflags=nodocs 
     84         --setopt=group_package_types=mandatory -y groupinstall "$install_groups"
     85 fi
     86 
     87 if [[ -n "$install_packages" ]];
     88 then
     89     yum -c "$yum_config" --installroot="$target" --releasever=/ --setopt=tsflags=nodocs 
     90         --setopt=group_package_types=mandatory -y install "$install_packages"
     91 fi
     92 
     93 yum -c "$yum_config" --installroot="$target" -y clean all
     94 
     95 cat > "$target"/etc/sysconfig/network <<EOF
     96 NETWORKING=yes
     97 HOSTNAME=localhost.localdomain
     98 EOF
     99 
    100 # effectively: febootstrap-minimize --keep-zoneinfo --keep-rpmdb --keep-services "$target".
    101 #  locales
    102 rm -rf "$target"/usr/{{lib,share}/locale,{lib,lib64}/gconv,bin/localedef,sbin/build-locale-archive}
    103 #  docs and man pages
    104 rm -rf "$target"/usr/share/{man,doc,info,gnome/help}
    105 #  cracklib
    106 rm -rf "$target"/usr/share/cracklib
    107 #  i18n
    108 rm -rf "$target"/usr/share/i18n
    109 #  yum cache
    110 rm -rf "$target"/var/cache/yum
    111 mkdir -p --mode=0755 "$target"/var/cache/yum
    112 #  sln
    113 rm -rf "$target"/sbin/sln
    114 #  ldconfig
    115 rm -rf "$target"/etc/ld.so.cache "$target"/var/cache/ldconfig
    116 mkdir -p --mode=0755 "$target"/var/cache/ldconfig
    117 
    118 version=
    119 for file in "$target"/etc/{redhat,system}-release
    120 do
    121     if [ -r "$file" ]; then
    122         version="$(sed 's/^[^0-9]*([0-9.]+).*$/1/' "$file")"
    123         break
    124     fi
    125 done
    126 
    127 if [ -z "$version" ]; then
    128     echo >&2 "warning: cannot autodetect OS version, using '$name' as tag"
    129     version=$name
    130 fi
    131 
    132 tar --numeric-owner -c -C "$target" . | docker import - $name:$version
    133 
    134 docker run -i -t --rm $name:$version /bin/bash -c 'echo success'
    135 
    136 rm -rf "$target"
    View Code
    
    
    2 chmod +x mkimage-yum.sh
    3 ./mkimage-yum.sh centos-lingmo

    4.2 Run docker and enable systemctl

    1 docker images
    2 docker run -d --privileged=true --name centos-test centos-hxt:7.5.1804 /usr/sbin/init
    3 docker exec -it centos-test /bin/bash

    Now, you can run systemctl to manage the server on docker vm.

    5 Reference

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

    https://blog.csdn.net/luckytanggu/article/details/71514798

  • 相关阅读:
    Docker概念学习系列之详谈Docker 的核心组件与概念(5)
    全网最详细的如何在谷歌浏览器里正确下载并安装Postman【一款功能强大的网页调试与发送网页HTTP请求的Chrome插件】(图文详解)
    全网最详细的一款满足多台电脑共用一个鼠标和键盘的工具Synergy(图文详解)
    [转]华为开发者联盟开放的服务
    [转]英语发音规则---E字母常见的发音组合有哪些
    [转]【信息系统项目管理师】重点整理:高项知识地图
    [转]【信息系统项目管理师】高项案例分析攻略
    [转]【信息系统项目管理师】案例分析记忆题
    [转]850 Basic English words
    [转]信息系统项目管理师计算题汇总
  • 原文地址:https://www.cnblogs.com/hxt-lingmo/p/9268858.html
Copyright © 2020-2023  润新知