Docker 实战:如何部署你的第一个 Web 应用
对于现代开发者来说,Docker 已经成为一项不可或缺的技能。它能够将应用程序及其所有依赖项打包到一个标准化的单元中,我们称之为“容器”。这确保了应用在任何环境中都能以相同的方式运行,无论是开发人员的笔记本电脑、测试服务器还是生产环境。
本文将通过一个简单的 Python Web 应用实例,手把把地教你如何编写 Dockerfile,构建 Docker 镜像,并最终成功运行你的第一个容器化 Web 应用。
核心概念
在开始之前,我们先快速了解几个 Docker 的核心概念:
- 镜像 (Image): 一个只读的模板,包含了运行应用程序所需的所有内容——代码、运行时、库、环境变量和配置文件。
- 容器 (Container): 镜像的一个可运行实例。你可以把镜像看作是类(Class),而容器则是这个类的一个对象(Object)。容器与宿主机和其他容器相互隔离。
- Dockerfile: 一个文本文档,其中包含了用户可以在命令行上调用以组装镜像的所有命令。
docker build命令会读取这个文件,然后自动构建出镜像。 - 仓库 (Repository): 用于存放和分发 Docker 镜像的地方。最著名的公共仓库是 Docker Hub。
第 1 步:准备一个简单的 Web 应用
首先,我们需要一个可以被容器化的 Web 应用。这里我们使用 Python 的 Flask 框架创建一个返回 “Hello, Docker!” 的简单应用。
-
创建项目目录
在你喜欢的位置创建一个新文件夹,例如
my-first-docker-app,并进入该目录。 -
创建应用文件
app.py在项目目录中,创建一个名为
app.py的文件,并写入以下内容:“`python
from flask import Flask
import osapp = Flask(name)
@app.route(‘/’)
def hello():
return “Hello, Docker! This is your first containerized web application.”if name == “main“:
# 0.0.0.0 表示监听所有网络接口
# 容器内部端口设置为 5000
app.run(host=’0.0.0.0′, port=5000)
``app.run
**注意:** 在中使用host=’0.0.0.0′至关重要。这使得应用可以从容器外部被访问,而不仅仅是从容器内部的localhost`。 -
创建依赖文件
requirements.txt我们的应用依赖于 Flask。创建一个
requirements.txt文件来声明这个依赖:Flask==2.2.2
使用固定版本是一个好习惯,可以确保构建环境的一致性。
现在,你的项目目录结构应该如下:
my-first-docker-app/
├── app.py
└── requirements.txt
第 2 步:编写 Dockerfile
Dockerfile 是构建 Docker 镜像的蓝图。在项目根目录下创建一个名为 Dockerfile (没有文件扩展名) 的文件,并添加以下内容:
“`dockerfile
1. 选择一个基础镜像
我们选择一个官方的 Python 运行时作为基础。
‘python:3.9-slim’ 是一个轻量级的版本,可以减小镜像体积。
FROM python:3.9-slim
2. 在镜像中创建一个工作目录
所有后续命令都将在这个目录下执行。
WORKDIR /app
3. 复制依赖文件到工作目录
将 requirements.txt 复制到 /app/requirements.txt
COPY requirements.txt .
4. 安装应用的依赖项
-i 使用国内pypi源加速下载 (可选)
RUN pip install –no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
5. 复制应用代码到工作目录
将当前目录下的所有文件(. 表示当前目录)复制到镜像的 /app 目录
COPY . .
6. 声明容器对外暴露的端口
这只是一个元数据声明,告诉用户这个容器的服务端口是 5000
实际的端口映射是在 ‘docker run’ 命令中完成的
EXPOSE 5000
7. 定义容器启动时要执行的命令
启动 Flask 应用
CMD [“python”, “app.py”]
“`
第 3 步:构建 Docker 镜像
现在我们有了应用代码和 Dockerfile,是时候构建镜像了。
打开你的终端或命令行工具,确保当前路径在 my-first-docker-app 目录下。然后运行以下命令:
bash
docker build -t my-first-web-app .
让我们分解这个命令:
docker build: 构建 Docker 镜像的命令。-t my-first-web-app:-t(tag) 参数用于给镜像命名。这里我们将其命名为my-first-web-app。.: 这个点表示 Dockerfile 所在的路径(当前目录)。
构建过程会需要一些时间,因为它需要下载基础镜像并安装依赖。成功后,你可以通过以下命令查看刚刚创建的镜像:
bash
docker images
你应该能在列表中看到 my-first-web-app。
第 4 步:运行 Docker 容器
镜像已经准备就绪,现在我们可以用它来启动一个容器了。
在终端中运行以下命令:
bash
docker run --name my-app-container -p 5000:5000 -d my-first-web-app
命令解析:
docker run: 从镜像创建一个新的容器并运行它。--name my-app-container: 为你的容器指定一个容易识别的名称。-p 5000:5000: 这是关键的端口映射。它将宿主机的 5000 端口映射到容器的 5000 端口。格式是<host-port>:<container-port>。这样,访问宿主机的 5000 端口的流量就会被转发到容器中。-d: (detached) 表示在后台运行容器,并打印出容器 ID。如果没有这个参数,容器会占据你的终端。my-first-web-app: 你想要运行的镜像的名称。
运行后,你可以用 docker ps 命令检查容器是否正在运行:
bash
docker ps
你会看到类似下面的输出,表明你的容器 my-app-container 正在运行,并且端口映射已生效。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 my-first-web-app "python app.py" 5 seconds ago Up 4 seconds 0.0.0.0:5000->5000/tcp my-app-container
第 5 步:访问你的 Web 应用
打开你的浏览器,访问 http://localhost:5000。
如果一切顺利,你将看到浏览器显示:
Hello, Docker! This is your first containerized web application.
恭喜!你已经成功地将一个 Web 应用容器化,并通过 Docker 运行了它。
总结与后续步骤
通过本文,你学习了:
- 如何为简单的 Python Web 应用编写
Dockerfile。 - 如何使用
docker build命令构建自定义镜像。 - 如何使用
docker run命令启动容器,并进行端口映射。
这只是 Docker 世界的冰山一角。接下来,你可以探索更高级的主题:
- Docker Compose: 用于定义和运行多容器 Docker 应用程序的工具。
- 数据持久化 (Volumes): 如何在容器销毁后依然保存数据。
- 网络 (Networking): 如何让多个容器互相通信。
- Docker Hub: 如何将你的镜像推送到公共或私有仓库,与他人共享。
继续探索,你会发现 Docker 是一个强大而有趣的工具,它将极大地简化你的开发和部署流程。