如何使你的镜像更小和更效率
当你启动容器时,更小的镜像可以更快的下载下来和载入内存中.更效率的镜像可以方便你用起来更爽.以下就提供了几个要点来保持你的镜像更小化.
用一个合适的基础镜像,比如你想使用
JDK
镜像,你应该使用官方制作的openjdk
镜像为基础镜像.而不应该使用ubuntu
为基础镜像后,再安装openjdk
.使用多级构建.举个例子,当你要部署一个javaweb应用时.你首先要使用
Maven镜像
作为开发环境,但是当你开发完成后,应该重新使用Tomcat镜像
作为运行环境.只需要你把它们写在一个Dockerfile
中,最后保留下来的就是只包含Tomcat镜像
运行环境的javaweb应用.这里你要明白
Dockerfile
文件的特点,它的每条指令会构建一个镜像,比如它有2条指令,它会先以第一条指令构建一个镜像,再在这个镜像的基础上使用第二条指令构建最终镜像,同时会把第一个镜像丢弃掉.我们简化下:假设Maven镜像
作为第一条指令,Tomcat镜像
作为第二条指令,当第二条指令构建完成后,第一条指令构建的开发环境会被丢弃.所以简单的理解多级构建
就是多写几条指令.如果你有许多镜像拥有共同的基础特征,你应该先创建一个基础镜像,再在这个基础镜像上构建其他镜像.因为docker只会加载一次基础镜像,并缓存起来.当你使用该基础镜像构建的其他镜像时,docker会利用这个缓存快速加载其他镜像.
我举个例子,比如你有两个镜像是以一个基础镜像构建的.当第一个镜像被实例化为容器后,你又想实例化第二个镜像为容器.这时候第二个镜像并不会从头开始加载为容器,而是会寻找第一个容器的公共基础部分(已经被缓存起来了),并从这里开始快速构建第二个容器.
保持你的生产镜像足够精简,但是要包含调试工具.你可以以生产镜像为基础镜像,再在该镜像上面增加调试工具层.(这个不多解释,没调试工具出错了都不知道怎么处理)
你应该给你的镜像加上合适的标签,比如
开发环境的标签
,生产环境的标签
,测试环境的标签
等等,不要过度依赖自动化的latest
标签.
哪里和怎样持久化你的数据
避免把你应用的数据直接写在该容器中.这样会增加你容器的大小从而影响效率,并且容器内读写的I/O没有使用
volumes
和挂载卷
快.建议在开发环境的时候使用
挂载卷
,在生产环境的时候使用volumes
挂载卷
就是你docker run -v 本地目录:容器目录
,这样可以方便开发.volumes
就是你使用Dockerfile
的VOLUME
指令创建的公共区域.该区域是独立于容器的,就算容器被销毁,保存在该区域的数据还是存在的.为什么建议生产环境使用volumes
其实很容易理解.因为使用-v 本地目录:容器目录
会使数据太散乱不好管理(比如备份很麻烦,当然,如果你只有一个独立容器,当我没说).
使用CI/CD测试和部署
说白了就是使用远程仓库对你的镜像进项版本控制,就像git一样.你可以申请Docker Hub,这东西就是docker版的github.(www.hedaoshe.com)
开发环境与生产环境的不同点
开发环境
生产环境
使用挂载卷
使用volumes
使用mac和windows的Docker Desktop
开发
使用Docker Engine
作为生产环境,可以更好的与宿主机进行隔离
不用担心网络时间同步
问题
确保你的所有容器的网络时间同步