您如何为 运行 多个实例容器化 Django 应用程序?

How do you containerize a Django app for the purpose of running mulptiple instances?

我们的想法是创建一个 Django 应用程序,作为 Android 应用程序的后端,并提供一个用于管理移动应用程序数据的 Web 管理界面。 公司的不同站点有时需要针对相同 android 应用程序的不同后端(数据必须完全分开管理)。应用程序将在 Windows server/s 上托管。 我如何将应用程序容器化,以便我可以 运行 它的多个实例(侦听同一 IP 的不同端口)并且我可以根据需要将它移动到不同的服务器并在那里设置它的新实例? 我熟悉的 Django 开发部分,但我以前从未使用过 Docker(也没有其他)容器。

我需要的: 处理此特定主题的教程或文档 或者 已订购一些文章或提示如何完成此操作。

这是你想要的吗?

https://atrisaxena.github.io/projects/docker-basic-django-application-deployment/

拥有多个实例的秘诀是在 运行 容器时映射端口。

当你运行

docker run -d -p 8000:8000 djangosite

您可以通过将 8000:8000 设置更改为您想要的任何 <host_port>:<container_port> 来更改端口映射。

例如如果你按照上面的例子,你最终会暴露容器上的端口 8000(Dockerfile 中的EXPOSE 8000)。上述命令将主机上的端口 8000 映射到容器上的 8000。如果你想 运行 端口 8001 上的容器的第二个实例,你只需 运行

docker run -d -p 8001:8000 djangosite

然后最后一步是使用诸如 nginx 之类的代理将 docker 主机上的端口映射到可通过浏览器访问的 URL(即通过端口 80 访问 http,通过端口 443 访问 https)。

关于移动容器,您只需将您构建的 docker 图像导入您想要的任何 docker 主机,无需移动源代码。

这是否回答了您的问题?

P.S。值得注意的是,上面的教程建议 运行 使用 manage.py runserver 连接 Django 服务器,这不是部署 Django 站点的标准方法。正确的方法是在容器内使用 WSGI 或类似工具(通过 apache、nginx、gunicorn 等)来正确连接容器边界。有关如何正确部署站点的更多信息,请参阅 https://docs.djangoproject.com/en/3.2/howto/deployment/。文档中详述的所有方法都可以在容器内完成(但请注意不要让您的容器过于庞大,否则它会拖累您的主机)。

P.P.S 也没有必要按照链接文章中的建议将 docker 容器标记到远程存储库。您可以使用 docker build 在本地构建容器(参见 https://docs.docker.com/engine/reference/commandline/build/) and save the image as a file using docker save (see https://docs.docker.com/engine/reference/commandline/save/). You can then import the image to new hosts using docker load (https://docs.docker.com/engine/reference/commandline/load/)。

N.B。不要将 docker savedocker loaddocker exportdocker import 混淆,因为它们具有不同的功能。在那里阅读文档以获取更多信息。 docker savedocker load 使用图像,而 docker exportdocker import 直接使用容器(即图像的特定实例)。

我建议有一个 docker-compose 文件,有两个不同名称的服务和 运行 在不同的端口,就是这样

version: '2'

services:
  backend:
    ports:
      - host_port:container_port example
      - 8080:8000
    build:
      context: ./directory_containing_docker_file
      dockerfile: .
    restart: unless-stopped
    networks:
      - your-network

  :
    ports:
      - host_port:container_port
      - 8090:8000
    build:
      context: ./directory_containing_docker_file
      dockerfile: .
    restart: unless-stopped
    networks:
      - your-network


networks:
  your-network:
    driver: bridge