前言
一般情况下,docker官网的镜像仓库非常完备,而且还有各大厂商的对外镜像仓库提供补充,我们的选择面非常之广,基本都能满足我们的需求。
可是,当我们基于一个镜像的容器,作出了修改、开发、部署之后,把这个已经被改变的容器封装成一个镜像,好像也变成了一种需求。
比如:我们下载了一个linux镜像,基于这个镜像我们启动了容器,在容器里面我们部署了自己开发的业务系统,或者是一个HTTP服务器,更或者是一个符合自己实际需求的ZABBIX监控系统,之后,我们为了分发或者方便使用,把这个经过业务系统部署的容器,进行了封装成镜像的操作。
下面的内容,我们将以centos+http为例子,进行实际操作演示。
注意:宿主机为oracle linux 7.9,IP地址为192.168.31.51。
1、DOCKER状态检查
我们查看docker的运行状态,并检查已经下载的镜像。
# systemctl status docker
# docker images
2、下载镜像
我们访问http://hub.docker.com,搜索一个我们想要部署centOS版本,如图所示,我们选择了centOS 7.9。
注:为什么在这里不用docker search centos命令进行搜索,因为在这里搜索出来的结果,很难分辨准确的版本号/TAG,可能你下载下来的镜像是latest版本。
# docker pull centos:centos7.9.2009
# docker images
3、启动镜像。
# docker run -d -p 5080:80 -p 5022:22 --privileged=true centos:centos7.9.2009 /usr/sbin/init
# docker ps
如上图所示,已经从镜像启动容器,并且容器也已经正常运行。
4、配置容器
进入容器,并配置YUM信息。
[root@oel79 ~]# docker ps
[root@oel79 ~]# docker exec -it b96b2ffe448d /bin/bash
[root@b96b2ffe448d /]# cat /etc/yum.repos.d/system.repo
[root@b96b2ffe448d /]# yum clean all
[root@b96b2ffe448d /]# yum makecache
注意:
-
进入容器的操作,只能以容器ID来识别;其次YUM的配置根据实际需要进行即可,文中192.168.31.99是我为了测试方便,搭建的本地网络YUM源。
-
如果想尝试搭建本地网络YUM源,以及更多的关于YUM和DNF的知识,可以访问本公众号文章:
5、测试容器访问
在客户端使用ssh协议访问容器的对外映射端口192.168.31.51:5022,提示无法访问。
-
进入容器,检查sshd服务,提示没有这个服务器;
-
安装SSHD服务:
[root@b96b2ffe448d /]# yum install -y openssh-*
[root@b96b2ffe448d /]# rpm -ql openssh-server
[root@b96b2ffe448d /]# systemctl start sshd
[root@b96b2ffe448d /]# systemctl status sshd
-
再次在客户端测试对容器的SSH连接,正常访问。
-
在客户端测试访问http://192.168.31.51:5080,提示无法访问此网页。
-
安装HTTPD服务:
[root@b96b2ffe448d /]# yum install -y httpd
[root@b96b2ffe448d /]# systemctl start httpd
[root@b96b2ffe448d /]# systemctl enabled httpd
[root@b96b2ffe448d /]# systemctl status httpd
-
再次在客户端测试http://192.168.31.51:5080,正常访问。
-
进入容器输入init 6,重新启动容器,继续测试ssh和httpd访问,正常。
6.查看centos镜像的分层结构。
如图所示,我们从docker官方下载的centos镜像总共三层。
7.封装镜像
经过前面的测试,我们知道centos镜像原本是没有ssh和http服务的,而目前,在基于centos启动的容器中,SSH和HTTP服务均正常运行,我们现在尝试将其进行封装。
# docker commit b96b2ffe448d centos-new
# docker images
如上图所示,我们封装了一个名称为centos-new的镜像,我们再次查看这个镜像的分层结构。
如下图所示,我们刚封装的centos-new镜像已经有了总共四层。
8、启动新封装的镜像。
# docker run -d -p 9080:80 -p 9022:22 --privileged=true centos-new:latest /usr/sbin/init
# docker ps
如图所示,新封装的镜像被启动到容器,容器的80端口被映射到宿主机的9080端口,而22端口被映射到宿主机的9022端口。
9、测试新容器的访问
-
在客户端使用ssh协议测试192.168.31.51:9022的访问,正常。
-
在客户端使用浏览器测试http://192.168.31.51:9080的访问,正常。
至此,我们完成了docker镜像的封装测试,接下来我们可以把封装好的镜像进行上传,或者搭建自己网络内的docker本地仓库,进行这个镜像的分发,可以参考文档:Linux环境中部署docker私有仓库Registry实战文档http://mp.weixin.qq.com/s?__biz=MzI0MzczNDA0NA==&mid=2247486479&idx=1&sn=ed2172ccd7f98c653ff3127e4f53f726&chksm=e969cf7cde1e466a02645235f4ed8d5751fea2bd7d0d86f712b925054988f86e585ce07494bc&scene=21#wechat_redirect