6月3日 00:04
Docker 镜像和 Dockerfile 是什么?从零构建镜像详解
Docker 镜像是容器的模板——只读的文件包,包含运行应用所需的一切(代码、运行时、依赖、配置)。Dockerfile 是构建镜像的脚本——一行一个指令,告诉 Docker 怎么组装镜像。
镜像是什么
镜像是一个分层的文件系统。每个指令(RUN、COPY、ADD)创建一层,层层叠加。好处:多个镜像共享相同的基础层,节省磁盘和拉取时间。
镜像本身不可变。运行容器时,Docker 在镜像顶部加一个可写层——容器修改文件只影响这个可写层,不修改镜像。
Dockerfile 基本结构
逐行解读:
- FROM:基础镜像,你的镜像在此之上构建
- WORKDIR:设置工作目录,后续指令都在这个目录下执行
- COPY:拷贝文件到镜像里
- RUN:构建时执行命令(安装依赖等)
- EXPOSE:声明端口(文档作用,不实际映射)
- CMD:容器启动时执行的命令
构建镜像
-t myapp:v1 给镜像打标签,. 表示 Dockerfile 在当前目录。
Dockerfile 优化技巧
1. 利用缓存:Docker 按层缓存。package.json 没变时 npm ci 用缓存,不用重新安装。所以先 COPY package.json 再 COPY 源码——源码变了不影响依赖缓存。
2. .dockerignore:排除不需要的文件:
不加 .dockerignore 会把 node_modules 也 COPY 进去,既慢又大。
3. 多阶段构建:编译和运行分开,运行镜像不需要编译工具。详见多阶段构建专题。
镜像标签管理
不要只用 latest 标签——无法回滚。用版本号(v1.2.3)或 git commit hash 标记每个镜像。