docker基础探索系列一:基础镜像构建

前言

本系列为原创内容,可全部视为笔者个人理解。因此,仅供读者参考,不具备权威性;如有谬误,欢迎指正。笔者尝试通过此系列文字,将目前对docker的自学、实践过程结合自身工作中的实际需求,进行分享。

按笔者目前粗浅的理解,docker 与服务器虚拟化,都是用于虚拟出供某个软件单独运行的环境。docker 提供了相对虚拟机而言,更轻量的运行环境;对于应用部署实施者而言,有时候也并不关心docker未虚拟化的底层的内容——起码笔者在目前的折腾中是如此。

本系列中笔者涉及的软件主要有:

  • 操作系统:CentOS 7.6.1810 minimal
  • docker:1.13.1
  • 应用:nodejs v10.15.3

重要概念

docker 相关的几个重要概念有:

  • 镜像:image,可以理解为面向对象编程中的“类”,以某一具体镜像为模板,运行具体的容器,提供服务。按笔者理解,镜像至少描述了一个可运行操作系统,每个镜像实例化出的容器,都是可运行的。
  • 容器:container,可以理解为面向对象编程中的“对象”,即镜像实例化,一个可以运行的实体。最终提供给用户访问的,都是某个容器所提供的某个服务。

从上面的概念可见,每个实际运行的容器,都源自某个镜像;因此为了让容器能够真正开始运行,需要先构建镜像。按笔者理解,使用docker制作运行容器、或者使用虚拟服务器等技术,都有出于方便移植的考虑。那么,构建的容器体积应当越小越好。因此,笔者选择CentOS的最小化安装版本作为基础镜像的构建源。以下是构建过程。

构建过程

操作系统安装

此步骤正常进行操作系统的最小化安装即可。考虑到这个镜像(代表其所描述的操作系统)未来可能会进一步用于构建多个不同的目标镜像,建议根据实际需要,先规划好此操作系统的系统用户、工作路径等。

这里安装的操作系统,一方面用于构建未来所需的基础镜像,一方面也作为宿主环境使用。

清理

卸载不必要软件包

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

清除 yum 缓存

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

构建基础镜像

此时可以开始构建基础镜像了。笔者尝试了两种方法,以下一一介绍。

方法一:通过打包现有操作系统

step 0 : 打包操作系统

这里,笔者使用以下命令,将最小化安装的CentOS 作为模板,得到基础镜像文件 CentOS-7.6-BaseImage.tar.gz。

tar --numeric-owner --exclude=/proc --exclude=/sys --exclude=/mnt --exclude=/var/cache --exclude=/var/log --exclude=/usr/share/{backgrounds,groff,kde4,icons,pixmaps,gnome-background-properties,gnome,sounds} -zcvf /mnt/CentOS-7.6-BaseImage.tar.gz /

其中若干个 --exclude=/XXXX 参数分别代表在打包过程中排除(忽略)的路径,这些路径的内容不被打包入镜像文件里;其中包括了最后镜像文件存放的 /mnt 路径。如果不排除镜像文件存放的目标路径,那么得到的镜像文件会更大。

step 1 : 安装 Docker

将工作环境的操作系统打包得到基础镜像文件后,现在可以在工作环境(宿主环境)中继续安装 Docker 了。

yum install -y docker-io

docker-io 安装完成后,笔者在宿主环境中发现增加一个用户 docerroot;增加一个用户组:dockerroot。

step 2 : 配置Docker操作的专用用户

笔者所处的工作环境中,按权限最小化原则,一般不允许在服务器上使用root用户直接开展工作;虽然在开发时全程使用 root 用户进行操作似乎无伤大雅,但笔者个人倾向于相对稳妥的,使用其它专用用户的方式,用于在宿主环境中操作 docker。

上文提到,docker会增设一个用户 dockerroot ;但笔者尝试使用期间遇到了多种问题,因此还是建议手动创建一个dockeradmin这样的用户,来执行所有涉及 docker 的操作。

其次,笔者在尝试使用 dockerroot 用户组进行docker 操作时,结果如下:
通过在 sudoers 中对 dockerroot 用户组赋予 docker 服务启停权限,是可以让dockerroot 用户组的用户使用 sudo 命令进行 docker 服务启动或停止;但无法使用 docker 另外一些指令,例如 docker images、docker ps等,会出现诸如

