介绍
Docker 彻底改变了我们开发、交付和运行应用程序的方式。Docker 功能的核心在于能够根据特定需求创建自定义镜像。在本挑战中,你将探索 docker build 命令的强大功能和灵活性,学习如何为各种场景创建 Docker 镜像。
从简单的应用程序到涉及依赖项和环境变量的复杂设置,你将获得 Docker 镜像创建基本概念的实战经验。完成本挑战后,你将为构建高效且实用的 Docker 镜像打下坚实基础,这是现代软件开发和部署流程中的一项关键技能。
让我们开始 Docker 镜像构建世界的探索之旅吧!
基础 Docker 构建
我们将从基础开始。在这一步中,你将创建一个简单的 Docker 镜像,输出「Hello, World!」消息。这将让你熟悉 Dockerfile 的基本结构和 docker build 命令。
任务
- 进入
/home/labex/project下的hello-world目录。 - 打开该目录中的
Dockerfile并添加必要的指令。 - 使用
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 镜像中管理依赖项的概念。
任务
- 进入
/home/labex/project下的flask-app目录。 - 打开该目录中的
Dockerfile并添加安装依赖项所需的指令。 - 检查
requirements.txt文件以了解依赖项。 - 使用
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 镜像
配置管理是容器化应用程序的一个关键方面。在这一步中,你将创建一个 Docker 镜像,该镜像使用环境变量来设置 Flask 应用程序的端口号。这将演示如何让你的 Docker 镜像更具动态性,并能适应不同的环境。
任务
- 进入
/home/labex/project下的flask-app-env目录。 - 打开该目录中的
Dockerfile并添加设置环境变量的指令。 - 修改
app.py文件,使其使用环境变量作为端口号。 - 使用
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 镜像
在最后的挑战中,我们将深入研究多阶段构建(Multi-stage builds)。这种高级技术允许你通过在构建过程中使用多个阶段来创建更高效的 Docker 镜像。你将为一个 Go 应用程序创建一个 Docker 镜像,使用一个阶段来编译代码,另一个阶段来创建一个精简的、生产就绪的镜像。
任务
- 进入
/home/labex/project下的go-app目录。 - 打开该目录中的
Dockerfile并添加多阶段构建的指令。 - 检查
main.go文件以了解这个简单的 Go 应用程序。 - 使用
docker build命令构建一个名为go-app的 Docker 镜像。
要求
- 在
/home/labex/project/go-app目录中执行所有操作。 - 使用
golang:1.14-alpine作为构建阶段的基础镜像,使用alpine作为最终阶段的基础镜像。 - 运行该 Go 应用程序时应打印出「Hello, World!」。
- 应使用
go build命令编译 Go 应用程序。 - 最终的 Docker 镜像应仅包含编译后的二进制文件,而不包含 Go 开发环境。
示例
完成此步骤后,你应该能够运行以下命令并看到输出:
$ docker run go-app
Hello, World!
总结
恭喜你完成了这个全面的 Docker 镜像构建挑战!你已经从创建基础 Docker 镜像进阶到实现多阶段构建等高级技术。在此过程中,你学习了如何:
- 使用基础 Dockerfile 创建简单的 Docker 镜像
- 在 Docker 镜像中管理依赖项
- 使用环境变量使镜像更加灵活
- 实现多阶段构建以获得高效的生产级镜像
这些技能构成了高效使用 Docker 的基础,并将你在从开发、测试到生产部署的各种场景中大显身手。你已经获得了 Docker 命令行界面(CLI)和 Dockerfile 语法的实战经验,这对于任何从事容器化应用程序工作的人来说都是弥足珍贵的。
在继续你的 Docker 学习之旅时,请记住这些基本操作是构建更复杂 Docker 工作流的基石。定期练习这些技能,你会发现自己在容器镜像创建和管理方面变得更加熟练,最终实现更高效、更精简的开发和部署流程。
继续探索 Docker 的功能,不要犹豫去尝试不同的基础镜像、构建策略和优化技术。容器化的世界广阔且充满可能性,你现在已经具备了信心去探索它!



