docker-composeを使用してDjango前後端分離プロジェクトを配置

8084 ワード

1.パッケージ開発環境におけるバックエンドプロジェクトミラーリング
バックエンドDjangoのDockefile:
FROM python:3.7

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get -y install vim \
    && mkdir -p /home/backend \
    && cd /home/backend \
    && mkdir static \
    && mkdir media \
    && mkdir logs \
    && rm -r /var/lib/apt/lists/*

ENV PYTHONUNBUFFERED 1

ENV ConfigPath "production"

WORKDIR /home/backend

COPY ./requirements.txt /home/backend

RUN pip install -r /home/backend/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple \
    && rm -rf ~/.cache/pip \
    && rm -rf /tmp

COPY ./ /home/backend

CMD ["/usr/local/bin/daphne", "-b", "0.0.0.0", "-p", "8000", "--proxy-headers", "config.asgi:application"]

python:3.7という指定されたバージョンのミラーをベースミラーとしてubuntuシステムを使用すると、環境が全面的で、相対的に保険がかかるという利点があります.しかし、欠点は最終ミラーの体積が大きく、後期にalpineバージョンに改善できることです.ミラー内のソフトウェアを更新し、djangoプロジェクトコードを格納するためにbackendディレクトリを新規作成し、static、media、logsパスを新規作成してサービス実行中に生成された対応するファイルを格納します.2つの環境変数を設定します.1つはpython用のキャッシュで、1つは現在の実行環境を示すために使用されます.Dockerfileの後のコマンド実行ディレクトリを新しいプロジェクトディレクトリに変更します.まず、プロジェクト依存環境をプロジェクトディレクトリにコピーします.インストールプロジェクトは環境に依存しているため、このステップは市場を占めているため、プロジェクトコードをコピーする前に単独で実行します.プロジェクトコードをミラーにコピーします.daphneをサーバとして使用してサービスを開始します.ミラーの構築:
docker build -t backend:p0.0.1 .

2.パッケージ開発環境におけるフロントエンドプロジェクトミラーリング
フロントエンドは主に静的ファイルとスクリプトで、ミラーリングは比較的簡単です.ミラーを作成する前に、本番環境を構成するnginx、主にdocker-composeサービス間の通信:nginxが必要である.conf:
upstream apollo_spa {
        server project_django_web_1:8000;
}
server {
        listen 80;
        server_name _;
        client_max_body_size 1000m;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        charset utf-8;

        location /themis-server/{
                proxy_pass  http://apollo_spa/themis-server/;
                proxy_redirect     off;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
        location /fomssapi/{
                proxy_pass  http://apollo_spa/fomssapi/;
                proxy_redirect     off;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
        location /admin/{
                proxy_pass  http://apollo_spa/admin/;
                proxy_redirect     off;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        location /ws/ {
            proxy_pass http://apollo_spa/ws/;
            proxy_redirect off;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }


        location /static/ {
            proxy_pass  http://apollo_spa/static/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        location /media/ {
            proxy_pass  http://apollo_spa/media/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

    location / {
        root /usr/share/nginx/html;
        autoindex on;
    }
}

ここではupstreamのserverパラメータに注意してください.リクエストをバックエンドサービスに転送します.ここで、バックエンドのdocker-composeの名前はdjango_です.web,docker-compose.ymlの上位パスはproject/なので、project_django_web_1に割り当てると、naginxはリクエスト中の'apollo_を受け取ることになります.spa’を’project_に置き換えるdjango_web_1’. 公式の説明を添付します.
For example, suppose your app is in a directory called myapp, and your docker-compose.yml looks like this:
version: "3"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

When you run docker-compose up, the following happens:
A network called myapp_default is created. A container is created using web’s configuration. It joins the network myapp_default under the name web. A container is created using db’s configuration. It joins the network myapp_default under the name db.
Dockerfile:
FROM nginx
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY dist/Root /usr/share/nginx/html

nginxをベースミラーとして使用します.ミラー内のデフォルトの構成の代わりに、ローカルのnginx構成を使用します.ローカルのコードをミラーにコピーします.ミラーの構築:
docker build -t nginxfont:p0.0.1 .

3.docker-composeプロジェクトの構築
docker-compose.yml:
version: "3"

services:
    # MySQL
    db:
        image: mysql:5.7
        command: [
            '--default-authentication-plugin=mysql_native_password',
            '--character-set-server=utf8',
            '--collation-server=utf8_general_ci',
        ]
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: password
            MYSQL_DATABASE: fomss
        volumes:
            - "/home/project/mysql_data:/var/lib/mysql"

    redis_ser:
        image: redis:2.8
        command: redis-server --requirepass root
        restart: always

    django_web:
        image: backend:prod0.0.1
        restart: always
        links:
            - db
        depends_on:
            - db
            - redis_ser
        volumes:
            - "/home/project/media:/home/backend/media/"
            - "/home/project/logs:/home/backend/logs/"
            - "/home/project/static:/home/backend/static/"
        ports:
            - "30007:8000"

    nginx_server:
        image: nginxfont:prod0.0.1
        restart: always
        ports:
            - "8090:80"
        depends_on:
          - django_web

ここでは全部で4組のサービスが利用され、容器の自動再起動が設定されています.mysql、文字セット、パスワード、データベースを設定し、ホストの/home/project/mysql_にデータをマウントします.dataパスの下;redisは、コマンドラインを使用してパスワードを設定します.バックエンドサービス、docker-composeでdjango_と命名Webはサービス間通信に使用でき、コンテナ内で生成されたデータを格納するための3つのパスがマウントされている.前段およびnginxエージェント:8090ポートを外部に露出し、サービスを提供します.
4.ミラーのエクスポート
ローカルミラーをパッケージ化すると、docker saveコマンドを使用してミラーをエクスポートできます.
docker save -o ~/Desktop/backend.tar backend:prod0.0.1
docker save -o ~/Desktop/nginxfont.tar nginxfont:prod0.0.1
docker save -o ~/Desktop/mysql.tar mysql:5.7
docker save -o ~/Desktop/redis.tar redis:2.8

これにより、プロジェクト全体に必要なミラーをすべてデスクトップにエクスポートします.
5.生産環境の配置
前回エクスポートした光景とdocker-compose.ymlを本番環境にコピー
5.1. ミラーのインポート
docker loadを使用してミラーに注ぐ
docker load --input backend:prod0.0.1

別のミラーを順次インポート
5.2. docker-composeの起動
docker-compose.ymlは/home/projectパスにコピーします.ここでdocker-compose.ymlの上位パス、およびproject/はneginxで構成されているものと一致する必要があります.サービスの開始:
docker-compose up

6.docker-compose自己起動
認証サービスが起動し、問題がなければ.docker-compose起動起動の設定:まずsystemdを使用してdocker起動を管理するには、このステップが重要です.そうしないと、コンテナは起動できません.
systemctl enable docker

docker-composeの自己起動を設定します.
6.1. ソフト接続の確立
cd /usr/local/bin && ln -s /usr/bin/docker-compose docker-compose

6.2. 自己起動スクリプトの編集
cd /etc/init.d/ && vim start-docker-compose.sh

start-docker-compose.sh:
#!/bin/bash
# chkconfig: 2345 85 15
# description: docker-compose init start

/usr/local/bin/docker-compose -f /home/project/docker-compose.yml up -d

認証サービスの再起動が使用可能になりました.deploy_nginx/