簡體   English   中英

Docker中的Django微服務

[英]Django microservices within Docker

我有以下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應用程序,以便創建微服務環境。

例如,上面的現有Web應用程序將是處理用戶注冊/登錄等的API。我想在組合中添加另一個Django API,該API可以執行其他操作並使用其自己的數據庫。

如果這是有史以來理論上投入生產環境,那么第一個API將通過先從URL中使用www.demosite.com/api/users和第二API可以通過網址開始使用www.demosite.com/api/widgets

我不確定如何從DockerNginx角度實現這一目標。

另外,如果我到目前為止所做的任何事情都完全錯誤,請糾正我,因為我是新來的。

注意:我將使用Kubernetes代替Docker-Compose。

  1. 嘗試添加以撰寫:

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單元

也許您可以看一下這個著名的nginx代理docker鏡像“ https://github.com/jwilder/nginx-proxy ”。

您可以部署多個容器,而docker-gen會通過監聽docker sock文件將條目動態地放入您的nginx配置中。

默認情況下,它基於域工作,使用env var VIRTUAL_HOST=subdomain.youdomain.com啟動要代理的任何容器

如果這樣做不能解決問題,您可以嘗試使用此映像本身在Golang中為nginx配置創建自己的docker docker gen模板。
另一個很棒的功能是,您也可以輕松擴展/縮小您的應用程序容器。

祝好運!

您可以繼續做您現在正在做的事情。 將第二個后端容器添加到docker-compose.yml文件,然后將另一個location塊添加到可路由到指定服務的nginx配置。 對於您描述的布局,它可能看起來像

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

當您開始說“生產”一詞時,通常不會將代碼與Docker映像分開分發。 我將嘗試刪除volume volumes:指令,該指令將本地工作樹復制到映像中已安裝的樹上,然后將command:移動到Dockerfile中的CMD中。 相反,您可能希望將PostgreSQL和Redis數據庫的位置作為環境變量傳遞,即使它們“通常”在相同的Docker Compose設置中,以防您想要在其他地方運行它們(在定期備份的專用或托管服務)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM