Docker-compose を使用して Django アプリケーションをオフラインでデプロイする方法

Docker-compose を使用して Django アプリケーションをオフラインでデプロイする方法

当社のイントラネット環境では、一部のテーブルの CRUD、データのエクスポート、人事権限管理などの機能を備えた CMS に似たアプリケーションを導入する必要があります。 Django はこのような作業に向いており、開発作業量も大きくないと考え、開発基盤として Django を選択しました。開発機能は比較的シンプルで、xadmin などのプラグインを使用することで上記の機能のほとんどを実現できます。しかし、イントラネット環境へのデプロイではpipなどのツールが使えないという、避けられない問題がありました。幸い、イントラネット内にyumサーバーが用意されていたので、イントラネットサーバーにDockerをインストールし、開発環境のコンテナを本番環境にコピーしてデプロイすることにしました。主な手順は次のとおりです。

  1. 開発環境用のDocker-ceをインストールする
  2. 開発環境用のDocker-composeをインストールする
  3. 開発環境の設定
  4. コンテナを保存
  5. 本番環境用にDocker-ceとdocker-composeをインストールする
  6. コンテナファイルを送信して実行する

注: ここでの開発環境は Ubuntu 18.04 で、本番環境は Centos 7.2 です。別の環境をご利用の場合は、ご自身で違いを確認し、システムに適したコマンドを使用してください。

開発環境用のDocker-ceをインストールする

Docker と Docker-compose が今回のデプロイメントのキーポイントです。Django アプリケーション部分を削減してみます。 Docker はコンテナ仮想化の基盤部分を担当します。Docker-compose はコンテナ オーケストレーション ツールです。これを使用すると、コンテナを接続するためのシェルを作成する必要がありません。まず Docker-ce をインストールしましょう。ここでは主に Docker の公式ドキュメントを参照します。私が書いた内容が十分に詳細でなかったり、古くなっている場合は、公式 Web サイトにアクセスして、より信頼性が高く更新されたドキュメントを参照できます。

古いバージョンをアンインストールする

インストールする前に、古いバージョンの Docker をアンインストールする必要があります。新しいシステムを使用している場合は、この手順を無視できます。

$ sudo apt remove docker docker-engine docker.io containerd runc

使用するaptリポジトリをインストールする

apt パッケージインデックスを更新する

$ sudo aptアップデート

apt が https 経由でリポジトリにアクセスできるようにする

$ sudo apt インストール \
  apt-transport-https \
  ca証明書\
  カール\
  gnupgエージェント\
  ソフトウェアプロパティ共通

Dockerの公式GPGキーを追加する

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key を追加 -

Dockerリポジトリを追加する

$ sudo aptリポジトリを追加\
  "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  安定した"

Docker-ceをインストールする

以上の準備ができたら、Docker-ceのインストールは簡単です。Ubuntuに慣れている方であれば、すぐにインストールできます。

$ sudo aptアップデート
$ sudo apt install -y docker-ce

インストールが完了したら、docker サービスを開始し、システムの起動時に毎回起動するようにします。

$ sudo systemctl dockerを起動します
$ sudo systemctl dockerを有効にする

開発環境用のDocker-composeをインストールする

Docker-ce をインストールすると、Docker-compose は簡単に使用できるようになります。 Linux またはその他のプラットフォームを使用している場合は、Docker-compose のコンパイル済みバイナリファイルを直接ダウンロードして使用できます。

次のようにコードをコピーします
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

ダウンロード後、権限を変更し、実行ファイルを追加します

$ sudo chmod +x /usr/local/bin/docker-compose

最後に、Docker-compose のバージョン番号を確認して、正常にインストールされているかどうかを確認できます。

$ docker-compose --version
docker-compose バージョン 1.24.0-rc1、ビルド 0f3d4dda

開発環境の設定

ここでの開発環境は Django 環境です。デモンストレーションの都合上、新しく作成した Django プロジェクトを使用してみます。

