什么是Dockerfile?
Dockerfile 是一个文本文件,包含一组指令,用于自动化构建Docker镜像。每条指令会创建一个新的镜像层,最终组合成一个完整的容器运行环境。
Dockerfile 核心指令详解
1. FROM
FROM ubuntu:20.04
- 作用:指定基础镜像(必须为第一条指令)
- 注意:
- 尽量使用官方镜像
- 指定精确的版本号应该避免使用
latest - 推荐使用Alpine或Slim镜像减小体积
Alpine 镜像:基于 Alpine Linux,采用轻量级的
musl libc和BusyBox,基础镜像仅 5-10 MB,远小于传统发行版。Slim 镜像:基于 Debian 的精简版本,仅保留核心运行环境,体积通常为 50-100 MB比完整版小 60% 以上。
2. LABEL
LABEL maintainer="your@email.com"
LABEL version="1.0"
- 作用:添加元数据(非必须,但推荐),更推荐在
docker build时通过--label参数添加
3. ENV
ENV APP_HOME=/app \
NODE_ENV=production
- 作用:设置环境变量(会被持久化到镜像中)
- 注:敏感信息(如密码)不要用ENV,应通过
docker run -e传入
4. WORKDIR
WORKDIR /app
- 作用:
- 设置工作目录类似cd命令
- 如果目录不存在会自动创建
- 注意:始终使用绝对路径
5. COPY
COPY package.json .
COPY src/ ./src/
COPY --chown=user:group files/ /destination/
- 作用:复制本地文件到镜像
- 注意:
- 第一个参数是构建上下文中的路径
- 可使用
.dockerignore文件过滤不需要的文件 - 与
ADD的区别:ADD可以解压tar包和下载URL,但推荐优先使用COPY
6. RUN
RUN apt-get update && \
apt-get install -y \
git \
curl \
&& rm -rf /var/lib/apt/lists/*
- 作用:
- 执行命令并创建新镜像层
- 避免运行后台进程(Dockerfile中的命令需立即完成)
- 及时清理临时文件(如apt缓存)
- 合并多个命令到一行
7. EXPOSE
EXPOSE 8080
- 作用:只是声明容器运行时监听的端口(实际映射需要在
docker run时通过-p参数指定) - 注:仅用于文档说明,不会自动开启端口映射
8. CMD
CMD ["python", "app.py"] #json格式
CMD python app.py #shell格式
- 作用:指定容器启动时的默认命令(可被
docker run参数覆盖) - 格式:推荐使用exec格式(JSON数组)
- 注意:一个Dockerfile只能有一个有效的CMD,即执行完第一个CMD不会再执行其他的CMD
9. ENTRYPOINT
ENTRYPOINT ["python"]
CMD ["app.py"]
- 作用:设置容器的主程序(不可被覆盖)
- 组合使用:CMD 作为 ENTRYPOINT 的默认参数
- 使用场景:制作"可执行"的镜像(如
docker run my-image --help)
10. USER
USER nobody
- 作用:指定运行容器的用户生产环境应为非root用户,增强安全性
- 前提:需要先在镜像中创建用户(通过
RUN useradd)
构建Nginx的Dockerfile示例
1.dockerfile
# 使用官方Nginx Alpine镜像(轻量级)
FROM nginx:1.25-alpine
# 使用LABEL写维护者标签
LABEL maintainer="your@email.com"
LABEL description="Custom Nginx container with security enhancements"
# 设置环境变量
ENV NGINX_PORT=80 \
NGINX_ROOT=/usr/share/nginx/html \
TZ=Asia/Shanghai
# 安装必要的工具(生产环境可跳过)
RUN apk update && \
apk add --no-cache \
curl \
tzdata && \
# 清理缓存
rm -rf /var/cache/apk/* && \
# 创建日志目录(Alpine默认已创建)
mkdir -p /var/log/nginx && \
# 修改Nginx运行用户为nginx(官方镜像已自带nginx用户)
chown -R nginx:nginx /var/log/nginx
# 设置工作目录
WORKDIR ${NGINX_ROOT}
# 复制自定义配置文件
COPY nginx.conf /etc/nginx/nginx.conf
COPY conf.d/default.conf /etc/nginx/conf.d/default.conf
# 复制静态文件(使用.dockerignore过滤不需要的文件)
COPY ./src/ .
# 暴露端口(建议与配置中的监听端口一致)
EXPOSE ${NGINX_PORT}
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:${NGINX_PORT} || exit 1
# 以非root用户运行(官方镜像已配置nginx用户)
USER nginx
# 启动命令(使用exec形式)
CMD ["nginx", "-g", "daemon off;"]
文件结构:
/my-nginx/
├── dockerfile
├── nginx.conf # 主配置文件
├── conf.d/
│ └── default.conf # 站点配置
├── src/ # 静态文件目录
│ ├── index.html
│ └── assets/
└── .dockerignore # 忽略文件
2.构建镜像
docker build -t my-nginx:1.0 .
3.运行容器
# 基础运行
docker run -d -p 80:80 --name my-nginx my-nginx:1.0
# 带环境变量覆盖
docker run -d -p 8080:80 -e NGINX_PORT=80 --name my-nginx my-nginx:1.0
# 挂载配置文件(用于开发调试)
docker run -d \
-p 80:80 \
-v $(pwd)/src:/usr/share/nginx/html \
-v $(pwd)/conf.d:/etc/nginx/conf.d \
--name my-nginx \
my-nginx:1.0
1580

被折叠的 条评论
为什么被折叠?



