应用场景

在某些情况下,我们可能需要修改官方的docker镜像,不过,首先需要搞明白,镜像:image 和容器:container 的区别:
镜像image:类似于java中的类
容器container:类似于java中的对象
因此,我们往往从docker hub下载官方镜像,然后,把镜像部署到服务器,然后,我们真正用到该服务的时候,往往是根据该镜像生成一个容器,然后运行容器。和java中类和对象的概念很像,镜像就是类,根据类生成对象后,真正使用的是对象,对应docker就是容器。

修改官方docker镜像

首先,明白了前面关于镜像和容器的概念,我们就会明白,我们需要修改的是镜像,如果我们只是在容器运行时做改动,则不会影响到镜像。
下面就以我的一个例子来详细说一下:
我的需求是更新matomo镜像中的Apache http server版本
1. 下载镜像
首先,下载镜像,可以从docker hub或者从自己的服务器下载。我本来想着,既然更新的是matomo中的Apache http server版本,那我直接把matomo更新到最新不就好了?可惜,结果不如我所想,最新的matomo中,Apache仍然版本过低,所以,只能修改官方镜像了
2. 启动容器
查找所有镜像:

docker images

找到你需要修改的镜像,保存下镜像id
然后,进入你要修改的镜像(其实就是运行该镜像的容器):

docker run -it ‘镜像id’ /bin/sh

此时,你会进入容器内部的shell命令行,其实就是一个微型的Linux系统,然后就可以用Linux命令操作该容器,我在这里是升级了Apache版本:
你可以在这里做你需要的改动

apt-get update //获取更新信息
apt-get upgrade //更新版本

3. 生成新镜像
修改后,先执行exit退出容器
然后查找刚才运行的容器信息:

docker ps -a

用docker commit命令从容器打包成镜像:
其中,备注和作者其实不重要,随便写,容器id就是你在上一步查找容器信息时获取的容器id,找你刚才修改的容器,镜像repository就是你打包生成的新镜像的repository

docker commit -m “备注” -a “作者” 容器id 镜像repository

最后,再次docker images就能看到你刚刚生成的新镜像了
最后加个小功能,如何修改镜像的tag:

docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)