docker如何创建镜像:两种主流方式
docker如何创建镜像分为Dockerfile构建和容器提交两种主流方式,Dockerfile适合版本可追溯、持续交付场景,容器提交适合临时调试、快速打包的场景;Dockerfile构建依靠dockerbuild命令读取文本里的分层指令自动生成镜像,提交方式依靠dockercommit把正在运行或者停止的容器快照打包成镜像,容器提交方式不适合长期维护业务镜像,适合测试人员临时保存调试环境,开发上线交付优先选用Dockerfile方案,两种方式都需要本地已经装好Docker引擎,并且docker服务处于running状态,在Linux、WindowsWSL2、macOS的DockerDesktop环境都可以复现。
docker如何创建镜像:Dockerfile构建流程
你先在一个空目录新建名为Dockerfile的文件,文件名没有后缀,文件内从上到下书写分层指令,FROM是第一条指令,用来指定基础镜像,RUN执行容器内的命令,COPY把宿主机文件复制进镜像,EXPOSE声明容器打算开放的端口,CMD设置容器启动时默认执行的程序。每一条指令都会生成一个镜像层,层会缓存,没有改动的指令不会重复构建,能缩短多次打包耗时。
执行构建命令时,进入Dockerfile所在目录,运行dockerbuild-t镜像名:标签.末尾的点代表构建上下文是当前目录,上下文目录里的文件会被传给Docker守护进程,不要把大日志、压缩包放在上下文目录,会拖慢构建速度。标签一般用来区分版本,不写标签默认标记latest。
写Dockerfile时,把变动频繁的指令放在文件靠后位置,变动少的基础配置放在前面,缓存才可以最大化复用。比如依赖包安装放在业务代码复制之前,代码修改后,依赖层不会重新构建。
查镜像。
构建完成后,用dockerimages查看本地镜像列表,确认镜像名称、标签、大小和ID,镜像ID可以在后续启动、推送镜像仓库时使用,镜像名称和标签是更方便识别的标识。
docker如何创建镜像:容器提交方式
容器提交的操作前提是你已经有一个容器,这个容器可以是运行状态,也可以是停止状态,先使用dockerrun拉起基础镜像得到容器,进入容器内部安装软件、修改配置、写入文件,完成所有环境调整。调整完成后,用dockercommit容器ID镜像名:标签,这条命令直接抓取容器当前文件系统快照生成新镜像。
这种方式不会记录修改步骤,没有版本变更记录,后续想要复现环境很难,容器里的临时文件、缓存数据也会一并打进镜像,镜像体积更容易偏大,线上业务不推荐长期使用该方式交付镜像。
| 创建方式 | 可追溯性 | 镜像体积控制 | 适用场景 |
|---|---|---|---|
| Dockerfile构建 | 较好,指令可留存 | 容易分层精简 | 项目上线、CI流水线 |
| dockercommit提交 | 较差,无修改记录 | 不易控制,容易臃肿 | 临时调试、快速保存环境 |
构建完成后,如果你需要共享镜像,可以用dockersave导出镜像为tar包,拷贝到其他机器再用dockerload导入,也可以打标签后推送至镜像仓库,私有仓库和公共仓库都支持该流程。
该方法的适用边界是,你需要拥有宿主机Docker的执行权限,普通用户没有加入docker用户组时,执行docker命令需要搭配sudo,没有宿主机权限、仅能使用容器平台的场景,无法在本地直接执行这一套镜像创建操作。
