本系列为原创内容,可全部视为笔者个人理解。因此,仅供读者参考,不具备权威性;如有谬误,欢迎指正。笔者尝试通过此系列文字,将目前对docker的自学、实践过程结合自身工作中的实际需求,进行分享。
按笔者目前粗浅的理解,docker 与服务器虚拟化,都是用于虚拟出供某个软件单独运行的环境。docker 提供了相对虚拟机而言,更轻量的运行环境;对于应用部署实施者而言,有时候也并不关心docker未虚拟化的底层的内容——起码笔者在目前的折腾中是如此。
本系列中笔者涉及的软件主要有:
docker 相关的几个重要概念有:
从上面的概念可见,每个实际运行的容器,都源自某个镜像;因此为了让容器能够真正开始运行,需要先构建镜像。按笔者理解,使用docker制作运行容器、或者使用虚拟服务器等技术,都有出于方便移植的考虑。那么,构建的容器体积应当越小越好。因此,笔者选择CentOS的最小化安装版本作为基础镜像的构建源。以下是构建过程。
此步骤正常进行操作系统的最小化安装即可。考虑到这个镜像(代表其所描述的操作系统)未来可能会进一步用于构建多个不同的目标镜像,建议根据实际需要,先规划好此操作系统的系统用户、工作路径等。
这里安装的操作系统,一方面用于构建未来所需的基础镜像,一方面也作为宿主环境使用。
yum remove -y iwl* *firmware* --exclude=kernel-firmware
yum clean all
rm -rf /var/cache/yum
此时可以开始构建基础镜像了。笔者尝试了两种方法,以下一一介绍。
这里,笔者使用以下命令,将最小化安装的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 路径。如果不排除镜像文件存放的目标路径,那么得到的镜像文件会更大。
将工作环境的操作系统打包得到基础镜像文件后,现在可以在工作环境(宿主环境)中继续安装 Docker 了。
yum install -y docker-io
docker-io 安装完成后,笔者在宿主环境中发现增加一个用户 docerroot;增加一个用户组:dockerroot。
笔者所处的工作环境中,按权限最小化原则,一般不允许在服务器上使用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)所述:
因此,笔者的处理是:
useradd -d /home/dockeradmin dockeradmin
passwd dockeradmin
groupadd docker
usermod -g docker dockeradmin
如果希望使用其它已存在的用户user_XXX,那么就将用户 user_XXX 添加到 dockerroot用户组中:
为了让新创建的 dockeradmin 能够启动或停止 docker 服务,还需要在 /etc/sudoers 文件中,为用户 dockeradmin、或者用户组 docker 添加合适的权力。这一步操作需要使用 root 用户来完成。
有以下两种方式可以进行编辑;推荐使用第一种。
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 口令:
使用以下命令,将刚才打包操作系统之后、存放于/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”。
此时,在 docker 服务正常运行的情况下,可以通过 dockeradmin 用户执行以下指令,显示已有的镜像:
docker images
下图中第三项的centos-min 即是上述通过上述步骤得到的镜像;其SIZE为 767MB。
docker run -it centos-min:7.6.1810 /bin/echo "Hello World..."
通过以下链接获得构建基础镜像的脚本,上传至宿主环境的合适路径
构建脚本
其它教程表示该脚本适用于 CentOS6.9和CentOS 7.4;笔者使用的 CentOS7.6实测也可使用。
chmod 744 mkimage-yum.sh
在构建脚本存放路径下,使用 root 用户,利用以下指令运行脚本
./mkimage-yum.sh -y /etc/yum.conf centos7-min
如果执行上述指令出现“ no such file or directory ”,可能是因为 mkimage-yum.sh 脚本从windows下编辑好上传至宿主环境后,其文件格式不对;检验方法如下:
与方法一的 step 5 相同,不再赘述。
可以看到, 通过脚本构建得到的镜像,其SIZE为281MB,相较直接打包操作系统得到的镜像小了一大半。
使用 docker save 指令,可以将指定的镜像进行保存:
docker save -o centos7-min.tar centos7-min:7.6.1810