新しいDjangoプロジェクトを作成する

新しい Django プロジェクトを作成し、最初に最上位フォルダーを作成して、このフォルダーにプロジェクト ファイルを配置します。ディレクトリ構造はおおよそ次のようになります。

 - プロジェクト
 --Dockerファイル
 --docker-compose.yml
 --マイサイト
  --manage.py
  --要件.txt

まずプロジェクトフォルダを作成します

$ mkdir プロジェクト

次に、新しい Django プロジェクトを作成するか、既存のプロジェクトをコピーします。

$ django-admin.py プロジェクト mysite を開始します

requirements.txt ファイルを生成する

前の手順では、mysite という Django プロジェクトがすでに存在します。このフォルダーに requirements.txt を配置し、その内容が次のようになっているとします。

$ cat 要件.txt

defusedxml==0.5.0
差分マッチパッチ==20181111
ジャンゴ==2.1.7
django-crispy-forms==1.7.2
django-フォームツール==2.1
django-import-export==1.2.0
django-reversion==3.0.3
et-xmlファイル==1.0.1
将来==0.15.2
httplib2==0.9.2
jdcal==1.4
odfpy==1.4.0
オープンpyxl==2.6.0
ピッツ==2018.9
pyYAML == 3.13 です
6==1.10.0
タブライブラリ==0.12.1
ユニコードcsv==0.14.1
xadmin==0.6.1
xlrd==1.2.0
xlwt==1.3.0
mysqlクライアント==1.4.2

もちろん、これらは私のプロジェクトに必要な依存関係であり、あなたの依存関係は私のものとは異なる場合があります。

新しいDockerfileを作成する

プロジェクトとその依存ファイルができたので、次のステップは、Django プロジェクトの実行環境の Docker イメージを作成することです。まず、Docker イメージをビルドするための Dockerfile を作成します。 プロジェクト フォルダーに次の内容の新しい Dockerfile を作成します。

$ 猫 Dockerfile
Python:3.6.8 から
環境変数 PYTHONUNBUFFERED 1

mkdir /configを実行します
/mysite/requirements.txt /config/ を追加します。
pip install -r /config/requirements.txt を実行します。
mkdir /src を実行
ワークディレクトリ /src/mysite

このファイルについて簡単に説明させてください。

Python:3.6.8 から

ここで使用するベース イメージは python: 3.6.8 です。そのベース イメージは Ubuntu で、こちらの方が使い慣れています。alpine に慣れている場合は、はるかに小さい alpine を使用することもできます。

環境変数 PYTHONUNBUFFERED 1

Env キーワードを使用して、任意のオペレーティング システムの環境変数を作成できます。

環境変数 PYTHONUNBUFFERED 1

たとえば、Django キーを保存するために使用している場合は、次のように記述します。

