[英]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
。
我不確定如何從Docker
和Nginx
角度實現這一目標。
另外,如果我到目前為止所做的任何事情都完全錯誤,請糾正我,因為我是新來的。
注意:我將使用Kubernetes代替Docker-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
相應地重命名您的Dockerfile。
將您的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.