Got permission denied while trying to connect to the Docker daemon socket at unix:

这样的提示。据其它[教程: Docker启动Get Permission Denied

](https://www.cnblogs.com/informatics/p/8276172.html)所述:

  • “docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。”
  • “docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令”

因此,笔者的处理是:

  1. 手动创建一个 dockeradmin 用户
  2. 手动创建一个 docker 用户组
  3. 将 dockeradmin 用户加入 docker 用户组
useradd -d /home/dockeradmin dockeradmin
passwd dockeradmin
groupadd docker
usermod -g docker dockeradmin

如果希望使用其它已存在的用户user_XXX,那么就将用户 user_XXX 添加到 dockerroot用户组中:

step 3 : 配置 sudo 用户

为了让新创建的 dockeradmin 能够启动或停止 docker 服务,还需要在 /etc/sudoers 文件中,为用户 dockeradmin、或者用户组 docker 添加合适的权力。这一步操作需要使用 root 用户来完成。

编辑 sudoers

有以下两种方式可以进行编辑;推荐使用第一种。

visudo
vi /etc/sudoers

进入sudoers 文件后,可以在其中加入以下内容:

## Allows member of the 'docker' group to start and stop service docker
%docker ALL=(root) NOPASSWD:/sbin/service docker restart,(root) NOPASSWD: /sbin/service docker start,(root) NOPASSWD: /sbin/service docker stop

其中第一行 是注释,从第二行开始才是真正生效的内容。这里的“%dockerroot”代表:向 docker 用户组的成员提供了以下这些权限;“NOPASSWD”表示不需要输入 root 口令:

  • 使用sudo service docker restart 进行docker服务重启
  • 使用sudo service docker start 进行docker服务启动
  • 使用sudo service docker stop 进行docker服务停止
    完成后,用 dockeradmin 用户登陆,尝试一下能否对docker服务进行启停操作。
step 4 : 打包文件导入本地镜像仓库

使用以下命令,将刚才打包操作系统之后、存放于/mnt路径下的基础镜像文件,导入本地的仓库。

cat /mnt/CentOS-7.6-BaseImage.tar.gz | docker import - centos-min:7.6.1810

其中,centos-min:7.6.1810 可以理解为镜像的 “名称 : 标签”,即名称为“centos-min”,标签为“7.6.1810”。

step 5 : 验证镜像是否创建成功
检查镜像

此时,在 docker 服务正常运行的情况下,可以通过 dockeradmin 用户执行以下指令,显示已有的镜像:

docker images

下图中第三项的centos-min 即是上述通过上述步骤得到的镜像;其SIZE为 767MB。
打包操作系统得到基础镜像

检查容器
docker run -it centos-min:7.6.1810 /bin/echo "Hello World..."

方法二:通过官方提供脚本构建

step 0 : 下载脚本

通过以下链接获得构建基础镜像的脚本,上传至宿主环境的合适路径
构建脚本
其它教程表示该脚本适用于 CentOS6.9和CentOS 7.4;笔者使用的 CentOS7.6实测也可使用。

step 1 : 赋予脚本可执行权限
chmod 744 mkimage-yum.sh
step 2 : 使用脚本构建

在构建脚本存放路径下,使用 root 用户,利用以下指令运行脚本

./mkimage-yum.sh -y /etc/yum.conf centos7-min

如果执行上述指令出现“ no such file or directory ”,可能是因为 mkimage-yum.sh 脚本从windows下编辑好上传至宿主环境后,其文件格式不对;检验方法如下:

  1. 使用 vi 打开文件
  2. :set ff 查看文件格式
    笔者在此时得到结果是ff=dos,需要改为unix
  3. :set ff=unix
  4. 保存退出
    之后即可执行。
step 3 : 验证

与方法一的 step 5 相同,不再赘述。
可以看到, 通过脚本构建得到的镜像,其SIZE为281MB,相较直接打包操作系统得到的镜像小了一大半。
脚本制作镜像,SIZE为 281 MB

导出镜像文件

使用 docker save 指令,可以将指定的镜像进行保存:

docker save -o centos7-min.tar centos7-min:7.6.1810

这里的 -o 选项代表输出为文件。
镜像导出文件

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值