从基础到多阶段构建

DockerDockerBeginner
立即练习

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

简介

Docker 彻底改变了我们开发、交付和运行应用程序的方式。Docker 功能的核心在于能够创建满足我们特定需求的自定义镜像。在这个挑战中,你将探索 docker build 命令的强大功能和灵活性,学习如何为各种场景创建 Docker 镜像。

从简单的应用程序到涉及依赖项和环境变量的更复杂设置,你将通过实践掌握 Docker 镜像创建的基本概念。完成这个挑战后,你将具备构建高效且有效的 Docker 镜像的坚实基础,这是现代软件开发和部署工作流程中的一项关键技能。

让我们开始进入 Docker 镜像构建的世界吧!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-389193{{"从基础到多阶段构建"}} docker/ps -.-> lab-389193{{"从基础到多阶段构建"}} docker/images -.-> lab-389193{{"从基础到多阶段构建"}} docker/build -.-> lab-389193{{"从基础到多阶段构建"}} end

基础 Docker 构建

我们将从基础开始。在这一步中,你将创建一个简单的 Docker 镜像,输出一条 "Hello, World!" 消息。这将帮助你熟悉 Dockerfile 的基本结构和 docker build 命令。

任务

  1. 导航到 /home/labex/project 目录下的 hello-world 目录。
  2. 打开该目录中的 Dockerfile 并添加必要的指令。
  3. 使用 docker build 命令构建一个名为 hello-world 的 Docker 镜像。

要求

  • 所有操作都在 /home/labex/project/hello-world 目录下进行。
  • 在 Dockerfile 中使用 Alpine Linux 基础镜像。
  • 运行 Docker 镜像时应输出 "Hello, World!"。

示例

完成此步骤后,你应该能够运行以下命令并看到输出:

$ docker run hello-world
Hello, World!

恭喜你成功创建了第一个 Docker 镜像!这个简单的示例展示了 Docker 镜像创建的基本原理。在下一步中,我们将基于这些知识创建一个更复杂的包含依赖项的镜像。

✨ 查看解决方案并练习

构建包含依赖项的 Docker 镜像

现在你已经熟悉了基础知识,让我们来应对一个更实际的场景。在这一步中,你将为一个使用 Flask Web 框架的 Python 应用程序创建一个 Docker 镜像。这将向你介绍如何在 Docker 镜像中管理依赖项。

任务

  1. 导航到 /home/labex/project 目录下的 flask-app 目录。
  2. 打开该目录中的 Dockerfile 并添加必要的指令以安装依赖项。
  3. 检查 requirements.txt 文件以了解依赖项。
  4. 使用 docker build 命令构建一个名为 flask-app 的 Docker 镜像。

要求

  • 所有操作都在 /home/labex/project/flask-app 目录下进行。
  • 在 Dockerfile 中使用 python:3.7-alpine 基础镜像。
  • 确保镜像中安装了 requirements.txt 中列出的依赖项。
  • Dockerfile 应复制 requirements.txt 文件并安装依赖项。

示例

完成此步骤后,你应该能够在列出 Docker 镜像时看到 flask-app 镜像:

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
flask-app    latest    abcdef123456   2 minutes ago   55.8MB

干得漂亮!你现在已经创建了一个包含外部依赖项的 Docker 镜像。这是实际应用中的常见场景。在下一步中,我们将探索如何在 Docker 镜像中使用环境变量,使其更加灵活和可配置。

✨ 查看解决方案并练习

构建使用环境变量的 Docker 镜像

配置管理是容器化应用程序的关键部分。在这一步中,你将创建一个使用环境变量来设置 Flask 应用程序端口号的 Docker 镜像。这将展示如何使你的 Docker 镜像更具动态性,并适应不同的环境。

任务

  1. 导航到 /home/labex/project 目录下的 flask-app-env 目录。
  2. 打开该目录中的 Dockerfile 并添加设置环境变量的指令。
  3. 修改 app.py 文件以使用环境变量设置端口号。
  4. 使用 docker build 命令构建一个名为 flask-app-env 的 Docker 镜像。

要求

  • 所有操作都在 /home/labex/project/flask-app-env 目录下进行。
  • 在 Dockerfile 中使用 python:3.7-alpine 基础镜像。
  • 在 Dockerfile 中设置一个名为 PORT 的环境变量,默认值为 5000。
  • 修改 Flask 应用程序以使用 PORT 环境变量来设置监听端口。
  • 确保安装 requirements.txt 中列出的所有必要 Python 包。

示例

完成此步骤并运行容器后,你应该能够访问应用程序:

$ docker run -d -p 5000:5000 flask-app-env
$ curl http://127.0.0.1:5000
Hello, World!

干得漂亮!你现在已经创建了一个更灵活的 Docker 镜像,它可以通过环境变量适应不同的环境。这是创建可重用和可配置容器镜像的强大技术。在最后一步中,我们将探索 Docker 的高级功能:多阶段构建。

✨ 查看解决方案并练习

构建多阶段 Docker 镜像

在我们的最终挑战中,我们将深入探讨多阶段构建。这种高级技术允许你在构建过程中使用多个阶段来创建更高效的 Docker 镜像。你将为一个 Go 应用程序创建一个 Docker 镜像,使用一个阶段来编译代码,另一个阶段来创建一个精简的生产就绪镜像。

任务

  1. 导航到 /home/labex/project 目录下的 go-app 目录。
  2. 打开该目录中的 Dockerfile 并添加多阶段构建的指令。
  3. 检查 main.go 文件以了解这个简单的 Go 应用程序。
  4. 使用 docker build 命令构建一个名为 go-app 的 Docker 镜像。

要求

  • 所有操作都在 /home/labex/project/go-app 目录下进行。
  • 使用 golang:1.14-alpine 作为构建阶段的基础镜像,使用 alpine 作为最终阶段的基础镜像。
  • 运行 Go 应用程序时应输出 "Hello, World!"。
  • Go 应用程序应使用 go build 命令进行编译。
  • 最终的 Docker 镜像应仅包含编译后的二进制文件,而不包含 Go 开发环境。

示例

完成此步骤后,你应该能够运行以下命令并看到输出:

$ docker run go-app
Hello, World!
✨ 查看解决方案并练习

总结

恭喜你完成了这个全面的 Docker 镜像构建挑战!你从创建一个基础的 Docker 镜像开始,逐步掌握了多阶段构建等高级技术。在这个过程中,你学会了如何:

  1. 使用基本的 Dockerfile 创建一个简单的 Docker 镜像
  2. 在 Docker 镜像中管理依赖项
  3. 使用环境变量使镜像更具灵活性
  4. 实现多阶段构建以创建高效的生产就绪镜像

这些技能构成了有效使用 Docker 的基础,并将在各种场景中为你提供帮助,从开发和测试到生产部署。你通过实践掌握了 Docker CLI 和 Dockerfile 语法,这对于任何从事容器化应用程序工作的人来说都是非常宝贵的。

在你继续探索 Docker 的过程中,请记住这些基本操作是更复杂 Docker 工作流的基石。定期练习这些技能,你会发现自己在容器镜像创建和管理方面变得更加熟练,最终实现更高效和简化的开发和部署流程。

继续探索 Docker 的功能,并大胆尝试不同的基础镜像、构建策略和优化技术。容器化的世界广阔而充满可能性,你现在已经具备了自信地驾驭它的能力!