Dockerfile 零基础:指令详解 + Compose 对比 + 前端镜像实战

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。

相关推荐
张文君1 小时前
docker使用代理拉取镜像
运维·docker·容器
zzzll11111 小时前
Claude Code离线安装方案揭秘
开发语言·php
codeGoogle2 小时前
自研 IM 还是选择第三方 SDK?企业开发者应该如何权衡?
前端·后端·程序员
陌路202 小时前
Docker教程从入门到精通(0基础)
运维·docker·容器
wling03012 小时前
vasp虚频计算-python脚本
开发语言·windows·python·vasp计算
郝学胜-神的一滴3 小时前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
用户938515635073 小时前
React Context 与自定义 Hook 从底层到实践:「跨层级通信 + 副作用封装」全解析
前端·javascript·react.js
初级炼丹师(爱说实话版)3 小时前
Ubuntu24.04 Docker+vLLM+qianwen2.5-coder-32B部署文档
docker·容器·vllm
滴滴答答哒3 小时前
VUE3+element-plus MultiSelect 多选下拉组件
前端·javascript·vue.js
xrandzj3 小时前
Python面向对象编程入门:类、实例、初始化与封装实践
开发语言·python