[TOC] #### 1. Dockerfile 介绍 --- Dockerfile 是一个文本文件(无后缀名),包含了一系列指令,用于定义 Docker 镜像的构建过程 通俗来讲:如果说 Docker 镜像是一个 “已经打包好的安装包”,那么 Dockerfile 就是生成这个安装包的 “施工图纸” 它是一个纯文本文件,里面按行书写了一系列指令。当执行构建命令时,Docker 引擎会逐行读取这些指令,在一个临时的中间环境中依次执行(比如:安装软件、复制文件),最终将所有操作层层叠加、固化,生成一个不可变的 Docker 镜像 `Dockerfile` 文件内容示例: ```plaintext FROM ubuntu:24.04 RUN apt update && apt install -y nginx CMD ["nginx", "-g", "daemon off;"] ``` 运行以下命令,Docker 会根据 Dockerfile 自动构建镜像 ```bash docker build -t my-nginx . ``` #### 2. Dockerfile 编写 --- 新建一个空目录,用于存放 `Dockerfile` 和相关文件,避免干扰 ```bash cd ~ && mkdir -p docker-demo && cd docker-demo ``` 本文重点讲解4个最基础、最常用的指令,所有指令必须大写(Dockerfile 语法要求,小写会报错),指令顺序会影响构建结果 + 按 “FROM -> RUN -> COPY -> CMD” 的顺序编写 指令1:FROM(指定基础镜像,必写) 核心作用:指定构建自定义镜像的 “基础原料”,即基于哪个已有的镜像进行构建 + 所有 Dockerfile 必须以 FROM 开头,且只能有一个 FROM 指令 ```plaintext FROM 镜像名称:标签 ``` 使用示例(基于指定阿里云基础镜像构建): ```bash # 创建并编辑 Dockerfile 文件 vim Dockerfile # 将以下内容加入文件 FROM ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/base:ubuntu24.04 ``` 指令2:RUN(执行构建时的命令) 核心作用:在构建镜像的过程中,执行 Linux 命令(如:安装软件、创建目录),这些命令会被固化到镜像中 ```bash # 基础语法(两种格式,零基础优先用第一种) # 格式1:shell 格式(和终端输入命令一致,简单易懂) RUN 命令1 && 命令2 && 命令3 # 格式2:exec 格式(不常用,了解即可) RUN ["命令", "参数1", "参数2"] ``` 使用示例(基于指定阿里云 Ubuntu 24.04 镜像,安装 Nginx 软件): ```plaintext FROM ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/base:ubuntu24.04 RUN apt update && apt install nginx -y ``` 指令3:COPY(复制本地文件到镜像) 核心作用:将本地的文件或目录,复制到构建的镜像内部,用于添加自定义配置文件、代码等 ```plaintext COPY 本地文件/目录路径 镜像内部路径 ``` 使用示例(复制本地自定义 `index.html` 文件到镜像的 nginx 默认目录): + 第一步:在本地(`~/docker-demo` 目录)创建 `index.html` 文件 ```bash echo '<h1>Hello, My name is King !</h1>' >> index.html ``` + 第二步:在 Dockerfile 中编写 `COPY` 指令 ```plaintext COPY index.html /var/www/html/ ``` 指令4:CMD(指定容器启动时的命令,必写) 核心作用:指定容器启动时,默认执行的命令(若启动容器时手动指定了命令,会覆盖 CMD 指令) + 一个 Dockerfile 只能有一个 CMD 指令,多个会覆盖,只执行最后一个 ```bash # 基础语法(两种格式,常用第一种) # 格式1:shell 格式 CMD 启动命令 # 格式2:exec 格式(推荐,更稳定) CMD ["命令", "参数1", "参数2"] ``` 使用示例(启动 nginx 服务,确保容器启动后 nginx 正常运行): + 容器启动时,启动 nginx 服务(前台运行,确保容器不退出) ```plaintext CMD ["nginx", "-g", "daemon off;"] ``` #### 3. docker build 构建镜像 --- 核心说明:`docker build` 是 Docker 构建自定义镜像的核心命令。 它会读取 Dockerfile 中的每一条指令,逐步骤执行,最终生成可启动容器的镜像,相当于 “按食谱做菜” 的过程 `docker build` 基础语法 + `docker build`:核心命令,启动镜像构建流程 + `-t`:核心参数,给镜像命名+打标签(方便后续识别,如:my-nginx:v1) + `镜像名称:标签`:自定义,格式 “名称:版本”,标签省略默认是 latest(最新版) + 构建上下文路径:Dockerfile 所在目录,常用 `.` 表示当前目录(必须确保 Dockerfile 在当前目录) ```bash docker build -t 镜像名称:标签 构建上下文路径 ``` #### 4. 实践演示 (构建镜像/启动容器) --- 完整实操,编写 Dockerfile + 构建镜像(docker build)+ 启动容器 结合上面4个指令,完成一个完整案例: + 编写 Dockerfile + 用 docker build 构建自定义镜像 + 启动容器验证效果 第一步:在本地目录创建 `index.html` 文件: ```bash cd ~ && mkdir -p docker-demo && cd docker-demo echo '<h1>Hello, My name is King !</h1>' >> index.html ``` 第二步:创建 Dockerfile,然后将以下内容粘贴到 `Dockerfile`: + 本地文件路径是 “相对路径”,必须和 Dockerfile 在同一个目录下(否则会报错) + 镜像内部路径要写绝对路径(如 /var/www/html/) + 若复制目录,COPY 会复制目录下的所有文件,不包含目录本身 ```bash # 指定基础镜像 FROM ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/base:ubuntu24.04 # 1. 备份原有的源列表 # 2. 写入新的阿里云公共镜像源(适用于 Ubuntu 24.04 "noble") # 3. 更新软件包索引 RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \ echo "deb http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse" > /etc/apt/sources.list && \ echo "deb http://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse" >> /etc/apt/sources.list && \ echo "deb http://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse" >> /etc/apt/sources.list && \ apt-get update # 安装 nginx 软件 RUN apt-get install nginx -y # 复制本地文件到镜像(构建时执行,固化到镜像中) COPY index.html /var/www/html/ # 指定容器对外暴露的服务端口 EXPOSE 80 # 容器启动时启动 nginx(必写,确保容器不退出) CMD ["nginx", "-g", "daemon off;"] ``` 第三步:构建自定义镜像(核心,执行 `docker build` 命令) ```bash # 构建镜像,命名为 my-nginx:v1,标签为 v1,构建上下文为当前目录(.) docker build -t my-nginx:v1 . # 构建过程解读:终端会逐行输出执行日志,每一行对应 Dockerfile 中的一条指令 # 比如:拉取基础镜像、执行 RUN 安装软件、执行 COPY 复制文件,耐心等待执行完成 ``` 第四步:验证镜像并启动容器(确认构建的镜像可用) ```bash # 查看本地镜像列表,确认构建的 my-nginx:v1 存在 docker images # 启动自定义镜像的容器,端口映射 8080:80(外部可访问) docker run -d --name my-dockerfile-nginx -p 8080:80 my-nginx:v1 # 访问测试,验证镜像功能正常 curl localhost:8080 ```