DockerでDjangoアプリをデプロイ
記事の一言説明(一覧カードに表示されます)
はじめに
Djangoで作成したwebアプリを外部公開つまりはデプロイをします。今回は、Nginx、GunicornをDockerでコンテナ化し、まとめて管理を楽にする方法を書きます。
使用技術
- Docker
- Django
- Nginx
- Gunicorn
- GitHub
- WSL
想定環境
Windows11
事前準備
始める前に、インストールなどのセットアップをしておかないとテンポが悪いため、今回必須のもののインストールを済ませておきます
Dockerのインストール
今回、Dockerがデプロイの肝なので絶対に入れましょう *最後にパソコンの再起動が行われるので気をつけてください
以下のサイトから画像の通りに進めましょう https://www.docker.com/ja-jp/

1,Docker Desktopをダウンロードする

2,Windows版のダウンロード -AMD64 (ARMの方はARMにしてください。基本的にAMDだと思います)
3,ダウンロードして、インストーラーを起動する。 そしたら以下のような画面になると思うので以下のようにチェックボックスを入れて ok を押しましょう

4,パソコンの再起動が始まるので待ちます
5,再起動後、Doceker Desktopが開かれます 開かれない場合は開きましょう
WSLのインストール
今回は、実際のサーバーの代わりとしてWSL(Windows Subsystem for Linux)を使ってそちらにデプロイをしていきます。本番のサーバーにデプロイしたいときはWSLで操作したことをサーバーのCLで操作します。
1,CMDを開きます
2,以下のコマンドを打つ
wsl --install3,インストールが始まるのでしばらく待ちます。途中でユーザーアカウント制御が出てきたら「はい」を選択します。

4,完了すると、再起動が求められるのでPCを再起動
5,再起動後、自動的にWSLが起動する(起動しない場合は検索でUbuntuと検索し、開く)

6,指示通りにユーザー名とパスワードを設定します

:::note warn ここで設定したパスワードはメモするかしっかり記憶しておいてください。そこそこたくさん使います :::
7,以下のコマンドを順番に実行します (実行する時に先ほど設定したパスワードを求められます)
sudo apt update
sudo apt upgrade:::note warn
sudoというコマンドは管理者権限実行ということです。そのため、実行するときは慎重になりましょう
:::
GitHubの準備(デプロイするアプリの準備)
今回は、デプロイのみのため、デプロイする本体のアプリ自体は私が用意しました。 本番でデプロイする際は自分で作ったDjangoアプリにしてください。
1,以下のリンクを開きます https://github.com/med-000/deploy-project
2,画像のHTTPSのリンクをコピーする

3,CMDを開く
4,以下のコマンドを実行する (好きなディレクトリに移動してから行ってください)
git clone [コピーしたリンク]実際
git clone https://github.com/med-000/deploy-project.git
5,projectのディレクトリに以下のコマンドで入ります
cd deploy-project6,以下のコードでVScodeを開きます
code .
7,cloneできたら.gitディレクトリを削除する
今回は、私のprojectをgithubから持ってきているのでこのままでいると私のリポジトリに変更が言ってしまうので消します

.gitディレクトリが表示されない人↓
VScodeで.gitディレクトリを表示する
(また消し方はなんでもいいです。エクスプローラーから消しても変わりません)
:::note alert
本番では、理由がない限り絶対に.gitを消さないでください。
死にます。
今回は、私のリポジトリに変更が行かないようにするために消しました
:::
8,以下のコマンドで現在からの変更を作る
元々.gitフォルダのあった場所で以下を実行してください。
(今回はc: ...deploy-project/>)だったら大丈夫です
git init9,firstコミットをする
git add .
git commit -m 'first'動作確認!!
先ほどcloneしたプロジェクトがcloneしたパソコンで実際に動くかどうかを確認します。
.envの追加
今回、.envというファイルが非常に重要な役割を持っているのですが、絶対に、.envは公開しているgithubにあげてはいけません。
その理由が以下↓ envファイルってなんだ?
今回の理由はこちらで説明しませんが、とりあえずないです。
そのため.envを追加します
1,.envファイルを追加する
manage.pyと同じ場所に.envファイルを作成します
.
+├── .env
├── .env.sample
├── .git
├── .gitignore
├── deployProject
├── docker-compose.yml
├── Dockerfile
├── manage.py
├── myapp
├── nginx
├── requirements.txt
├── static
├── staticfiles
└── templates
2,雛形をコピペ .env.exampleに雛形があるのでそれを.envにコピペします
DJANGO_SECRET_KEY=django-insecure-xxxxxxxxx
DJANGO_DEBUG=0
ALLOWED_HOSTS=example.com,www.example.com,localhost,127.0.0.1SECRET_KEYの生成!!
1,SECRET_KEYを生成する
先ほどの.envファイルにDJANGO_SECRET_KEYという変数があったと思いますが、これはざっくりいうと、このアプリが偽物でないかを確認するためのものです。細かいことは調べていただければわかると思います。
このSECRET_KEYを生成するには以下の手順を踏みます。
2,以下のコマンドを順に打つ
python manage.py shellfrom django.core.management.utils import get_random_secret_keyget_random_secret_key()quit()
3,生成されたキーを.envに書き込む
DJANGO_SECRET_KEY='生成されたキー'
DJANGO_DEBUG=0
ALLOWED_HOSTS=example.com,www.example.com,localhost,127.0.0.1Dockerを実際に動かす!!
今まではpython manage.py runserverで動かしていたと思うのですが、これも全てDocker君がやってくれます(実際にはDockerでコンテナ化されたNginxやGucnicornですが。。。)
ということでやる
1,以下のコマンドを打ってコンテナを作る
docker compose build2,コンテナを動かしてみる
docker compose upこれだけ!!!
実際に、localhostに入って確認してみましょう http://localhost/ http://127.0.0.1/

