- Docker 教程
- Docker - 首页
- Docker - 概述
- Docker - 在 Linux 上安装
- Docker - 安装
- Docker - Hub
- Docker - 镜像
- Docker - 容器
- Docker - 仓库
- Docker - Compose
- Docker - 使用容器
- Docker - 架构
- Docker - 层
- Docker - 容器 & 主机
- Docker - 配置
- Docker - 容器 & Shell
- Docker - Dockerfile
- Docker - 构建文件
- Docker - 公共仓库
- Docker - 管理端口
- Docker - Web 服务器
- Docker - 命令
- Docker - 容器链接
- Docker - 数据存储
- Docker - 卷
- Docker - 网络
- Docker - 安全
- Docker - 工具箱
- Docker - 云
- Docker - 构建云
- Docker - 日志记录
- Docker - 持续集成
- Docker - Kubernetes 架构
- Docker - Kubernetes 的工作原理
- Docker - 生成式 AI
- Docker - 托管
- Docker - 最佳实践
- Docker 设置服务
- Docker - 设置 Node.js
- Docker - 设置 MongoDB
- Docker - 设置 NGINX
- Docker - 设置 ASP.Net
- Docker - 设置 MySQL
- Docker - 设置 Go
- Docker - 设置 Rust
- Docker - 设置 Apache
- Docker - 设置 MariaDB
- Docker - 设置 Jupyter
- Docker - 设置 Portainer
- Docker - 设置 Rstudio
- Docker - 设置 Plex
- Docker 设置 - Flame
- Docker 设置 - PostgreSql
- Docker 设置 - Mosquitto
- Docker 设置 - Grafana
- Docker 设置 - Nextcloud
- Docker 设置 - Pawns
- Docker 设置 - Ubuntu
- Docker 设置 - RabbitMQ
- Docker - 设置 Python
- Docker - 设置 Java
- Docker - 设置 Redis
- Docker - 设置 Alpine
- Docker - 设置 BusyBox
- Docker 设置 - Traefik
- Docker 设置 - WordPress
- Docker 有用资源
- Docker - 快速指南
- Docker - 有用资源
- Docker - 讨论
Docker – 构建文件
Dockerfile 本质上是一组用简单文本格式编写的指令,Docker 基于这些指令构建 Docker 镜像。例如,它包含必须开始使用的基础镜像、软件安装指令、库、依赖项、文件复制以及应用程序环境中必要的运行命令。
可以把它想象成容器的食谱,列出食材和执行的烹饪步骤,最终生成一个可运行的 Docker 镜像,就像一道美味佳肴。
阅读本章以了解 Dockerfile 及其如何构建以创建和运行 Docker 镜像。
Dockerfile 指令
Dockerfile 指令是在构建 Docker 镜像过程中使用的一组命令。添加到 Dockerfile 中的每个指令都概述了最终运行应用程序的容器的环境和行为。
此处列出了**10 个基本的 Dockerfile 指令**以及示例,展示了如何使用它们 -
指令 | 描述 |
---|---|
FROM | 指定构建的基础镜像 |
RUN | 在当前镜像的新层上运行命令并提交 |
COPY | 将文件或目录从主机文件系统复制到镜像文件系统 |
WORKDIR | 为任何后续指令设置工作目录。 |
ENV | 设置环境变量 |
EXPOSE | 通知 Docker 容器在运行时对特定网络端口感兴趣 |
CMD | 为容器提供默认命令和/或参数 |
ENTRYPOINT | 将容器配置为可执行文件运行 |
VOLUME | 创建具有指定路径的挂载点,并将其标记为保存外部挂载的卷 |
USER | 设置运行镜像时要使用的用户名或 UID |
示例
让我们为一个简单的 Node.js 应用程序创建一个 Dockerfile -
# Use the official Node.js image as a base FROM node:14 # Set the working directory WORKDIR /app # Copy package.json and package-lock.json to the working directory COPY package*.json ./ # Install dependencies RUN npm install # Copy the rest of the application code COPY . . # Expose port 3000 to the outside world EXPOSE 3000 # Set environment variables ENV NODE_ENV=production # Default command to run when the container starts CMD ["node", "index.js"]
此 Dockerfile 构建了一个 Node.js 应用程序的镜像,设置了环境,安装了依赖项,公开了端口,并定义了如何启动应用程序。
如何从 Dockerfile 构建镜像?
您可以使用一些重要的 Docker 命令通过 Docker 的命令行界面或 CLI 从 Dockerfile 构建 Docker 镜像。
让我们检查一下根据上述示例 Dockerfile 使用基本 Docker 命令构建、标记和运行镜像的分步指南。
构建 Docker 镜像
要从 Dockerfile 构建 Docker 镜像,请使用 docker build 命令 -
$ docker build -t my-node-app:v1 .
- -t my-node-app:v1 - 要构建的镜像将名为“my-node-app”,标签为“v1”。
- .(点) - 指定构建上下文,即包含 Dockerfile 的当前目录。
列出 Docker 镜像
此命令将列出当前系统上的所有 Docker 镜像。
$ docker images
这将显示所有镜像的列表,以及它们的标签、大小和创建时间。
标记镜像
您可以使用 docker tag 命令将现有镜像标记到另一个标签或仓库名称。
$ docker tag my-node-app:v1 my-registry/my-node-app:v1
- my-node-app:v1 - 镜像名称和当前标签。
- my-registry/my-node-app:v1 - 新仓库和标签的名称。
运行 Docker 容器
要基于特定镜像运行容器,请使用 docker run 命令 -
$ docker run -p 3000:3000 my-node-app:v1
- -p 3000:3000 - 这会将主机的 3000 端口映射到容器内的 3000 端口(端口绑定)。
- my-node-app:v1 - 这将是您要运行的镜像的名称以及该特定镜像的标签。
列出正在运行的容器
要查看当前正在运行的容器,可以使用 docker ps 命令 -
$ docker ps
这将返回正在运行的容器列表,以及它们的 ID、状态、端口和名称。
停止正在运行的容器
要停止正在运行的容器,请使用 docker stop 命令,后跟容器 ID 或名称 -
$ docker stop <container-id or container-name>
您可以将“<container-id 或 container-name>”替换为您要停止的容器的实际 ID 或名称。
删除镜像
要从系统中删除镜像,可以使用 docker rmi 命令。这将采用镜像 ID 或标签作为参数。
$ docker rmi my-node-app:v1
什么是 .dockerignore 文件?
.dockerignore 文件与 .gitignore 的作用相同,定义了在 Docker 构建上下文中应忽略的文件和目录的模式。
当 Docker 构建镜像时,它会将整个上下文目录(使用 Docker build 命令指定)发送到 Docker 守护进程。这意味着,使用“.dockerignore”排除不需要的文件和目录可以加快构建速度并减小最终镜像的大小。
语法和用法
- 在 Docker 构建上下文的根目录中创建一个“.dockerignore”文件。
- 列出您希望 Docker 在构建过程中忽略的文件和目录(每行一个)。
示例 .dockerignore 文件
以下是 Node.js 应用程序的示例“.dockerignore”文件 -
node_modules npm-debug.log Dockerfile .dockerignore .git
解释
- node_modules - 由于您希望将 npm install 用作构建的一部分,因此这会排除 node_module 目录,避免将所有不需要的依赖项复制到 Docker 镜像中。
- npm-debug.log - 忽略 npm 调试日志,这些日志在 Docker 镜像中是不必要的。
- Dockerfile - 这可以防止实际的 Dockerfile 本身被复制到 Docker 镜像中。
- .dockerignore - 它有助于防止 .dockerignore 文件本身包含在构建上下文中。
- .git - 排除 .git 目录,以避免复制不必要的 Git 仓库信息。
最佳实践
- 包含特定文件 - 仅将容器中构建和运行应用程序在 Docker 中所需的那些文件和目录包含在内。
- 使用通配符 - 星号 (*) 和双星号 (**) 可用于匹配文件和目录的通配符模式。
- 保持简洁 -“.dockerignore”本身应尽可能简洁,以防止意外删除文件。
Dockerfile 中 COPY 和 ADD 指令的区别
COPY 和 ADD 都用于将文件从主机复制到 Docker 镜像中。但是,在大多数情况下,COPY 是更好的选择;它更加透明。如果您只需要将文件从源复制到镜像中的目标,则应使用 COPY 指令。
ADD 具有其他功能,例如自动解压缩文件和从远程 URL 获取文件的能力,但它会增加潜在的意外行为和可能的安全风险。如果您不需要这些功能,则 COPY 是首选指令,可以提高 Docker 文件的清晰度和可维护性。
结论
在本章中,我们讨论了 Dockerfile 的复杂性、使用它们的原因以及构建 Docker 镜像所需的几个重要的 Dockerfile 指令。
然后我们了解了一个 Dockerfile 的示例,以创建 NodeJs Docker 镜像以及可用于构建和标记镜像、运行容器、列出镜像和容器等的各种命令。
最后,我们讨论了为什么在构建上下文中使用 Dockerignore 文件是必要的。您现在已经具备了从 Dockerfile 创建和构建镜像的充分能力。