Docker制作镜像Dockerfile文件相关参数;以及镜像分层思想

本文详细介绍了Dockerfile中常用的指令,如FROM、MAINTAINER、RUN等,以及容器分层和Copy-on-Write原理,解释了如何通过这些指令管理和构建镜像,确保高效和灵活的容器操作。

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

1.FROM :指定基础镜像(除了from其他命令都是非必须的)
2.MAINTAINER:指定作者信息
3.RUN:    在镜像构建时就要执行的命令
4.CMD: 容器启动是运行的命令
5.EXPOSE: 声明容器要监听的端口
6.ENV:   设置环境变量
7.ADD/COPY: 将本地上的文件或目录复制到镜像(ADD指令时,Docker会自动解压缩被复制的压缩文件)
8.WORKDIR: 指定工作目录
9.STOPSIGNAL : 指定容器退出的信号
13:VOLUME: 在容器里创建卷挂载
14:HEALTHCHECK: 用于定义容器的健康检查行为
15: ARG: 在dockerfile文件里的参数,可以方便引用,传给其他指令
16: USER: 用于设置容器运行时的用户
12:LABEL:  Docker 官方推荐使用 LABEL 指令来代替 MAINTAINER 指令,
因为 LABEL 指令提供了更丰富的元数据信息,并且更具有可扩展性和可读性

======================

10.CMD:会在docker run时运行(可以被docker run参数覆盖)
只执行一次,如果有多个CMD默认只会执行最后一个。
11.ENTRYPOINT:也是多个执行最后一个。(不可被docker run提供的参数覆盖)

###如果同时存在CMD和ENTRYPOINT?
1.如果同时指定了 CMD 和 ENTRYPOINT,则 CMD 的内容将作为 ENTRYPOINT 命令的默认参数。
可以通过 docker run 命令的参数来覆盖 CMD 中的默认参数。

==================

镜像分层 
1.Copy-on-Write 可写容器层
2.容器层以下所有镜像层都是只读的
3.docker从上往下依次查找文件
4.容器层保存镜像变化的部分,并不会对镜像本身进行任何修改
#所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中,
只有容器层是可写的,容器层下面的所有镜像层都是只读的

Copy-on-Write
**容器增,删,改,查思想(写时拷贝,只有修改文件时,才拷贝镜像层的数据到容器层)
1.添加文件
在容器中创建文件时,新文件被添加到容器层中。

2.读取文件 
在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存。

3.修改文件 
在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。

4.删除文件 
在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。

只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

### Docker镜像Dockerfile的关系 #### 区别 Docker镜像是由一系列分层文件系统构成,这些层次包含了应用程序及其依赖环境所需的一切资源。一旦创建完成,镜像即成为只读模板,用于启动容器实例[^3]。 相比之下,Dockerfile则是一种特殊的文本文件,定义了一组指令用来描述如何自动化地构建一个新的镜像。通过指定基础镜像、安装软件包、设置工作目录等一系列操作步骤,最终可以利用`docker build`命令依据此脚本生成具体的镜像文件[^5]。 #### 联系 两者之间存在着紧密关联:每一个成功的Docker镜像背后几乎都有一个对应的Dockerfile作为其构建蓝本;反过来讲,任何有效的Dockerfile都可以被解释并执行从而产出相应的Docker镜像。因此可以说,Dockerfile是通往可重复部署的理想途径之一,而Docker镜像则是这一过程的结果产物[^1]。 --- ### 使用方法 要从现有的Docker镜像中获取有关原始Dockerfile的信息并非总是可行,因为官方仓库中的大多数公共镜像并不会附带源码级别的细节说明。不过,仍有一些间接手段可供尝试: - **使用 `docker history` 查看历史记录** 此命令能够展示给定镜像各层的历史变更情况,虽然无法直接还原完整的Dockerfile内容,但却能提供关于每一层是如何形成的线索。例如: ```bash docker history <image_name> ``` - **参考官方文档或社区贡献** 对于某些流行的基础镜像(如Ubuntu、CentOS),开发者通常会在GitHub等平台上维护着标准版本的Dockerfiles供他人学习借鉴。访问相应项目的主页往往能找到最权威的第一手资料[^2]。 另外,在实际开发过程中更常见的情形是从零开始编写自己的Dockerfile来满足特定需求。这涉及到理解各种可用的关键字语法,并合理安排它们之间的顺序以确保最佳实践的应用效果。下面给出一段简单的Python Web应用示例代码片段: ```dockerfile FROM python:3.9-slim-buster WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "app.py"] ``` 上述例子展示了如何基于官方提供的精简版Python运行时环境快速搭建起适合生产使用的Web服务框架[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值