【问题标题】:Django microservices within DockerDocker 中的 Django 微服务
【发布时间】:2019-01-22 02:48:10
【问题描述】:

我有以下docker-compose.yml

version: '3.6'

services:
  db:
    image: postgres:10.4
    volumes:
      - postgres_data:/var/lib/postgresql/data/
  cache:
    image: redis:4.0.10
    volumes:
      - redis_data:/data
  web:
    build: .
    image: dockerdjangoexample
    command: bash -c "gunicorn demosite.wsgi:application -b 0.0.0.0:8000"
    volumes:
      - .:/code
    depends_on:
      - db
      - cache
  nginx:
    image: nginx:1.15.2-alpine
    ports:
      - "8000:8000"
    volumes:
      - ./docker-config/nginx:/etc/nginx/conf.d
    depends_on:
      - web

volumes:
  postgres_data:
  redis_data:

Dockerfile 是:

FROM python:3.6.5

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /code
COPY . /code/

RUN pip install --upgrade pip
RUN pip install pipenv
RUN pipenv install --deploy --system --skip-lock --dev

Nginx 配置文件是:

upstream web {
  ip_hash;
  server web:8000;
}

server {
  location / {
         proxy_pass http://web/;
  }
  listen 8000;
  server_name localhost;
}

这一切都完美无缺。我现在想弄清楚的是如何在组合中添加第二个Django 应用程序,以便创建微服务环境。

例如,上面的现有网络应用程序将是一个处理用户注册/登录等的 API。我想添加另一个 Django API 到组合中,它可以做其他事情,也可以使用它自己的数据库.

如果理论上将其投入生产环境,那么第一个 API 将通过以 www.demosite.com/api/users 开头的 url 使用,第二个 API 可以通过以 www.demosite.com/api/widgets 开头的 url 使用。

DockerNginx 的角度来看,我不确定如何实现这一点。

另外,如果到目前为止我做错了什么,请纠正我,因为我是新手。

【问题讨论】:

  • 您最终是创建了一个单独的 SSO Django 应用程序来处理身份验证,还是使用了 AWS Cognito 之类的服务?另外,如果您使用单独的 django 项目来处理身份验证,您能否告诉我有关两个项目的 settings.py 中的哪些身份验证后端设置的详细信息?

标签: django docker nginx docker-compose microservices


【解决方案1】:

你可以继续做你现在正在做的事情。将第二个后端容器添加到 docker-compose.yml 文件中,并将另一个 location 块添加到路由到指定服务的 nginx 配置中。对于您描述的布局,它可能看起来像

location /api/users {
  proxy_pass http://web/;
}
location /api/widgets {
  proxy_pass http://widgets/;
}

当您开始说出“生产”一词时,您通常不会将代码与 Docker 映像分开分发。我会尝试删除将本地工作树复制到映像中安装的内容的volumes: 指令,并将command: 移动到Dockerfile 中的CMD 中。相反,您可能希望将 PostgreSQL 和 Redis 数据库的位置作为环境变量传递,即使它们“通常”在同一个 Docker Compose 设置中,以防您想在其他地方运行它们(在例如,定期备份的专用或托管服务)。

【讨论】:

  • 感谢您的回复。我正在尝试学习如何以“正确”的方式做到这一点。所以我会进一步调查你的建议。有很多基础教程,但没有多少以教程格式显示完整的“生产就绪”示例。
【解决方案2】:

注意:我会使用 Kubernetes 而不是 Docker-Compose。

  1. 尝试添加到 compose:

webAuth: build: DockerfileAuth image: dockerdjangoexample command: bash -c "gunicorn demosite.wsgi:application -b 0.0.0.0:8000" volumes: - .:/code depends_on: - db - cache webAnotherService: build: DockerfileAnotherService image: dockerdjangoexample command: bash -c "gunicorn demosite.wsgi:application -b 0.0.0.0:8010" volumes: - .:/code depends_on: - db - cache

  1. 相应地重命名您的 Dockerfile。

  2. 将您的 WSGI AnotherService 添加到 Nginx。

另一个注意事项:看看 Nginx 单元,它是为(微)服务架构设计的 - Nginx Unit

【讨论】:

    【解决方案3】:

    也许你可以看看这个著名的 nginx 代理 docker 镜像“https://github.com/jwilder/nginx-proxy”。

    您可以部署多个容器,docker-gen 将通过监听 docker sock 文件动态地将条目放入您的 nginx 配置中。

    默认情况下,它在域基础上工作,启动任何你想使用 env var VIRTUAL_HOST=subdomain.youdomain.com 代理的容器

    如果这不能解决问题,您可以尝试使用此图像本身在 Golang 中为 nginx 配置创建自己的 docker gen 模板。
    另一个很棒的功能是您也可以轻松地扩大/缩小应用程序容器。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-04
      • 2018-09-27
      • 1970-01-01
      • 2021-06-05
      • 2017-10-11
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      相关资源
      最近更新 更多