ENV DJANGO_SECRET_KEY l!fafmjcqyn+j+zz1@2@wt$o8w8k(_dhgub%41l#k3zi2m-b%m

コード内では次のように使用します。

インポートOS
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']

名前が示すように、RUN はコンテナ内でコマンドを実行します。ここでは、RUN コマンドは /config と /src の 2 つのフォルダーを作成し、Python の依存関係環境をインストールします。

mkdir /configを実行します
mkdir /src を実行
pip install -r /config/requirements.txt を実行します。

追加

/mysite/requirements.txt /config/ を追加します。

コンテナのWORKDIRにローカルファイルを追加する

ワークディレクトリ /src/mysite

コンテナ内で実行される後続のすべてのコマンドのデフォルト パスを指定します。実行されるコマンドは、後で docker-compose ファイルで確認できます。

新しいdocker-composeスクリプトを作成する

Docker-compose を使用すると、複数のコンテナを管理できます。コンテナを実行するために大量のパラメータを手動で追加したり、コンテナを接続したりする作業は、Docker-compose によって実行できるようになります。私の docker-compose.yml の内容は次のとおりです。

$ cat docker-compose.yml
バージョン: '3'
サービス:
  デシベル:
   イメージ:mysql:5.7
   コンテナ名: mysite_db
   ポート:
    - 「3306:3306」
   環境:
    MYSQL_ROOT_PASSWORD: マイサイト
    MYSQL_DATABASE: マイサイト
    言語: C.UTF-8
  ウェブ:
   建てる: 。
   コンテナ名: mysite_web
   コマンド: bash -c "p​​ython manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
   依存:
    -db
   ボリューム:
    - ./mysite:/src
   再起動: 常に
   ポート:
    - 「8002:8000」

この docker-compose ファイルについて簡単に説明しましょう。

バージョン: '3'

docker-compose のバージョンを指します。バージョンによってサポートされる構成項目が若干異なります。サービスはサービスによって管理されます。この例では、db と web の 2 つのサービスがあります。 2 つのサービスの設定項目を個別に説明します。

image は、docker hub またはローカルの既存のイメージを直接使用します。これは MySQL5.7 を使用します。container_name はコンテナの名前を指定します。ports は、コンテナからホストへのポート マッピングを指定します。前のポートはホスト ポート、後ろのポートはコンテナ ポートです。environment は、現在のサービスが実行されている環境を指定します。環境の詳細については、現在のイメージの説明を参照してください。サポートされているものを構成できます。この場合、MySQL ルート パスワード、デフォルトのデータベース、およびデータベースの文字セットを指定します。 web: build はイメージをコンパイルします。ここでは、現在のフォルダにある Dockerfile が使用されます。command は、コンテナの起動後に実行されるコマンドです。depends_on は、現在のコンテナが依存するサービスです。つまり、現在のサービスを起動する前に、依存関係にあるサービスが正常に起動されている必要があります。volumes は、現在のコンテナによってマウントされるボリュームです。前半はホスト ディレクトリを参照し、後半はコンテナ ディレクトリを参照します。restart は、コンテナの再起動戦略を指定します。今回の場合、エラーが発生すると再起動を続けます。 ここでは、コンテナのポート 8000 がホストのポート 8002 にマッピングされ、Web サービスにはポート 8002 からアクセスされます。

Django プロジェクトの設定

次に、現在のコンテナ環境に応じて、mysite プロジェクトの settings.py ファイルを変更します。

$ vim mysite/mysite/settings.py

ファイル内の ALLOW_HOSTS セクションを見つけて、次の内容で「web」を追加します。

ALLOW_HOSTS = [
  ...
  'ウェブ'
]

次に、settings.py の DATABASES 部分を変更し、パラメータを MySQL サービス db のパラメータに変更します。内容は次のとおりです。

データベース = {
  'デフォルト': {
    'エンジン': 'django.db.backends.mysql',
    '名前': 'mysite',
    'ユーザー': 'root',
    'パスワード': 'mysite',
    'ホスト': 'db'
  }
}

ここでの MySQL 接続パラメータは、docker-compose.yml ファイルの db 部分の環境で定義されます。パラメータ HOST の値が db であることは注目に値します。docker-compose がコンテナを起動すると、これらのコンテナが接続されます。コンテナは、ドメイン名を使用する場合と同様に、サービス名を使用して相互に ping を実行できるため、ここでの「HOST」には直接「db」を入力できます。

Docker-composeを使用してプロジェクトをビルドする

上記の作業が終わると、基本的には準備完了です。イメージをビルドできます。ここでは 2 つのサービスがあります。DB は実行時にローカル イメージをダウンロードまたは使用するだけで済み、Web も Dockerfile を使用してビルドする必要があります。

$ docker-composeビルド

ダウンロードまたはビルドにしばらく時間がかかると、イメージが正常にビルドされたという情報が表示されます。

プロジェクトを実行してテストする

ビルドが完了すると、Web サービスのイメージが作成されます。次に、docker-compose を使用してサービスを開始します。

$ docker-compose アップ -d

このプロセスも、ネットワーク速度によっては時間がかかる場合があります。MySQL イメージをダウンロードし、db イメージと web イメージに基づいてコンテナを構築し、コンテナを実行します。完了したら、docker-compose psとdocker-compose imagesを使用して、生成したコンテナとイメージを表示できます。

$ docker-compose ps
名前 コマンド 状態 ポート       
---------------------------------------------------------------------------------------
mysite_db docker-entrypoint.sh mysqld アップ 0.0.0.0:3306->3306/tcp、33060/tcp
mysite_web bash -c python manage.py m ... 0.0.0.0:8002->8000/tcp を起動
$ docker-compose イメージ
コンテナ リポジトリ タグ イメージ ID サイズ
--------------------------------------------------------
mysite_db mysql 5.7 e47e309f72c8 355 MB
mysite_web mysite_web 最新 3989acbcc3c9 938 MB

docker-compose を使用してサービスを停止および開始することもできます。より具体的な使用方法については、公式ドキュメントを参照してください。

$ docker-compose を開始します
db を起動しています...完了
ウェブを起動しています...完了
$ docker-compose を停止します
mysite_web を停止しています...完了
mysite_db を停止しています...完了

ここで、サービスの停止と開始の順序が規則的であることがわかります。開始時には、依存するサービスが最初に開始され、次にそれに依存するサービスが開始されます。サービスを開始するときは、その逆になります。サービスが正常に実行されたら、ブラウザにアクセスして、サービスが正常に開始されているかどうかをテストできます。

コンテナを保存

サービスに問題がなければ、現在のコンテナを保存し、新しいプラットフォームへの展開の準備をする必要があります。 注意: イメージを保存するには save を使用します。 save にはコンテナ間の接続状態などの情報が含まれます。 export を使用してイメージを本番環境にエクスポートした場合、docker-compose を使用してサービスを復元することはできません。

$ docker save -o mysql.tar mysql:5.7
$ docker save -o mysite.tar mysite_web:latest

上記のコマンドが正常に実行されると、現在のディレクトリに 2 つの tar ファイルが生成され、プロジェクト ディレクトリに Dockerfile および docker-compose.yml ファイルが生成され、本番マシンに移行する準備が整います。

本番環境用にDocker-ceとdocker-composeをインストールする

本番環境はCentOSなので、yumを使って直接インストールできます。

$ sudo yum インストール docker-ce

インストールが成功したら、開発環境を参照して docker-compose を本番サーバーにデプロイします。

コンテナファイルを送信して実行する

scp またはその他のツールを使用して、mysql.tar、mysite.tar、Docker-compose.yml、およびプロジェクト フォルダーを運用サーバーに送信し、元のディレクトリ構造を維持しながらこれらのファイルを保存する適切なフォルダーを見つけます。 まず、2つのイメージを本番サーバーに復元しましょう

$ docker ロード -i mysql.tar
$ docker load -i mysite_web.tar

実行が完了するまでしばらく待つと、現在のサーバーにすでにこれら 2 つのイメージがあることがわかります。

リポジトリ タグ イメージ ID 作成 サイズ
mysite_web 最新 3989acbcc3c9 2日前 983MB
mysql 5.7 e47e309f72c8 3週間前 372MB

ビルド コンテナを実行する前に、docker-compose.yml に簡単な変更を加える必要があります。お気づきかと思いますが、本番サーバーにはインターネットがないので、これ以上イメージをビルドすることはできません。開発環境のイメージもそのままコピーしておいたので、今度はイメージからWebサービスを実行できます。内容は以下のとおりです。

バージョン: '3'
サービス:
  デシベル:
   ...
  ウェブ:
   画像: mysite_web:latest
   ...

Web 内のビルド アイテムを削除し、イメージ アイテムを追加するだけで、コンテンツはコピーしたイメージになります。その後、コンテナを構築してサービスを開始できます。

$ docker-compose アップ -d

結果

名前 コマンド 状態 ポート       
----------------------------------------------------------------------------------------
mysite_web bash -c python manage.py m ... 0.0.0.0:8002->8000/tcp を起動      
mysite_db docker-entrypoint.sh mysqld アップ 0.0.0.0:3306->3306/tcp、33060/tcp

ブラウザを再度開いて、正常に起動するかどうかを確認します。

追記

docker-compose には他にも多くの用途があり、今後のプロジェクトでは他の方向についてもさらに詳しく紹介する予定です。私の作品をご覧いただきありがとうございます。少しでもお役に立てれば幸いです。

参照ドキュメント

Ubuntu用のDocker CEを入手する
Docker Composeをインストールする

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • laradock環境でのdocker-compose操作の詳細な説明
  • Docker-compose ワンクリックデプロイ gitlab 中国語版の方法手順
  • Linux で docker-compose を使用したソフトウェア構成の詳細な説明
  • Docker-compose を使用して GitLab をデプロイする方法
  • docker-compose デプロイメント PHP プロジェクト例の詳細な説明

<<:  CocosCreator 一般的なフレームワーク設計リソース管理

>>:  mysql5.7.19 解凍版の詳細なインストール チュートリアル (純粋なクラックされた中国語版 SQLYog を使用)

推薦する

JavaScriptの強力な演算子をいくつか見てみましょう

目次序文1. ヌル合体演算子2. ??= 空代入演算子3. ?. オプション連鎖演算子4. ?: 三...

Windows サーバー管理におけるセキュリティの考慮事項

ウェブサーバー1. Webサーバーは、wev、cgi、asp機能を無効にするなど、不要なIISコンポ...

mysql-canal-rabbitmq のインストールと展開の非常に詳細なチュートリアル

目次1.1. MySQL binlog を有効にする1.2. RabbitMQ の交換とキューを構成...

MySQLの暗黙的な変換について話す

作業の過程で、暗黙的な変換が発生するケースが数多くあります。暗黙的な変換は、クエリの速度低下を引き起...

Centos7 構成 fastdfs および nginx 分散ファイル ストレージ システムの実装プロセス分析

1. libfastcommon-1.0.43 をインストールします。インストール パッケージは h...

Nginx 運用保守ドメイン名検証方法例

インターフェイス ドメイン名を構成する際、各パブリック プラットフォームはドメイン名に対する開発者の...

IE6 スペースバグ修正方法

コードを見てみましょう:コードをコピーコードは次のとおりです。 < !DOCTYPE html...

MySQL がデフォルト値を持つ NULL 列の使用を推奨しない理由

よく聞かれる答えは、列に NULL 値を使用するとインデックスが無効になるというものですが、実際にテ...

Vue.js パフォーマンス最適化 N 個のヒント (収集する価値あり)

目次機能コンポーネント子コンポーネントの分割ローカル変数v-show によるDOMの再利用キープアラ...

mysql 5.7.11 winx64.zip インストールと設定方法のグラフィックチュートリアル

MySql データベース システムをインストールして構成します。 1. ダウンロード http://...

ReactプロジェクトにSCSSを導入する方法

まず依存関係をダウンロードします yarn sass-loader ノード sass を追加します次...

MySQLのインデックス設計の原則と一般的なインデックスの違いについて簡単に説明します。

インデックス定義: ディスク上に保存される個別のデータベース構造であり、データ テーブル内のすべての...

Node.jsとDenoの比較

目次序文Denoとは何ですか? Node.jsとの比較建築ESモジュール依存関係の管理TypeScr...

React Nativeの起動プロセスの詳細分析

はじめに: この記事ではreact-native-cliで作成したサンプル プロジェクト (Andr...

CSS スタイルを変更してグレーの Web ページ (色なし、明るい白黒のみ) を実現するいくつかの方法

通常、清明節、国哀悼日、大地震の日、影響力のある偉人の死去または命日には、ウェブマスターとして、故人...