実際にデプロイする!!
ローカルで動くことが確認できたので、次は、サーバーに実際にデプロイしていきます。今回、本物のサーバーはないので擬似サーバーとしてWSLを使用します。実際にデプロイするときはWSLで行ったことをサーバーのCLで行ってください。
GitHubにpush
みなさんは先ほど、私のリポジトリからみなさんのパソコンにプロジェクトをインポートしましたよね。 それと似たようなことを、行います。細かくいうと、サーバーはまだあなたのプロジェクト知らないので、それをインポートするための準備をGitHubで行います GitHubはプロジェクトを共有するのに便利ですね
1,GitHubリポジトリを作る まず、自分のGitHubページ行きまして、画像の通りに行ってみましょう
1-1,マイページにはいる

1-2,上のタブバーのRepositoriesをクリック

1-3,緑のNewというボタンからRepositoryを作成


:::note warn
visibilityはpublicとなっていますが、privateでも良いです。
今回は、publicにしてください
(privateにすると、cloneが少しめんどくさくなります。そのため、ちょっとセキュリティを堅牢にしたいときはprivateにしましょう)
:::
2,GitHubにPush!! 以下のような画像が出てきたら、その通りに進めてpushをしましょう

以下のコマンドをproject直下(manage.pyがある場所)で行う
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/[ユーザー名]/[リポジトリ名]
git push -u origin mainサーバーにcloneする
1,WSL(Ubuntu)を開く


2,GitHubでリンクをコピー
コピーマークでリンクをコピーします。

3,WSL(Ubuntu)サーバーにclone 以下のコマンドを打ってcloneを行います
git clone [自分のリポジトリのhttp(さっきコピーしたリンク)]
4,中身があるか確認 以下のコマンドでしっかりcloneされてるか確認します
cd [リポジトリ名]
ls
manage.pyがあれば、とりあえずOKです。
.envを作ろう
ローカルでも作りましたが、.envは機密ファイルのため、GitHubでcloneして持ってくることができません。そのため、実際にCLを叩いて作らないといけません。
ということで作っていきましょう
1,現在のディレクトリを確認 以下のコマンドを打って
pwd画像のような/home/ユーザー名/リポジトリ名となっていればOKです

:::note
/home/ユーザー名/リポジトリ名となっていなくとも.../.../リポジトリ名のように最後にリポジトリ名が来ていれば大丈夫です
:::
2,.envの外枠を作って編集する 以下のコマンドを実行して、nanoエディタを開きます
sudo nano .env
このコマンドは、ファイル作成と編集を同時に行えます。ファイル名が被ってあった場合は、編集のみになります。
nanoについて↓ nanoの使い方
3,.envに書き込み
先ほどローカルで作った.envを全てコピーしここに貼り付けます。


4,保存&編集終了 ctr+Sで保存し ctr+Xで編集終了ができます
5,ファイルが作られたか、確認 以下のコマンドを実行して、確認します
ls -al
.envファイルがあれば完璧です。
Dockerを動かす!!
先ほど等同様に行います 1,以下のコマンドを打ってコンテナを作る
docker compose build2,コンテナを動かしてみる
docker compose upこれだけ!!!
実際に、localhostに入って確認してみましょう http://localhost/ http://127.0.0.1/
3,バックグランドで動かす WSL(Ubuntu)はCLです。それなのに、今ままだと他のコマンドが打てません。 そのため、以下のオプションをつけることによってバックグラウンドで動かすことができます
docker compose up -d4,logを確認 バックグラウンドで動かすと本当に動いているのか怖いですよね。 そのため、logを確認するコマンドを紹介します
dokcer comppose logs nginxデプロイ完了!
デプロイしたものを変更する!!
みなさん、デプロイした後のものに何か不備があって困ったことありそうですよね。そんな時に、便利なことに、変更を加えることができます。それをやっていきます。
1,localでcommit&Push まず、加えた変更をcommitして、Pushしましょう 変更したら、VSCode内のCLで以下のコマンドを打ちましょう
git add .
git commit -m 'コミットメッセージ'
git push
2,WSL(Ubuntu)サーバーにpull 先ほどはprojectをサーバーに入れるときcloneを行いました。今回はcloneではなく、pullです。 cloneとpullの違いは、丸ごと持ってくるか変更を持ってくるかの違いです。 気になる人は調べてみてください。
ということでWSL上で以下のコマンドを実行してください
git pull
3,Dockerの立ち上げ直し 以下のコマンドを打ってコンテナを立ち上げ直しましょう
docker compose build
docker compose up -d