10月30, 2017

基于虚拟机的容器基础镜像

制作Docker容器镜像,需要准备一个Dockerfile,比如下面:

FROM xxx.xxx.xxx/admin/centos-74:latest

RUN yum -y install java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4 java-1.8.0-openjdk-devel-1.8.0.151-1.b12.el7_4 && yum clean all

ADD xxx /

ENTRYPOINT ["/usr/local/bin/dumb-init", "/usr/local/bin/bootstrap.sh"]

指令“FROM”后面的镜像,是该镜像的“基础镜像”,充当“基础镜像”的一般是某个Linux发行版的操作系统镜像,那这个“基础镜像”从何而来呢?

简单的方式,可以直接从Docker Hub网站获取,比如CentOS:https://hub.docker.com/_/centos/

这样的好处是省事,不用自己搞,官方维护,包括版本升级,比如6.8 -> 6.9,而且镜像体积很小,因为官方删减了很多软件、库;

但有时候,可能因为某些原因,不想、或者不能直接用官方的,比如我们的场景:

  • 我们不在乎镜像体积,不希望体积太小,因为太小意味着删减了很多常用的软件、库
  • 出于安全、或者其他管理性设计,需要调整操作系统某些配置,或者替换某些软件
  • 为了照顾使用体验,容器的镜像,与长期使用的虚拟机的镜像,环境一致

为了满足这些需求,有两种方法:

  • 基于官方的,再“累加”,比如再yum安装很多软件和库
  • 自己从头搞

我们采用的方法是第二种,下文简要介绍下;

创建虚拟机

生成虚拟机的磁盘文件:

# qemu-img create -f qcow2 CentOS-7.4-x86\_64-Docker.qcow2 10G

使用ISO启动虚拟机:

# virt-install --virt-type kvm \
               --name CentOS-7.4-x86_64-Docker \
               --ram 8192 \
               --vcpus 4 \
               --cdrom=./CentOS-7-x86_64-DVD-1708.iso \
               --disk path=./CentOS-7.4-x86_64-Docker.qcow2,size=10,format=qcow2 \
               --network network=default \
               --graphics vnc,listen=0.0.0.0 \
               --noautoconsole \
               --os-type=linux \
               --os-variant=rhel7

使用VNC连接后,定制虚拟机: alt

alt

装完系统后,进入系统,根据需求做进一步定制(修改YUM配置、装软件、修改配置文件、新建目录等等): alt

Dump虚拟机文件系统

操作系统环境定制好后,如下命令打包整个文件系统:

alt

制作容器基础镜像

有了上面的操作系统tar包,制作容器基础镜像就很简单了;

只需这样一个极简的Dockerfile:

FROM scratch

ADD CentOS-7.4-x86_64-Docker.tar.gz /
# docker build -t xxx.xxx.xxx/admin/centos-74:latest .

最后一个问题

如果将来需要更新怎么办?这个是在所难免的;

每次都进到那个模板虚拟机里更新,重新tar包整个根文件系统?有些麻烦;

其实不必,修改上面的Dockerfile文件就好了,比如:

FROM scratch

ADD CentOS-7.4-x86_64-Docker.tar.gz /

RUN yum -y instal xxx xxx && yum clean all
RUN xxx
ADD xxx /xx/xx/xx

本文链接:https://addops.cn/post/from-vm-to-docker-image.html

-- EOF --

Comments

opsdev