在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"
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
来源:oschina
链接:https://my.oschina.net/u/4258672/blog/3915816