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システムを使用します。利点は、環境が包括的で比較的安全であるということです。ただし、欠点は、最終的なイメージのサイズが大きいことです。これは、後でアルパインバージョンに改善できます。
イメージ内のソフトウェアを更新し、djangoプロジェクトコードを格納する新しいバックエンドディレクトリを作成し、新しい静的メディアを作成します。そして、サービス操作ファイル中に生成された対応するものを格納するためのパスをログに記録します
。1つはPythonキャッシュ用、もう1つは現在の実行環境を示すための2つの環境変数を設定します
。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;
}
}
ここでは、リクエストをバックエンドサービスに転送するアップストリームのサーバーパラメーターに注意する必要があります。ここで、docker-composeのバックエンドの名前はdjango_webで、dockerの上位パスです。 -compose.ymlはproject /であるため、構成する必要がありますproject_django_web_1
。naginxは、受信したリクエストの「apollo_spa」を「project_django_web_1」に置き換えます。
公式の説明を添付してください:
たとえば、アプリがmyappというディレクトリにあり、docker-compose.ymlが次のようになっているとします。
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432"
docker-compose upを実行すると、次のことが起こります。
myapp_defaultというネットワークが作成されます。
コンテナは、Webの構成を使用して作成されます。これは、webという名前でネットワークmyapp_defaultに参加します。
コンテナーは、dbの構成を使用して作成されます。これは、dbという名前でネットワークmyapp_defaultに参加します。
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.ミラーエクスポート
ローカルイメージがパッケージ化されたら、dockersaveコマンドを使用してイメージをエクスポートできます。
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。画像をインポートする
DockerLoadを使用して画像に注ぎます
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 /