docker commit创建自己的容器副本

本文介绍了如何通过`docker commit`命令在Ubuntu容器中安装vim后,提交一个新的镜像副本,并将其命名为`unbuntu_with_vim:WIND`。此外,还展示了如何利用`docker export`和`docker import`来导出和导入容器,以创建带有vim的镜像。这两种方法都可以有效地管理自定义Docker镜像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

docker commit创建自己的容器副本

docker commit 提交一个容器副本,使之成为一个新的镜像。

下面是我们在ubuntu里面添加一个vim工具之后,提交一个副本,打包成一个新的带vim工具的镜像

[root@WIND ~]# docker exec -it f1f3be2dbfc5 /bin/bash
root@f1f3be2dbfc5:/# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]

root@f1f3be2dbfc5:/# apt-get install vim
Reading package lists... Done
Building dependency tree
Reading state information... Done

[root@WIND ~]# docker commit -m 'ubuntu add vim , user WIND' f1f3be2dbfc5 unbuntu_with_vim:WIND
sha256:c56e4c03ee3a0e7285fa59b2a1c41e4251c670c6b7a88c35ff33c18eabdc9f06
[root@WIND ~]#
[root@WIND ~]#
[root@WIND ~]# docker images
REPOSITORY         TAG          IMAGE ID       CREATED          SIZE
unbuntu_with_vim   WIND         c56e4c03ee3a   4 seconds ago    179MB
tomcat             latest       fb5657adc892   2 months ago     680MB
ubuntu             latest       ba6acccedd29   4 months ago     72.8MB

可以看到我们自己的副本,比官方的镜像大了大概100M。

-m 提交信息描述
-a 作者信息
如果我们不想用docker commit
用docker export ,import也是可以的

