Dockerfile是一份纯文本的镜像构建配方,里面由一条条固定指令组成,通过`docker build`命令就可以自动编译生成docker镜像,镜像运行之后才成为容器。它采用分层构建机制,每一条指令都会生成一层只读镜像层,Docker会复用未改动的缓存层,以此加快构建速度。 Dockerfile里面的指令分为两大类,一类是**构建阶段指令**,例如`FROM`、`RUN`、`COPY`,执行于镜像打包的时候,用来选定基础镜像、安装依赖、拷贝代码,最终固化到镜像里面;另一类是**容器运行时指令**,像`CMD`、`ENTRYPOINT`、`VOLUME`、`EXPOSE`,这些只做配置,build阶段不会执行,只有容器启动之后才生效。注意EXPOSE仅作为文档说明,不会真正开放端口。
以下是Dockerfile指令表:
| 指令 | 作用 | 示例 | 关键说明 |
|---|---|---|---|
FROM |
指定基础镜像,Dockerfile 第一行有效指令 | FROM python:3.11-slim |
必须放最开头;尽量用 slim 轻量镜像,减小体积 |
LABEL |
添加元数据(作者、版本、描述) | LABEL author="FDE" version="1.0" description="First‑CC财务BI" |
仅元信息,不影响运行,用于仓库标识 |
ENV |
设置容器内环境变量 | ENV TZ=Asia/Shanghai ENV=production |
容器内部全局生效;可被 docker‑compose env 覆盖 |
ARG |
构建时临时变量,构建结束就消失 | ARG APP_VERSION=v1.0 |
只在docker build阶段可用,容器运行时读不到 |
WORKDIR |
设置容器内工作目录 | WORKDIR /opt/fde |
自动创建目录;后续 RUN/COPY 都以此为根,尽量不要频繁 cd |
COPY |
把宿主机文件复制到容器 | COPY ./src /opt/fde/src |
拷贝本地代码、配置;支持通配符;保留文件权限 |
ADD |
复制文件,额外支持自动解压 tar、远程 url 下载 | ADD demo.tar.gz /opt/fde/ |
普通文件优先用 COPY;ADD 容易引入意外解压行为 |
RUN |
构建镜像阶段执行命令,生成镜像层 | RUN apt update && apt install -y nginx |
每一条 RUN 产生一层镜像;多条命令用&&合并,减少镜像层数 |
EXPOSE |
声明容器打算暴露的端口(仅文档提示,不会真正开放端口) | EXPOSE 8000 443 |
只是注释,真正端口映射靠 docker‑compose/run -p |
VOLUME |
定义数据卷,容器运行时挂载目录 | VOLUME ["/opt/fde/db","/opt/fde/logs"] |
构建阶段无效;运行时自动挂载,防止数据写在容器内部丢失 |
USER |
切换容器运行用户 | USER admin |
不要一直用 root 运行,提升安全;注意权限 Permission denied 问题 |
CMD |
容器启动默认执行命令,docker‑run 可覆盖 | CMD ["python","main.py"] |
只能有一个 CMD,多条只生效最后一条;数组格式优先 |
ENTRYPOINT |
容器入口程序,不容易被 run 参数覆盖 | ENTRYPOINT ["/bin/bash","start.sh"] |
CMD 可以给 ENTRYPOINT 传参数 |
Dockerfile只负责"制作镜像",它和docker‑compose是分工配合的关系:Dockerfile解决镜像怎么造,compose解决镜像怎么跑,负责配置端口、挂载卷、网络、环境变量。工程上要配合`.dockerignore`排除模型、密钥、日志等文件,不要打进镜像;大模型权重不打包进镜像,通过宿主机volumes挂载到容器内,同时尽量使用轻量基础镜像,合并RUN命令减少镜像层数。 完整链路:编写Dockerfile → docker build构建镜像 → 通过docker‑compose或者docker run启动容器。
以下是dockerfile 和 docke-compose.yml的对比表:
| 对比项 | Dockerfile | docker‑compose.yml |
|---|---|---|
| 核心定位 | 镜像构建配方:定义如何制作镜像 | 容器编排配置:定义如何运行镜像 |
| 文件本质 | 构建镜像的脚本,文本指令 | 多容器服务的运行描述 YAML 配置文件 |
| 执行时机 | 执行docker build构建镜像阶段生效 |
执行docker‑compose up/down启动 / 管理容器阶段生效 |
| 主要能干什么 | 选择基础镜像、安装依赖、复制代码、设置程序默认启动命令 | 配置端口映射、宿主机目录挂载、环境变量、容器网络、服务依赖、容器数量、重启策略 |
| 产生产物 | 生成Docker 镜像 (image),静态软件包 | 启动 / 停止容器 (container),运行中的进程实例 |
| 运行命令 | docker build -t xxx:tag . |
docker‑compose up -d / docker‑compose down |
| 处理数据挂载 | 仅声明VOLUME,不能指定宿主机实际路径 |
可以明确配置宿主机 ↔ 容器目录挂载,实现数据持久化 |
| 网络能力 | 只能设置容器内部基础环境,不能配置网络 | 自定义网络、多容器之间服务互相访问 |
| 多容器管理 | 一个 Dockerfile 只能生成单个镜像 | 可以同时管理多个容器(后端、nginx、数据库等) |
| 能否覆盖参数 | 构建时参数固化进镜像,修改需要重新 build | 启动时可以覆盖镜像内部 ENV、CMD 等配置,无需重新构建镜像 |
| 项目搭配 | compose 中通过build: .调用 Dockerfile 自动构建镜像 |
可直接使用现成镜像,也可调用 Dockerfile 构建本地镜像 |
| 典型文件内容 | FROM、COPY、RUN、WORKDIR、CMD、EXPOSE | services、volumes、networks、ports、environment、depends_on |
| git 提交 | 可以提交,属于项目源码 | 可以提交,属于项目部署配置 |
现在我们在Linux服务器上来构建dockerfile前端镜像吧!
步骤一:在服务器上创建专属目录,存放前端代码、Dockerfile、配置文件

把前端项目代码上传到这个文件夹下。
步骤二:创建 Dockerfile


步骤三:在服务器中构建镜像

构建完成查看镜像:

步骤四:启动容器测试
浏览器访问:服务器IP:8080,就能打开这个index.html。

