Docker 镜像的两种创建方式
发布时间:2026/10/15 5:35:10 锦皓数字建站

Docker 镜像的两种创建方式一、快捷创建镜像方式一docker commit直接使用docker commit将容器的文件系统变更保存为一个新的镜像。1. 语法dockercommit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]2. 参数-a指定提交的镜像作者。-c使用类似 Dockerfile 的指令修改镜像配置例如CMD、ENV等不需要依赖实际的 Dockerfile 文件。-m指定提交时的说明文字。-p提交时暂停容器减少提交过程中发生文件修改的可能性。3. 示例dockercommit-amaxhou-m修改 Nginx 配置mynginx maxhou/mynginx:v01其中mynginx需要提交的容器名称或容器 ID。maxhou/mynginx:v01创建的新镜像名称及标签。-a指定作者。-m添加本次提交的说明。创建成功后可以通过以下命令查看镜像dockerimages也可以使用新镜像创建容器dockerrun-d--namemynginx2 maxhou/mynginx:v014. 特点优点操作简单不需要编写 Dockerfile。可以快速保存容器文件系统中的修改。适合临时调试和快速制作镜像。缺点构建过程不够直观不容易还原镜像的创建步骤。不方便团队协作和后续维护。不适合需要重复构建的生产环境。注意docker commit主要保存容器文件系统的变更并保留原镜像的大部分配置。挂载卷中的数据不会自动打包进新镜像。二、标准创建镜像方式二docker builddocker build通过执行 Dockerfile 中的构建指令来创建镜像。与docker commit不同docker build不需要预先创建一个容器作为提交对象只需要准备 Dockerfile、基础镜像以及相应的构建文件即可。1. 语法dockerbuild[OPTIONS]PATH常用写法dockerbuild-t镜像名称:标签.其中-t指定镜像名称和标签。.指定当前目录为构建上下文。Dockerfile默认读取构建上下文中的Dockerfile文件。Dockerfile 常用指令表格指令功能备注FROM指定构建镜像所使用的基础镜像必须掌握通常是 Dockerfile 的第一条指令MAINTAINER指定镜像维护者已过时推荐使用LABELLABEL为镜像添加元数据可以设置作者、版本、描述等信息COPY将构建上下文中的文件或目录复制到镜像中必须掌握不会自动下载 URL 文件也不会自动解压压缩包ADD将文件或目录添加到镜像中类似COPY但还支持 URL 和自动解压本地 tar 压缩包一般优先使用COPYWORKDIR设置后续指令的工作目录目录不存在时会自动创建必须掌握RUN在构建镜像时执行命令必须掌握例如安装软件、创建目录VOLUME声明容器的数据卷挂载点用于持久化或共享数据具体挂载方式可由运行容器时配置EXPOSE声明容器预期监听的端口仅作声明不会自动发布端口需要通过docker run -p等方式映射ENV设置环境变量必须掌握变量会保留在镜像中并在容器运行时可用CMD指定容器启动时默认执行的命令或参数必须掌握可被docker run后面提供的命令参数覆盖ENTRYPOINT指定容器启动时执行的程序必须掌握常用于设置容器的固定启动入口ARG定义构建时参数可以通过docker build --build-arg传入通常不直接作为运行时环境变量使用SHELL指定 shell 格式指令使用的 shell使用较少可用于调整RUN等指令的 shell 执行方式USER指定后续构建指令及容器运行时使用的用户应了解常用于避免容器以 root 身份运行HEALTHCHECK设置容器健康检查用于检测容器中的服务是否正常运行ONBUILD设置在当前镜像被其他 Dockerfile 作为基础镜像构建时触发的指令使用较少适合制作基础镜像STOPSIGNAL指定停止容器时发送给容器主进程的信号使用较少默认停止信号通常为SIGTERM补充CMD 和 ENTRYPOINT 的区别CMD指定默认启动命令或默认参数通常可以被运行容器时提供的命令覆盖。ENTRYPOINT指定容器启动时执行的程序通常用于固定启动入口。两者配合使用时CMD可以为ENTRYPOINT提供默认参数。例如FROM eclipse-temurin:17-jre WORKDIR /app COPY app.jar app.jar ENTRYPOINT [java, -jar, app.jar]构建镜像dockerbuild-tmyapp:v1.启动容器dockerrun-d--namemyapp myapp:v1此时容器会执行java-jarapp.jar补充RUN 和 CMD 的区别RUN在docker build构建镜像的过程中执行执行结果可以保存在镜像文件系统中。CMD指定容器启动时的默认执行命令或参数。简单记忆RUN 是构建时执行CMD 和 ENTRYPOINT 是容器启动时执行。2. 示例假设当前项目目录如下nginx-project/ ├── Dockerfile └── nginx.confDockerfile 内容FROM nginx:alpine COPY nginx.conf /etc/nginx/nginx.conf其中FROM指定基础镜像。COPY将构建上下文中的文件复制到镜像内。进入nginx-project目录执行dockerbuild-tmynginx:v01.Docker 会读取 Dockerfile按照其中的指令逐步构建镜像。构建完成后可以使用以下命令查看镜像dockerimages然后基于新镜像启动容器dockerrun-d--namemynginx mynginx:v013. 特点优点使用 Dockerfile 明确记录构建步骤。更容易重复构建和维护镜像。适合团队协作、持续集成和自动化部署。便于进行版本管理。缺点需要编写和维护 Dockerfile。需要准备基础镜像及相关构建文件。需要了解常见的 Dockerfile 指令。三、docker commit 和 docker build 的区别对比项docker commitdocker build创建依据已有容器的文件系统变更Dockerfile 和构建上下文是否需要已有容器需要不需要是否需要 Dockerfile不需要通常需要是否可以修改镜像配置可以通过-c等参数修改部分配置可以通过 Dockerfile 指令配置可重复构建性较差依赖容器当前状态较好构建步骤有明确记录适用场景临时调试、快速保存修改正式项目、团队协作、自动化部署需要注意docker commit并不是把容器的所有内容完整打包。它主要保存容器文件系统的变更挂载卷中的数据不会自动进入新镜像。四、总结Docker 提供了两种创建镜像的思路方式一docker commit直接将已有容器的文件系统变更保存为镜像操作简单适合快速保存修改。方式二docker build通过 Dockerfile 描述镜像的构建步骤不需要预先创建一个待提交的容器更适合规范化开发和部署。在实际项目中例如部署 Spring Boot 应用时通常推荐使用 Dockerfile将基础运行环境、JAR 包和启动命令明确写入构建流程中便于后续维护和自动化部署。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。