如何将 Docker 添加到 Django + Gunicorn + Nginx + Fabric
How to Add Docker to Django + Gunicorn + Nginx + Fabric
我将 Django 与 Gunicorn 守护程序和 Nginx 一起用于代理和静态文件。我有一个非常简单的 Fabric 脚本来执行 "automate" 一些操作:
- 我们在本地计算机上使用 virtualenv
- 我们只将应用程序推送到我们的 GitHub 存储库
- 我们通过 ssh 连接到服务器,运行 GitHub 仓库中的 fabric 脚本
- 它从 GitHub 提取,如果需要则合并,重新启动 Nginx 和 Gunicorn
这已经存在问题,例如对于第一次部署,我需要从 GitHub 手动克隆。
现在,我们正处于将应用程序发送给客户的阶段,以便他们可以托管自己的服务器(我们可能需要在不久的将来进行扩展)。他们需要 Docker 个容器来部署在他们自己的服务器上。我将通过 ssh 连接到他们的服务器以更新我们应用程序的部署。
但是,我很难弄清楚什么是自动化的最佳方式,即每次使用 Fabric 发布新版本时我需要执行的操作顺序。
我的建议是创建一个 Docker 文件,并且在每次提交到发布分支时都有某种持续集成服务器(Jenkins、CircleCI 等)拉取您的代码,运行 一组测试,然后构建并发布一个新的 Docker 图像。如果您需要付款,您可能希望它是私有的 - 这很容易做到,您可以设置私有 docker 注册表。您甚至可能会发现这是一个比您当前的内部工作流程更好的工作流程,因为它是全自动化的。
这是您的 Docker 文件的示例:
FROM debian:stable
ADD . /code
WORKDIR /code
RUN apt-get update && apt-get install -y python-dev
RUN pip install -r requirements.txt
CMD python run.py
这只是一个示例,我不知道您的代码是如何构建的,但它假设 Docker 文件与一个知道如何获取内容的脚本 run.py 对等运行宁。它还假定您要使用 debian:stable - 那里有很多选项,您需要选择最适合您的选项。它还假定您将依赖项组织在 requirements.txt 文件中。最后,我只是将 apt-get 放在那里以展示如何 运行 任意命令并可能安装 python 的开发内容。
根据 fabric 脚本的复杂程度,Docker 文件可以完全替换它,或者您也可以 运行 fabric 脚本作为 Docker 文件中的一个步骤。
您可以在此处找到有关 Docker 文件格式的更多信息:https://docs.docker.com/engine/reference/builder/
编辑:我应该补充 - 显然你需要做出一些关于你如何支持混合使用 nginx 的决定,因为典型的 docker 方式是作为第二个图像和容器 - 这很容易做到(在我看来,这是一个比目前看起来更好的架构,而不是将它全部放在一台机器上)但它需要一些注意。
我将 Django 与 Gunicorn 守护程序和 Nginx 一起用于代理和静态文件。我有一个非常简单的 Fabric 脚本来执行 "automate" 一些操作:
- 我们在本地计算机上使用 virtualenv
- 我们只将应用程序推送到我们的 GitHub 存储库
- 我们通过 ssh 连接到服务器,运行 GitHub 仓库中的 fabric 脚本
- 它从 GitHub 提取,如果需要则合并,重新启动 Nginx 和 Gunicorn
这已经存在问题,例如对于第一次部署,我需要从 GitHub 手动克隆。
现在,我们正处于将应用程序发送给客户的阶段,以便他们可以托管自己的服务器(我们可能需要在不久的将来进行扩展)。他们需要 Docker 个容器来部署在他们自己的服务器上。我将通过 ssh 连接到他们的服务器以更新我们应用程序的部署。
但是,我很难弄清楚什么是自动化的最佳方式,即每次使用 Fabric 发布新版本时我需要执行的操作顺序。
我的建议是创建一个 Docker 文件,并且在每次提交到发布分支时都有某种持续集成服务器(Jenkins、CircleCI 等)拉取您的代码,运行 一组测试,然后构建并发布一个新的 Docker 图像。如果您需要付款,您可能希望它是私有的 - 这很容易做到,您可以设置私有 docker 注册表。您甚至可能会发现这是一个比您当前的内部工作流程更好的工作流程,因为它是全自动化的。
这是您的 Docker 文件的示例:
FROM debian:stable
ADD . /code
WORKDIR /code
RUN apt-get update && apt-get install -y python-dev
RUN pip install -r requirements.txt
CMD python run.py
这只是一个示例,我不知道您的代码是如何构建的,但它假设 Docker 文件与一个知道如何获取内容的脚本 run.py 对等运行宁。它还假定您要使用 debian:stable - 那里有很多选项,您需要选择最适合您的选项。它还假定您将依赖项组织在 requirements.txt 文件中。最后,我只是将 apt-get 放在那里以展示如何 运行 任意命令并可能安装 python 的开发内容。
根据 fabric 脚本的复杂程度,Docker 文件可以完全替换它,或者您也可以 运行 fabric 脚本作为 Docker 文件中的一个步骤。
您可以在此处找到有关 Docker 文件格式的更多信息:https://docs.docker.com/engine/reference/builder/
编辑:我应该补充 - 显然你需要做出一些关于你如何支持混合使用 nginx 的决定,因为典型的 docker 方式是作为第二个图像和容器 - 这很容易做到(在我看来,这是一个比目前看起来更好的架构,而不是将它全部放在一台机器上)但它需要一些注意。