帮酷LOGO
  • 显示原文与译文双语对照的内容


问题:

如何使用/gunicorn ( 。我还没有决定使用什么,因为它具有更好的性能,建议和建议) 和 Nginx 部署使用的Django 项目,我不知道该如何处理。

我看到有些人把东西放在同一个容器里。 我不是 Docker 专家,但容器应该只做一个( 1 ) 操作。 因此,Django + Nginx 似乎是 2而不是 1.

现在,我对部署的想法是:

  • 带有 Django 和最大值的容器。 在Dockerfile的末尾,我运行用户定义脚本。 这里容器公开端口 8000
  • 一个带有 Nginx的容器,链接到 Django 。 这将公开端口 80并将请求代理给 Django 。

还有其他方法? 是否有关于这个案例的教程更深入一点。 我需要一个坚固的生产,而不仅仅是测试我电脑上的一些代码。


回答 1:

我现在正在用你想要的方式建立一个 Django 应用。

我使用docker来做这个。 这是我的docker-compose.yml

version: '2'
services:
 nginx:
 container_name: nginx-container
 links:
 - uwsgi
 build:./nginx
 ports:
 -"8888:80"
 volumes_from:
 - uwsgi
 uwsgi:
 container_name: uwsgi-container
 build:./uwsgi
 expose:
 -"8001"
 volumes:
 -./code/conf:/opt/conf
 -./code/app:/opt/app

用于用户定义的Dockerfile:

FROM python:3.5
RUN ["pip","install","uwsgi"]
CMD ["uwsgi","--master","--ini","/opt/conf/uwsgi.ini"]

Nginx的Dockerfile:

FROM nginx
RUN ["rm","/etc/nginx/conf.d/default.conf"]
RUN ["ln","-s","/opt/conf/nginx.conf","/etc/nginx/conf.d/"]
CMD ["nginx","-g","daemon off;"]

这是我的目录树:

├── README.md
├── code
│ ├── app
│ └── conf
├── collectstatic.sh
├── docker-compose.yml
├── install.sh
├── migrate.sh
├── nginx
│ └── Dockerfile
├── restart.sh
├── upgrade.sh
├── uwsgi
│ └── Dockerfile

所以我用 docker-compose build 构建映像然后在 background 中启动新容器,然后使用 docker-compose up -d 执行一些安装任务,比如安装 Django 。生成密钥或者任何你想要的容器。

Nginx 和with容器使用共享卷读取配置文件并与文件套接字通信。

不确定这是最好的方法但是这是一个正在进行的工作。


回答 2:

我从 Hampton: 找到了这个答案

这只是在进程处于同一主机。VM或者容器中,因为它尝试连接到同一台机器。 当它们在不同的容器中时,它不工作。

你需要更改 Nginx 配置,以便它使用。容器的内部IP地址。"

然而,如果将 Nginx 放在不同容器中,也必须记住,也必须将 nginx.conf, 指针指定为别名。

我希望这个代码适用于每个人,它花了我几个小时的时间来描述如何构建 arraylist,Docker 和 Nginx:

# nginx.conf
 upstream djangoA {
 server $DOCKER_CONTAINER_SERVICE:9000 max_fails=3 fail_timeout=0;
 # In my case looks like: web:9000
 }
Server {
 include mime.types;
 # The port your site will be served on 
 listen 80;
 # the domain name it will serve for
 server_name $YOUR_SERVER_NAME;# substitute your machine's IP address or FQDN
 charset utf-8;
 #Max upload size
 client_max_body_size 512M; # adjust to taste
 location/site_media {
 alias $DIRECTORY_STATIC_FILES/site_media;#your Django project's media files have to be inside of the container have nginxs, you can copy them with volumes.
 expires 30d;
 }
 location/{
 try_files $uri @proxy_to_app;
 }
 # Finally, send all non-media requests to the Django server.
 location @proxy_to_app {
 proxy_set_header X-Real-IP $remote_addr;
 proxy_redirect off;
 proxy_set_header Host $host;
 proxy_pass http://djangoA;
 }
}

对于docker的组合:

#production.yml
version: '2'
services:
 db:
 extends:
 file: base.yml
 service: db
 nginx:
 image: nginx:latest
 volumes:
 -./nginx:/etc/nginx/conf.d/
 -./$STATIC_FILE_ROOT/site_media:/$STATIC_FILE_ROOT/site_media
 ports:
 -"80:80"
 depends_on:
 - web
 web:
 extends:
 file: base.yml
 service: web
 build:
 args:
 - DJANGO_ENV=production
 command: bash -c"python manage.py collectstatic --noinput && chmod 775 -R project/site_media/static && gunicorn project.wsgi:application"
 volumes:
 -./$DIRECTORY_APP:/$DIRECTORY_APP
 ports:
 -"9000:9000"
 depends_on:
 - db
volumes:
 db_data:
 external: true

回答 3:

最后,我为 Django 。Gunicorn 。Nginx 和Postgres构建了我的docker组合,感谢( 大部分) 对这个教程的。

基本上,你有一个容器为 Nginx,一个容器为 Django+Gunicorn,一个容器( 如果需要多个数据库,则更多) 。

如果把两个容器分成两个容器,但我认为这更有意义,因为Gunicorn进程始终运行一个wsgi应用程序。 如果在运行 1时,不可能运行,运行N Django,或者N Gunicorn运行N Django,因此除了缩放N Gunicorn+Django容器外,这里还没有缩放。

卷被用来保持数据库的'数据( Django/media 文件的optionnaly static ) ) 永久性。

我在这里找了个教程,所以我将在编辑/评论中发布链接,但我不会在这里发表我的文章。

同时我提供的above 链接是一个很好的起点。

编辑:现在你可以查看这个 Docker 设置示例和相关的博客文章。





Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语