如何从 Dockerfile 构建 Docker 镜像

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程将指导你完成从 Dockerfile 构建 Docker 镜像的过程。我们将涵盖 Docker 镜像的基础知识、创建和管理 Docker 镜像的步骤,以及如何有效地部署它们。无论你是 Docker 的新手,还是希望增强你的容器化工作流程,本文都将为你提供构建和使用 Docker 镜像所需的知识和技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/tag("Tag an Image") docker/ImageOperationsGroup -.-> docker/push("Push Image to Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/pull -.-> lab-411506{{"如何从 Dockerfile 构建 Docker 镜像"}} docker/tag -.-> lab-411506{{"如何从 Dockerfile 构建 Docker 镜像"}} docker/push -.-> lab-411506{{"如何从 Dockerfile 构建 Docker 镜像"}} docker/images -.-> lab-411506{{"如何从 Dockerfile 构建 Docker 镜像"}} docker/build -.-> lab-411506{{"如何从 Dockerfile 构建 Docker 镜像"}} end

理解 Docker 镜像

什么是 Docker 镜像?

Docker 镜像是一个轻量级的、独立的、可执行的软件包,它包含运行一个应用程序所需的一切——代码、运行时环境、系统工具、库以及设置。镜像是 Docker 的构建组件,用于创建 Docker 容器。

Docker 镜像层

Docker 镜像是由一系列层构建而成的。每一层代表镜像的 Dockerfile 中的一条指令。这些层相互堆叠形成最终的镜像。当镜像更新时,只重新构建发生变化的层,从而使这个过程更高效。

graph TD A[基础镜像] --> B[层 1] B --> C[层 2] C --> D[层 3] D --> E[最终镜像]

获取 Docker 镜像

可以从多种来源获取 Docker 镜像,包括:

  • Docker Hub:Docker 镜像的官方公共镜像仓库,用户和合作伙伴可以在其中构建和共享容器化应用程序。
  • 私有镜像仓库:组织可以设置自己的私有 Docker 镜像仓库来存储和管理自己的自定义镜像。
  • 从 Dockerfile 构建:用户可以通过编写 Dockerfile 并使用 docker build 命令来创建自己的 Docker 镜像。

Docker 镜像的优点

  • 一致性:无论在何种环境下,Docker 镜像都能确保应用程序以相同的方式运行。
  • 可扩展性:Docker 镜像可以轻松地扩展或缩小以满足不断变化的需求。
  • 高效性:Docker 镜像轻量级且可以快速部署,从而提高应用程序的整体效率。
  • 可移植性:Docker 镜像可以轻松地在任何支持 Docker 的平台上共享和部署,使其具有高度的可移植性。

使用 Dockerfile 构建 Docker 镜像

什么是 Dockerfile?

Dockerfile 是一个文本文件,它包含了用户在命令行上可以调用的所有命令,用于组装 Docker 镜像。Dockerfile 使用特定的语法来定义创建 Docker 镜像所需的步骤。

Dockerfile 语法

一个 Dockerfile 通常包含以下指令:

  • FROM:指定用于构建的基础镜像。
  • COPY:将文件或目录从主机复制到容器文件系统。
  • RUN:在容器中执行一个命令。
  • CMD:指定容器启动时要运行的默认命令。
  • EXPOSE:告知 Docker 容器在运行时监听指定的网络端口。
  • ENV:设置一个环境变量。

以下是一个 Dockerfile 示例:

FROM ubuntu:22.04

COPY. /app
WORKDIR /app

RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip3 install -r requirements.txt

EXPOSE 8080
CMD ["python3", "app.py"]

构建 Docker 镜像

要从 Dockerfile 构建 Docker 镜像,可以使用 docker build 命令:

docker build -t my-app.

此命令将使用当前目录中的 Dockerfile 构建一个标签为 my-app 的 Docker 镜像。

优化 Dockerfile

为了优化你的 Dockerfile,你可以:

  • 通过将多个指令合并到一个 RUN 命令中来减少层数。
  • 使用更小的基础镜像以减小整体镜像大小。
  • 通过在 Dockerfile 中尽早安装依赖项来缓存依赖项。
  • 使用多阶段构建来分离构建和运行时环境。

管理和部署 Docker 镜像

存储和共享 Docker 镜像

Docker 镜像可以通过多种方式进行存储和共享:

  • Docker Hub:Docker Hub 是 Docker 镜像的官方公共镜像仓库。你可以将你的镜像推送到 Docker Hub 并与他人共享。
  • 私有镜像仓库:你可以设置自己的私有 Docker 镜像仓库来存储和管理你组织的自定义镜像。
  • 本地存储:Docker 镜像也可以存储在主机上的本地,但这主要用于开发和测试目的。

部署 Docker 容器

一旦你有了一个 Docker 镜像,就可以使用 docker run 命令将其作为容器进行部署:

docker run -d -p 8080:8080 --name my-app my-app

此命令将从 my-app 镜像启动一个新容器,将主机上的 8080 端口映射到容器内的 8080 端口,并将容器命名为 my-app

管理 Docker 容器

你可以使用各种命令来管理你的 Docker 容器:

  • docker ps:列出所有正在运行的容器。
  • docker stop <容器ID>:停止一个正在运行的容器。
  • docker start <容器ID>:启动一个已停止的容器。
  • docker logs <容器ID>:查看容器的日志。
  • docker exec -it <容器ID> /bin/bash:在一个正在运行的容器内打开一个 shell。

扩展 Docker 容器

通过运行多个容器实例,Docker 使你能够轻松扩展你的应用程序。你可以使用 Docker Swarm 或 Kubernetes 等工具来大规模编排和管理你的容器部署。

graph TD A[Docker 主机] --> B[容器 1] A[Docker 主机] --> C[容器 2] A[Docker 主机] --> D[容器 3]

持续集成和部署

Docker 镜像可以轻松集成到你的持续集成(CI)和持续部署(CD)管道中。像 Jenkins、GitLab CI 或 GitHub Actions 这样的工具可用于自动构建、测试和部署你的 Docker 镜像。

总结

在本教程结束时,你将对 Docker 镜像有扎实的理解,并能够从 Dockerfile 构建自己的 Docker 镜像。你将学习如何管理和部署这些镜像,简化你的容器化过程,并在你的开发和部署工作流程中充分发挥 Docker 的潜力。