web-dev-qa-db-ja.com

Dockerの方法Django + uwsgi / gunicorn + nginx?

Djangoプロジェクトをデプロイする「正しい」方法は何なのか頭がわからない(私はまだ何を使用するのかまだ決めていません。おそらくuwsgiがあるからです)より良いパフォーマンス、提案?)とDockerを使用したnginx。

何人かがすべてを同じ容器に入れているのを見ました。私はDockerの専門家ではありませんが、コンテナは1つのことを行うだけで十分です。つまり、Django + nginxは1ではなく2のようです。

今、私の展開のアイデアは:

  • Djangoおよびuwsgiを含むコンテナ。Dockerfileの最後にuwsgiスクリプトを実行します。このコンテナはポート8000​​を公開します
  • Django one。にリンクされているnginxを含むコンテナ。これはポート80を公開し、リクエストをDjangoにプロキシします。

それを行う他の方法はありますか?このケースをもう少し詳しく説明するチュートリアルはありますか? PCでいくつかのコードをテストするだけでなく、しっかりした製品が必要です。

4
EsseTi

私は現在、Djangoアプリをあなたが望む方法で構築しています。

これを行うにはdocker-composeを使用します。これは私の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

UWSGIの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を使用してイメージを作成し、docker-compose up -dを使用してバックグラウンドで新しいコンテナーを起動します。次に、Djangoのインストール、シークレットキーの生成など、コンテナーの準備を整えたいものをセットアップできます。

nginxおよびuwsgiコンテナーは、共有ボリュームを使用して構成ファイルを読み取り、ファイルソケットと通信します。

まあ、それが最善の方法かどうかはわかりませんが、それは進行中の作業です。

3
Fenkiou

私はこの答えを Michael Hampton から見つけました:

「これは、プロセスが同じホスト、VMまたはコンテナーにある場合にのみ機能します。同じマシンに接続しようとするためです。異なるコンテナーにある場合、機能しません。

Uwsgiコンテナーの内部IPアドレスを使用するように、nginx構成を変更する必要があります。」

また、別のコンテナにNginxを配置する場合は、覚えておく必要があります。また、nginx.confを設定して、静的ファイルディレクトリをエイリアスとして指定し、セキュリティの問題を回避する必要があります。

このコードがすべての人に役立つことを願っています。Gunicorn、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-composeの場合:

#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
Cam T

このチュートリアル のおかげで、(主に)Django、Gunicorn、Nginx、Postgresのdocker-composeをビルドすることができました。

基本的に、Nginx用のコンテナが1つ、Django + Gunicorn用のコンテナが1つ、Postgres用のコンテナが1つ(複数のデータベースが必要な場合はさらに)あります。

Django + Gunicornを2つのコンテナーに分割することもできますが、1つのGunicornプロセスが常に1つのDjango wsgiアプリケーションを実行するため、両方を1つのコンテナーに含める方が理にかなっていると思います。私は使用しません。 N Dunigoを実行するN Gunicorn、N Djangoを実行する1 Gunicorn、またはN Djangoを実行するN Gunicornのいずれかを使用できるため、N Gunicorn + Djangoコンテナーをスケーリングする以外に、スケーリングの可能性はありません。

ボリュームは、データベースのデータ(およびオプションでDjangoの静的/メディアファイル)を永続的に保持するために使用されます。

あなたはそれを行うためのチュートリアルまたは他の方法を求めていたので、私はここに私のdocker-compose.ymlの内容を投稿しません(Dockerfile、Nginx confファイル、Gunicorn confファイル、データベースのenvファイルも必要になるため、 Python DATABASES設定のようなコード)の多くのスニペットですが、時間があるときにチュートリアルを作成し、編集/コメントにリンクを投稿します。

一方、上記で提供したリンクは非常に良い出発点です。

編集:これで、この docker setup example および関連する blog post を確認できます。

2
pawamoy