当前位置: 首页 > news >正文

在运维工作中,docker file 用什么构建容器的?

在运维工作中,Dockerfile 是用于定义容器镜像构建步骤的脚本文件,通过 docker build 命令执行该脚本,可以自动构建出一个完整的 Docker 镜像。下面用简单易懂的方式解释整个过程:

一、Dockerfile 是什么?

Dockerfile 就是一个文本文件,里面写了一堆指令(类似“菜谱”),告诉 Docker 如何构建一个镜像。例如:

# 基础镜像(相当于“原材料”)
FROM alpine# 安装软件(相当于“做菜步骤”)
RUN apk add --no-cache nginx# 复制文件(把宿主机的文件复制到镜像里)
COPY index.html /var/www/html/# 暴露端口(告诉外界这个镜像的服务监听哪个端口)
EXPOSE 80# 启动命令(容器启动后执行什么命令)
CMD ["nginx", "-g", "daemon off;"]

二、Dockerfile 的核心指令(常用的就这几个)

指令 作用
FROM 指定基础镜像(如 alpine, nginx, python),类似“从哪个原材料开始做”。
RUN 在镜像中执行命令(如 RUN apt-get install -y vim),类似“做菜的具体步骤”。
COPY 把宿主机的文件复制到镜像中(如 COPY app.py /app/)。
ADD 类似 COPY,但支持远程文件和自动解压(如 ADD http://xxx.com/file.tar.gz /)。
CMD 指定容器启动时执行的命令(如 CMD ["python", "app.py"]),类似“菜做好了怎么吃”。
ENTRYPOINT 类似 CMD,但更适合作为“容器的主程序”(如 ENTRYPOINT ["/usr/bin/nginx"])。
EXPOSE 声明容器运行时监听的端口(如 EXPOSE 80),类似“告诉别人这道菜要配什么餐具”。
ENV 设置环境变量(如 ENV DB_HOST=localhost),类似“做菜时加什么调料”。
WORKDIR 设置工作目录(如 WORKDIR /app),类似“把菜放在哪个盘子里”。

三、如何用 Dockerfile 构建镜像?

1. 编写 Dockerfile

在项目根目录创建一个名为 Dockerfile 的文件(注意大小写),写入构建指令。例如:

# 使用官方 Python 镜像作为基础
FROM python:3.9-slim# 设置工作目录
WORKDIR /app# 复制当前目录的所有文件到镜像的 /app 目录
COPY . /app# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt# 暴露端口
EXPOSE 5000# 启动命令
CMD ["python", "app.py"]

2. 执行构建命令

在 Dockerfile 所在目录执行:

docker build -t my-python-app:v1 .
  • -t my-python-app:v1:给镜像起个名字(my-python-app)和标签(v1),类似“给菜起个名字”。
  • .:表示构建上下文路径(Docker 会把这个路径下的所有文件发送给 Docker 引擎),类似“告诉厨师从哪里拿原材料”。

3. 构建过程解析

Docker 会按顺序执行 Dockerfile 中的指令:

  1. 拉取基础镜像(python:3.9-slim
  2. 创建一个临时容器
  3. 执行 WORKDIR /app(在容器中创建 /app 目录)
  4. 执行 COPY . /app(把当前目录的文件复制到容器的 /app 目录)
  5. 执行 RUN pip install ...(在容器中安装 Python 依赖)
  6. 执行 EXPOSE 5000(标记容器会监听 5000 端口)
  7. 执行 CMD ["python", "app.py"](设置容器启动命令)
  8. 提交这个临时容器为新镜像(my-python-app:v1
  9. 删除临时容器

4. 验证构建结果

# 查看本地镜像列表
docker images# 应该看到类似这样的输出:
# REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
# my-python-app   v1        1234567890ab   2 minutes ago    450MB

四、构建镜像的最佳实践(运维必看)

  1. 减少镜像层数

    • 合并多个 RUN 命令(用 && 连接),例如:
      RUN apt-get update && apt-get install -y \python3 \python3-pip \
      && rm -rf /var/lib/apt/lists/*  # 清理缓存,减小镜像体积
      
  2. 利用缓存加速构建

    • Docker 按顺序执行指令,相同的指令会复用缓存。例如:
      COPY requirements.txt /app/  # 先复制依赖文件
      RUN pip install -r requirements.txt  # 安装依赖(这步会被缓存)
      COPY . /app/  # 最后复制代码(代码经常变,但依赖不常变,利用缓存)
      
  3. 使用多阶段构建(Multi-stage Build)

    • 适合编译型语言(如 Go、Java),用一个临时镜像编译,最终镜像只包含运行时必要的文件:
      # 第一阶段:编译
      FROM golang:1.20 AS builder
      WORKDIR /app
      COPY . .
      RUN go build -o my-app# 第二阶段:只保留最终二进制文件
      FROM alpine:latest
      WORKDIR /app
      COPY --from=builder /app/my-app .
      CMD ["./my-app"]
      
  4. 避免在镜像中存储敏感信息

    • 不要把密码、密钥等信息写在 Dockerfile 中,用环境变量(-e 参数)或秘密挂载(Secrets)。

五、常见问题

  1. 构建超时

    • 可能是网络问题(如拉取基础镜像慢),可以配置 Docker 镜像源(如阿里云、网易云镜像源)。
  2. 构建失败

    • 检查 Dockerfile 语法错误(如命令拼写错误、缺少依赖)。
    • 查看构建日志(docker build 输出的错误信息)。
  3. 镜像体积过大

    • 使用更小的基础镜像(如 alpine 替代 ubuntu)。
    • 清理构建过程中的临时文件和缓存(如 rm -rf /var/lib/apt/lists/*)。

六、总结

Dockerfile 就像一个“镜像构建说明书”,通过 docker build 命令执行这个说明书,Docker 就能自动帮你“烹饪”出一个镜像。掌握 Dockerfile 的核心指令和最佳实践,是运维人员的必备技能。

http://www.sczhlp.com/news/1020.html

相关文章:

  • 一维光栅结构严格耦合波分析(RCWA)求解器
  • rust学习笔记之基础:类型系统和类型转换
  • 在运维工作中,Docker的基本命令有哪些?
  • 云原生周刊:2025年的服务网格
  • 故障处理:troubleshooting Cluster Time Synchronization Service
  • 在运维工作中,镜像启动一个容器的命令的什么?
  • python命令行解析模块argparse
  • 学习笔记:一次RMAN还原慢的分析
  • 抖音Next-User Retrieva:生成式冷启动召回
  • 求两个自然数a和b的最大公约数(递归算法)
  • nginx压缩字体ttf的有关配置
  • 如何选择工业电脑?
  • 教你创业SUS
  • 使用 nacos-sdk-csharp 服务订阅机制动态更新Yarp配置的简易Demo
  • Three.js 的第一个工程-创建一个场景
  • nginx配置文件生产环境优化
  • 贪心随笔
  • ubuntu系统ufw开放端口教程
  • 基础算法随笔
  • 技术跃迁!DVP AirCAMERA _1020摄像头小板赋能开发者构建顶级视觉系统
  • 小工具
  • Ubuntu20.04 安装gcc11 g++11, Ubuntu18.04
  • Forward prop in tensorflow
  • aws 上传自定义证书
  • 空间智能赋能城市低空数字底座及智能网联系统建设
  • 扫描线求矩形周长并的注意事项
  • 微店商品详情接口micro.item_get请求参数响应参数解析
  • 游戏服务器优雅关服设计与实现
  • 思通数科 AI 安监系统:工业园安全监管的 “智能防线”
  • snort入侵检测基础