Docker实战:如何部署你的第一个Web应用 – wiki大全


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!” 的简单应用。

  1. 创建项目目录

    在你喜欢的位置创建一个新文件夹,例如 my-first-docker-app,并进入该目录。

  2. 创建应用文件 app.py

    在项目目录中,创建一个名为 app.py 的文件,并写入以下内容:

    “`python
    from flask import Flask
    import os

    app = 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`。

  3. 创建依赖文件 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 运行了它。

总结与后续步骤

通过本文,你学习了:

  1. 如何为简单的 Python Web 应用编写 Dockerfile
  2. 如何使用 docker build 命令构建自定义镜像。
  3. 如何使用 docker run 命令启动容器,并进行端口映射。

这只是 Docker 世界的冰山一角。接下来,你可以探索更高级的主题:

  • Docker Compose: 用于定义和运行多容器 Docker 应用程序的工具。
  • 数据持久化 (Volumes): 如何在容器销毁后依然保存数据。
  • 网络 (Networking): 如何让多个容器互相通信。
  • Docker Hub: 如何将你的镜像推送到公共或私有仓库,与他人共享。

继续探索,你会发现 Docker 是一个强大而有趣的工具,它将极大地简化你的开发和部署流程。

滚动至顶部