Dockerfile基本指令

 Docker   打工人   2024-11-17 15:38   26
  Docker

Dockerfile 是 Docker 镜像构建的核心工具,而其基本指令则是构建高效镜像的基础。掌握这些指令不仅能帮助我们更好地构建和优化镜像,还能提升容器化应用的部署效率。

本文将围绕 Dockerfile 的五大基本指令进行详细介绍,分别是 FROMRUNCOPY / ADDWORKDIRCMD / ENTRYPOINT,涵盖其原理、用法以及实战示例,帮助你全面掌握这些关键指令的使用。


一、FROM:指定基础镜像

1.1 指令概述

  • 功能FROM 指定镜像的构建基础,是所有 Dockerfile 的第一条指令。
  • 作用:定义镜像的起点环境,例如选择操作系统或运行时环境。

1.2 语法

FROM <镜像名称>:<标签>
  • <镜像名称>:可以是官方镜像或自定义镜像。
  • <标签>:指定镜像的版本,例如 ubuntu:20.04

1.3 示例与应用场景

示例 1:基于官方的 Ubuntu 镜像

FROM ubuntu:20.04

示例 2:基于 Python 的运行时环境

FROM python:3.9-slim
  • 应用场景
    • 构建 Web 应用时,可以选择 nodepython 镜像作为基础。
    • 使用 alpine 镜像优化镜像体积,适合轻量级应用。

二、RUN:执行命令

2.1 指令概述

  • 功能RUN 指令用于在构建镜像时运行命令。
  • 作用:常用于安装软件、复制文件或执行其他初始化任务。

2.2 语法

RUN <命令>
  • <命令>:可以是任何在基础镜像中支持的命令。

2.3 示例与应用场景

示例 1:安装 Nginx

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

示例 2:清理无用的缓存

RUN apt-get clean && rm -rf /var/lib/apt/lists/*
  • 应用场景
    • 安装依赖包(如 Node.js、Python 包、数据库工具)。
    • 配置环境(如设置系统变量、创建目录)。

三、COPY / ADD:将文件复制到容器内

3.1 指令概述

  • 功能COPYADD 都能将文件从宿主机复制到镜像中。
  • 区别
    • COPY:仅支持本地文件和目录的复制。
    • ADD:支持解压归档文件、下载远程 URL 的文件。

3.2 语法

COPY <源路径> <目标路径>
ADD <源路径或URL> <目标路径>

3.3 示例与应用场景

示例 1:使用 COPY 复制本地文件

COPY ./app /usr/src/app

示例 2:使用 ADD 解压归档文件

ADD archive.tar.gz /usr/src/app

示例 3:使用 ADD 下载远程文件

ADD http://example.com/file.tar.gz /usr/src/app
  • 应用场景
    • 将项目代码或配置文件复制到容器。
    • 自动解压文件或下载依赖文件。

四、WORKDIR:设置工作目录

4.1 指令概述

  • 功能WORKDIR 用于指定镜像中的工作目录。
  • 作用:在容器中运行命令时,默认路径会切换到设置的目录。

4.2 语法

WORKDIR <路径>
  • <路径>:可以是绝对路径或相对路径。

4.3 示例与应用场景

示例 1:设置工作目录为 /app

WORKDIR /app

示例 2:创建嵌套目录

WORKDIR /usr/src/app
  • 应用场景
    • 配合 COPY 将文件复制到指定目录。
    • 配合 CMDENTRYPOINT 设置运行命令的默认路径。

五、CMD / ENTRYPOINT:定义容器启动时的默认命令

5.1 指令概述

  • 功能
    • CMD:定义容器启动时运行的默认命令,可被 docker run 的参数覆盖。
    • ENTRYPOINT:定义容器启动时运行的固定命令,不易被覆盖。

5.2 语法

CMD

CMD ["可执行文件", "参数1", "参数2"]

ENTRYPOINT

ENTRYPOINT ["可执行文件", "参数1", "参数2"]

5.3 示例与应用场景

示例 1:使用 CMD 启动 Nginx

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

示例 2:使用 ENTRYPOINT 启动脚本

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

示例 3:配合 ENTRYPOINTCMD

ENTRYPOINT ["python"]
CMD ["app.py"]
  • 应用场景
    • 使用 CMD 提供灵活性,例如指定默认脚本。
    • 使用 ENTRYPOINT 强制执行固定的命令(如启动服务)。

六、完整案例:构建 Flask Web 应用

以下是一个完整的 Dockerfile,展示了 FROMRUNCOPYWORKDIRCMD 的实际用法。

6.1 项目结构

project/
├── app.py
├── requirements.txt
└── Dockerfile

app.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, Docker!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

requirements.txt

flask

Dockerfile

# 指定基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制项目文件
COPY . .

# 安装依赖
RUN pip install -r requirements.txt

# 暴露端口
EXPOSE 5000

# 指定启动命令
CMD ["python", "app.py"]

6.2 构建与运行

构建镜像

docker build -t flask-app .

运行容器

docker run -d -p 5000:5000 flask-app

测试应用

访问浏览器中的 http://localhost:5000,将看到 Hello, Docker!


七、总结

Dockerfile 的基本指令是容器化应用开发的核心。 通过 FROM 定义基础环境,利用 RUN 安装依赖,借助 COPY / ADD 传递资源,再通过 WORKDIR 配置工作路径,最终使用 CMD / ENTRYPOINT 启动应用,完成镜像的构建流程。

熟练掌握这些指令,不仅能帮助我们高效地构建镜像,还能优化容器的运行效率,为容器化应用开发打下坚实基础。