«

Dockerfile编写教程,构建自己的镜像

时间:2026-10-8 08:23     作者:emer     分类: 无


前言

想用Docker跑自己的项目,不能每次都手动装环境吧?写个Dockerfile,一键构建镜像。本文讲怎么写Dockerfile。

一、什么是Dockerfile

Dockerfile就是一个文本文件,里面写了怎么构建镜像的步骤。

就像写脚本一样,告诉Docker:

  1. 基于哪个基础镜像
  2. 装什么软件
  3. 复制什么文件
  4. 启动什么命令

二、基本结构

# 基于哪个镜像
FROM nginx:alpine

# 维护者信息
MAINTAINER yourname <email@xx.com>

# 工作目录
WORKDIR /usr/share/nginx/html

# 复制文件
COPY index.html .

# 暴露端口
EXPOSE 80

# 启动命令
CMD ["nginx", "-g", "daemon off;"]

三、常用指令

FROM:基础镜像

FROM nginx:alpine
FROM php:7.4-fpm
FROM mysql:5.7

WORKDIR:工作目录

WORKDIR /app

后面的命令都在这个目录里执行。

COPY:复制文件

COPY index.html /usr/share/nginx/html/
COPY ./src /app

RUN:构建时执行命令

RUN apt-get update && apt-get install -y vim

构建镜像的时候执行。

CMD:容器启动时执行

CMD ["nginx", "-g", "daemon off;"]

容器启动后跑的命令。

EXPOSE:暴露端口

EXPOSE 80
EXPOSE 443

只是声明,实际用的时候还要用-p映射。

ENV:设置环境变量

ENV MYSQL_ROOT_PASSWORD=123456
ENV APP_ENV=production

VOLUME:数据卷

VOLUME ["/var/lib/mysql"]

四、实战例子

例子1:部署静态网站

FROM nginx:alpine

WORKDIR /usr/share/nginx/html

COPY index.html .
COPY about.html .

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

例子2:部署PHP项目

FROM php:7.4-fpm

WORKDIR /var/www/html

COPY . .

RUN docker-php-ext-install mysqli pdo pdo_mysql

EXPOSE 9000

CMD ["php-fpm"]

例子3:Python应用

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

五、构建镜像

构建命令

docker build -t mynginx:v1 .

查看构建过程

docker build --progress=plain -t mynginx:v1 .

指定Dockerfile路径

docker build -f docker/Dockerfile -t mynginx:v1 .

六、常用优化技巧

1. 用小镜像

用alpine版本,小很多:

FROM nginx:alpine

2. 合并RUN命令

RUN apt-get update && \
    apt-get install -y vim wget && \
    rm -rf /var/lib/apt/lists/*

不要写多个RUN,合并成一个,减少层数。

3. .dockerignore文件

不想复制的文件写在.dockerignore里:

.git
node_modules
*.log

4. 多层缓存

把不变的放前面,变的放后面。

# 先复制requirements.txt,装依赖(这个不常变)
COPY requirements.txt .
RUN pip install -r requirements.txt

# 再复制代码(这个常变)
COPY . .

七、常见坑

坑1:Dockerfile文件名不对

必须叫 Dockerfile,首字母大写,没有后缀。

坑2:构建时找不到文件

docker build -t mynginx:v1 .

最后那个点不能少,是构建上下文。

坑3:COPY路径不对

COPY index.html .

这个路径是相对于构建上下文的,不是Dockerfile所在目录。

坑4:CMD和RUN搞混

坑5:镜像太大

用alpine版本,或者多阶段构建。

八、多阶段构建

# 构建阶段
FROM node:16 AS build
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npm run build

# 生产阶段
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80

这样最终镜像很小,只有编译后的文件。

总结

记住:

  1. FROM 基础镜像
  2. WORKDIR 工作目录
  3. COPY 复制文件
  4. RUN 构建时执行
  5. CMD 启动时执行
  6. docker build -t 名字 . 构建镜像

最常用:

FROM nginx:alpine
COPY index.html /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

遇到问题加QQ23979811 协助处理

标签: Docker 容器 Dockerfile 构建镜像 镜像制作