想要了解CentOS官方Docker镜像包含了什么内容
首先
最近,我在CentOS 7的Docker容器中使用systemd启动服务时发现,从9月初开始,Docker官方的CentOS 7镜像中移除了systemd,并改为安装了一个名为fakesystemd的替代物。
因此,由于无法提供服务,我们需要一段时间来调查如何应对,但在此过程中,我们了解到Docker官方CentOS镜像的内容是由什么决定的,以下是详细说明。
The current text
下一个将成为“设计文件”即kickstart文件的存放位置的图像。https://github.com/CentOS/sig-cloud-instance-build
如果限于Docker的话,这就是对应的链接:
https://github.com/CentOS/sig-cloud-instance-build/tree/master/docker
由于使用的是RHEL系列操作系统,所以通常会使用kickstart文件。
通过这个kickstart文件,将按照其中的指示进行自动安装操作系统,并将其转换为docker镜像。
只要了解了这个kickstart文件中大致的内容,就能够读懂它。
-
- %package – %end間は「最小限のインストール」をベースとして増減するパッケージ名を列記する。
「最小限のインストール」になるのは「–nobase」オプションが付いているから。ただし、CentOS 7では付いていなくても「最小限のインストール」になるようだ。
「–excludedocs」オプションはドキュメント系パッケージを除外する。
パッケージ名は”-“が最初に付いていればインストールをしない。付いていなければ(追加で)インストールをする。
「最小限のインストール」に何が含まれるかはCentOS 7インストーラの「ソフトウェアの選択」の中身を調べてみたを参照のこと(CentOS 7についてしか書いてないけど……)。
%post – %end間はインストール終了直前に実行されるコマンド。
他の部分は字面でわかると思われる。わからない箇所は以下で確認できる。
CentOS 5: https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/5/html/Installation_Guide/s1-kickstart2-options.html
CentOS 6: https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-options.html
CentOS 7: https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/sect-kickstart-syntax.html
在查看CentOS 7的kickstart文件 https://github.com/CentOS/sig-cloud-instance-build/blob/master/docker/centos-7.ks 时,我们可以看到系统中的systemd安装命令被打上了”-“,导致无法安装,并且还添加了fakesystemd。
然而,由于软件包有依赖关系,因此很难说实际安装了哪些内容。
此外,在% post – % end之间多次执行了yum remove命令,导致与% package – % end之间列出的软件包内容发生了变化。
在CentOS 7的Docker容器中使用systemd来启动服务时,根据您提供的评论,在移除kmod时,由于依赖关系,initscripts也被同时删除了。
赠品
如果你想使用这个kickstart文件(或修改kickstart文件)来创建Docker镜像,则可以按照以下步骤进行操作。
然而,我认为制作官方真实镜像的人是使用与kickstart文件位于同一目录下的img2docker.sh脚本来完成的,但是我的方法不起作用,所以肯定有哪里不同。
-
- kvmとvirt-installとdockerがインストールされた環境を用意する。
私はkvm, virt-installとdockerとで別コンピュータにインストールした。実際のところkvm環境は随分前に作ったもので手順を書き留めていなかったので正しい手順を示すことができない。たぶんyum install qemu-kvm libvirt python-virtinst bridge-utils virt-installしてlibvirtdサービスを起動したはずだ。
dockerの方はdockerをインストールしてdockerサービスを起動した。
kvmがインストールされたコンピュータにブリッジを作成する。
ブリッジの作り方についてはpipeworkを使わずにDockerコンテナに任意の固定IPアドレスを割り当てるを参照のこと(これもCentOS 7についてしか書いてないけれど)。
私は使っていないが、kvmがインストールされたコンピュータを再起動するだけで勝手に作られるvirbr0ブリッジでも良いはずだ。
以下のようにしてkvm上でkickstartファイルを使ってOSのインストールを行う。これは結構時間が掛かる(数十分?)。なおブリッジ名はbr0にした。
# qemu-img create /opt/c7.img 8G
# virt-install -n c7 \
--connect=qemu:///system \
-r 2048 \
--vcpus 1 \
--disk /opt/c7.img \
-w bridge=br0 \
--graphics vnc,listen=0.0.0.0,port=5991 \
--noautoconsole \
--noreboot \
-v \
--accelerate \
--os-type linux \
--os-variant rhel7 \
-l http://ftp.iij.ad.jp/pub/linux/centos/7/os/x86_64 \
-x 'ks=https://raw.githubusercontent.com/CentOS/sig-cloud-instance-build/master/docker/centos-7.ks console=tty0 console=ttyS0,115200n8 keymap=ja'
-
- virt-manager等で様子を見ていれば、シャットダウンされたらOSインストールが終わったことがわかるので、このイメージファイル(上記では「/opt/c7.img」)をdocker機に持って行って以下のようにする。本当はここでimg2docker.shを使いたかったのだけど。
参考: http://yudoufu.github.io/blog/2012/04/28/vm-mount-memo/
# losetup /dev/loop2 /opt/c7.img
# kpartx -av /dev/loop2
# mount /dev/mapper/loop2p1 /mnt
# cd /mnt
# tar --numeric-owner -c . | docker import - c7
-
- 上記の最後の「c7」はdocker imageのタグである(ので、適当に変えて良い)。よって以下のように起動できる。
何故か最初の1回は上手く起動しない。
# docker run -it c7 /bin/bash
- なお、/mntのマウントは以下のように解除する。
# cd
# umount /mnt
# kpartx -dv /dev/loop2
# losetup -d /dev/loop2