Docker系列---Dockerfile镜像文件

文章目录

Dockerfile镜像文件

一、什么是dockerfile

之前我们拉取镜像的时候,都是在仓库拉取的

我们也介绍了怎么上传镜像

那么问题来了:

如果我想把自己的 Go 程序、运行环境以及相关配置打包成一个 Docker 镜像,应该怎么做?

一种方式是:

  1. 先启动一个基础容器
  2. 进入容器,安装需要的软件
  3. 把自己的程序复制进去
  4. 配置启动命令
  5. 再把容器提交为一个镜像

但这种方式有一个问题:每次构建镜像都需要手动重复这些操作

有没有办法把这些操作提前写下来,让 Docker 自动执行?

这就是 Dockerfile 要解决的问题

Dockerfile 是一个文本文件,我们可以在其中编写一系列指令,描述镜像应该如何构建
Docker 根据这些指令自动完成镜像构建

比如:我们现在有一个Go项目,希望把它打包成一个Docker镜像

你可以在项目中编写 Dockerfile,告诉 Docker:

  1. 使用什么基础镜像
  2. 将项目文件复制到哪里
  3. 执行什么命令
  4. 容器启动时运行什么程序

最后 Docker 就会根据这些指令构建出镜像

二、dockerfile基本结构

那我们用什么语句编写dockerfile文件呢

下面我们来介绍dockerfile的基本结构

Dockerfile 由一条条指令组成

每条指令通常采用这样的形式:

复制代码
指令 参数

例如:

复制代码
FROM nginx
WORKDIR /app
COPY index.html /app/

我们先认识这三条指令

1) FROM 指定基础镜像

复制代码
FROM nginx

表示以 nginx 镜像作为基础镜像,在它的基础上继续构建。

2) WORKDIR 设置工作目录(属于容器里面的目录)

复制代码
WORKDIR /app

表示将后续指令的工作目录设置为 /app

如果目录不存在,Docker 会自动创建。

3)COPY 复制文件

复制代码
COPY index.html /app/

表示将构建上下文中的 index.html 复制到镜像的 /app/ 目录下(/app是工作目录)

Dockerfile是如何构建的呢

Docker 在构建时,会按照指令顺序执行:

  1. 以 nginx 作为基础镜像
  2. 在镜像中设置 /app 工作目录
  3. 将 index.html 复制到 /app

最终得到一个新的镜像

这里还要联系之前学过的镜像分层原理:

Dockerfile 中的部分构建指令会产生新的镜像层

例如,FROM 引入基础镜像,COPY、RUN 等指令在构建过程中可以产生新的层。并不是每一条 Dockerfile 指令都会产生一个独立镜像层

三、Dockerfile 常用指令

指令 作用 使用方法
FROM 指定基础镜像 FROM ubuntu:22.04
RUN 构建镜像时执行命令 RUN apt-get update
COPY 复制文件到镜像 COPY app.jar /app/
ADD 复制文件,支持本地 tar 自动解压 ADD app.tar.gz /app/
WORKDIR 设置工作目录 WORKDIR /app
ENV 设置环境变量 ENV APP_PORT=8080
ARG 定义构建参数 ARG VERSION=1.0
CMD 设置容器默认启动命令 CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT 设置容器入口程序 ENTRYPOINT ["nginx"]
EXPOSE 声明容器监听端口 EXPOSE 8080
LABEL 添加镜像元数据 LABEL version="1.0"
USER 指定运行用户 USER nginx
VOLUME 声明数据卷挂载点 VOLUME ["/data"]
HEALTHCHECK 设置容器健康检查 `HEALTHCHECK CMD curl -f http://localhost/
SHELL 指定默认 Shell SHELL ["/bin/bash", "-c"]
STOPSIGNAL 设置容器停止信号 STOPSIGNAL SIGTERM
ONBUILD 设置下游构建触发指令 ONBUILD COPY . /app

容易混淆的指令

指令 执行时机 / 区别
RUN 镜像构建阶段执行
CMD 容器启动时执行,可被运行时命令替换
ENTRYPOINT 指定容器入口程序,运行时参数通常追加到入口程序后
COPY 复制文件
ADD 复制文件,还支持本地 tar 自动解压
ARG 构建阶段参数
ENV 镜像运行环境中的环境变量
EXPOSE 声明端口,不会自动映射宿主机端口

完结撒花~

相关推荐
也非非也1 小时前
iPhone 中国区 AI 落地:Apple 与阿里千问合作的技术观察
大数据·人工智能·ios·agent·iphone·智子
阡陌数智1 小时前
通过特化小型语言模型的词表将推理成本降低百分之七十七
人工智能·语言模型·自然语言处理
January12071 小时前
【AI方法笔记】2026-11-02:模型流式吐 JSON 时,前端会遇到四种崩法
前端·人工智能·笔记·json
集芯微电科技有限公司1 小时前
40V/24A高频率增强型GaN HEMT功率开关管/高频DC转换/电动工具/GaN充电器 方案首选
人工智能·科技·单片机·嵌入式硬件·深度学习·神经网络·生成对抗网络
CC数分1 小时前
统计学基础|先把问题问对:数据分析的六大类型
大数据·人工智能·算法
-星空下无敌1 小时前
Windows Docker K8s 安装部署Naocs ,SpringBoot 3.x 4.x 整合Naocs 版本兼容 配置中心、服务注册与发现
windows·docker·nacos·kubernetes·springboot·alibaba
Elastic 中国社区官方博客1 小时前
基于 Elasticsearch 与 Jina AI 的全模态智能搜索实践:技术全解析
大数据·人工智能·elasticsearch·搜索引擎·ai·信息可视化·jina
xiaoyunxuexibiji1 小时前
国资国企采购穿透式监管建设方案:运营体系、部署模式与智能应用
人工智能
芥子沫1 小时前
从零开始用 Docker 部署 Hoppscotch:自建 API 调试平台的完整教程
docker·接口测试·api开发·api管理