[root@WIND ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS          PORTS     NAMES
cfc74b0d5a66   nginx     "/docker-entrypoint.…"   5 hours ago   Up 5 hours      80/tcp    stupefied_chebyshev
f1f3be2dbfc5   ubuntu    "/bin/bash"              5 hours ago   Up 26 minutes             u009
[root@WIND ~]# docker export f1f3be2dbfc5 > ubuntu_with_vim.tar.gz
[root@WIND ~]#
[root@WIND ~]# cat ubuntu_with_vim.tar.gz | docker import - imp_ubuntu_with_vim:u009_latest
sha256:b647c0530a2d34fabd5f6d1b3f77a03daa6cb191d8b5aecfd9320437f0b9ebb7
[root@WIND ~]# docker images
REPOSITORY            TAG           IMAGE ID       CREATED          SIZE
imp_ubuntu_with_vim   u009_latest   b647c0530a2d   11 seconds ago   178MB
[root@WIND ~]# docker run -it b647c0530a2d /bin/bash
root@7acb7ba6797b:/# cat /tmp/a.txt
Hello
installd vim
root@7acb7ba6797b:/# vim /tmp/a.txt

一样可以正常使用vim命令

<think>我们正在讨论Docker commitDocker Compose和Dockerfile的区别。这三个都是Docker生态中的重要概念,但用途和适用场景不同。下面我将逐一解释它们,指出关键区别。1.**Docker commit**-用于从正在运行的容器创建新的镜像。-操作对象是容器(container)。-通常用于临时保存容器状态的场景,但因其可追溯性差,不推荐作为构建镜像的主要方式。-示例:修改运行中的容器后,直接提交镜像:```bashdocker commit<container_id>new_image:tag```2.**Dockerfile**-是一个文本文件,包含一系列指令(如`FROM`,`RUN`, `COPY`等),用于定义镜像的构建过程。-操作对象是镜像(image)。-通过`docker build`命令执行构建,生成不可变的镜像层。-优势:可重复构建、版本控制友好、符合基础设施即代码(IaC)理念。-示例(见引用[4]):```dockerfileFROM python:3.9WORKDIR/testADD ./testRUN pipinstall -r requirements.txtCMD ["python","hello_store.py"]``` 3. **DockerCompose**-是一个用于定义和运行多容器Docker应用的工具,通过YAML文件(`docker-compose.yml`)配置服务、网络、卷等。-操作对象是多个容器组成的应用栈(applicationstack)。-支持一键启动/停止整个应用环境,简化复杂应用的部署。-依赖`docker-compose`命令行工具(安装方法见引用[1])。-示例(引用[2]提到):若需构建镜像,需在Compose文件中指定`build`路径及Dockerfile;若直接用现有镜像,则只需配置`image`字段。---### **核心区别总结**|**维度**| **Dockercommit**|**Dockerfile**| **DockerCompose**| |----------------|-------------------------|-------------------------|--------------------------| |**操作对象**|容器 →生成新镜像|文本指令→构建镜像| YAML文件→编排多容器应用|| **适用场景**|临时保存容器状态|标准化构建镜像|多服务应用部署与管理|| **可维护性**|低(黑盒操作,难追溯)|高(声明式,版本可控)|高(集中管理服务依赖)|| **典型命令**| `docker commit`| `docker build`| `docker composeup`|--- ###**使用场景示例**- **紧急调试**:用`docker commit`快速保存问题现场,但后续需用Dockerfile重构镜像。-**持续集成**:用Dockerfile构建可重复的镜像,确保环境一致性。-**开发环境**:用Docker Compose一键启动Web服务+数据库+缓存等全套依赖。---### **相关问题**1.为什么生产环境推荐使用Dockerfile而非`docker commit`构建镜像?2. DockerCompose如何管理容器间的网络通信?请举例说明。3.如何在Dockerfile中优化镜像层大小?列举关键指令。4.若需在Docker Compose中部署一个需要构建镜像的服务和一个直接拉取镜像的服务,YAML文件应如何配置?5.`dockercommit`生成的镜像Dockerfile构建的镜像在分层结构上有何区别?</think>### Docker commitDocker Compose 与 Dockerfile 的区别解析 #### **1. Docker commit** - **本质**:基于运行中的容器创建镜像 - **用途**:保存容器当前状态(如调试后的环境) - **操作对象**:容器(Container) - **特点**: - 手动操作(非声明式) - 生成镜像包含所有临时修改(可能含冗余数据) - 不利于版本控制和自动化 - **示例**: ```bash docker run -it ubuntu bash # 启动容器修改 docker commit <容器ID> my_custom_image # 提交为新镜像 ``` #### **2. Dockerfile** - **本质**:镜像构建的**声明式脚本** - **用途**:定义镜像的构建流程(基础镜像→依赖→配置→启动命令) - **操作对象**:镜像(Image) - **特点**: - 文本文件(可版本控制) - 通过`docker build`生成**不可变镜像** - 分层构建(优化存储和构建速度) - **关键指令**(引用[4]示例): ```dockerfile FROM python:3.9 # 基础镜像 WORKDIR /test # 工作目录 COPY . /test # 复制文件 RUN pip install ... # 安装依赖 CMD ["python", "app.py"] # 启动命令 ``` #### **3. Docker Compose** - **本质**:多容器应用的**编排工具** - **用途**:定义和运行相互依赖的容器组(如Web+DB+Cache) - **操作对象**:容器集群(Multi-container) - **特点**: - 通过YAML文件(`docker-compose.yml`)描述服务关系 - 支持一键启停整个应用栈 - 可集成Dockerfile构建镜像(引用[2]) - **典型场景**: ```yaml services: web: build: . # 使用当前目录Dockerfile构建镜像 ports: ["8080:8080"] db: image: postgres # 直接使用现有镜像 ``` --- ### **核心区别总结** | **维度** | **Docker commit** | **Dockerfile** | **Docker Compose** | |----------------|-------------------------|-------------------------|--------------------------| | **操作目标** | 容器 → 生成新镜像 | 代码 → 构建镜像 | YAML → 编排多容器应用 | | **可重复性** | 低(依赖手动操作) | 高(声明式脚本) | 高(声明式编排) | | **适用场景** | 临时保存容器状态 | 标准化镜像构建 | 多服务应用部署与管理 | | **版本控制** | 困难 | 容易(文本文件) | 容易(YAML文件) | > 注:三者可协同使用,例如用Dockerfile构建镜像Docker Compose编排服务 → Docker commit临时保存问题现场[^2][^3]。 --- ### **相关问题** 1. **镜像构建流程** - 为什么Dockerfile构建的镜像比`docker commit`生成的更推荐用于生产环境? - 如何在Dockerfile中通过`COPY`和`ADD`指令优化构建层缓存? 2. **容器编排实践** - 当Docker Compose中同时包含`build`(需构建镜像)和`image`(直接拉取镜像)的服务时,启动顺序如何控制? - 如何通过Docker Compose实现服务的高可用伸缩(如Web服务的副本数配置)? 3. **技术对比** - `docker commit`生成的镜像Dockerfile构建的镜像在分层存储结构上有何本质区别? - 如果需要在Docker Compose中使用本地构建的镜像,YAML文件应如何配置(参考引用[2][3])? 4. **调试与运维** - 如何结合`docker commit`和`docker diff`命令快速诊断容器运行时问题? - 在Kubernetes环境中,Docker Compose的哪些功能会被替代? 5. **安全与优化** - 为什么Dockerfile中`RUN apt-get update && apt-get install`应合为单条指令? - 如何避免通过`docker commit`提交镜像包含敏感数据(如密码)? > 提示:回答时可结合镜像层原理、声明式vs命令式设计思想等展开[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值