LoginSignup
0
0

More than 1 year has passed since last update.

DjangoとDocker練習O2o1o0 DjangoをDockerコンテナへインストールしよう!

Last updated at Posted at 2022-05-08

目標

開発環境を用意する

情報

What is This is
連載の目次 📖 DjangoとDockerでゲーム対局サーバーを作ろう!

この記事のアーキテクチャ:

What is This is
OS Windows10
Container Docker
Editor Visual Studio Code (以下 VSCode と表記)
Database PostgreSQL

一番参考になる元記事は 📖Quickstart: Compose and Django だ。
わたしの記事は単に やってみた ぐらいの位置づけだ

手順

Step [O2o1o0g1o0] エディターのインストール - Visual Studio Code

👇 以下のリンクから、がんばって Visual Studio Code をインストールしてほしい

📖 Visual Studio Code

Step [O2o1o0g2o0] リポジトリの用意 - Git

がんばって Git を使ったソース管理を覚えてきてほしい

👇 参考サイト

Step [O2o1o0g3o0] 仮想コンテナの用意 - Docker

がんばって Docker と docker-compose を覚えてきてほしい

Step [O2o1o0g4o0] 開発環境の確認

VSCode のターミナルで以下のコマンドを叩いていって、あなたのPCと この記事の環境が似ているか確認してほしい

python -V

Python 3.9.13

docker --version

Docker version 20.10.10, build b485636

docker-compose -version

docker-compose version 1.29.2, build 5becea4c

# pip を最新に
python -m pip install --upgrade pip

Step [O2o1o0g5o0] Pythonパッケージ インストール指定 - requirements.txt ファイル

👇 以下のファイルを新規作成してほしい

    └── 📂 src1                   # あなたの開発用ディレクトリー。任意の名前
👉      └── 📄 requirements.txt
# Dockerは2022年時点で Django 4 に対応してないから Django 3 を指定する
Django>=3.0,<4.0

# PostgreSQLへ接続するためのドライバ
psycopg2>=2.8

Step [O2o1o0g6o0] ドッカーファイル作成 - Dockerfile ファイル

以下のファイルを新規作成してほしい

    └── 📂 src1
👉      ├── 🐳 Dockerfile
        └── 📄 requirements.txt
# See also: https://docs.docker.com/samples/django/

FROM python:3

# Pythonのキャッシュファイル(__pycache__ディレクトリや.pycファイル)を作成するのを止めます
ENV PYTHONDONTWRITEBYTECODE=1

# 出力をPythonでバッファリングせずにターミナルに直接送信します
ENV PYTHONUNBUFFERED=1

# コンテナに /code ディレクトリを作成し、以降、 /code ディレクトリで作業します
WORKDIR /code

# requirements.txtを /code/ ディレクトリへコピーします
ADD requirements.txt /code/

# requirements.txtに従ってpip installします
RUN pip install -r requirements.txt

# 開発環境のファイルを /code/ へコピーします
COPY . /code/

Step [O2o1o0g7o0] ドッカーコンポーズファイル作成 - docker-compose.yml ファイル

以下のファイルを新規作成してほしい

    └── 📂 src1
👉      ├── 🐳 docker-compose.yml
        ├── 🐳 Dockerfile
        └── 📄 requirements.txt
version: "3.9"

services:
  # データベース
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  # Djangoアプリ
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000 --settings=project1.settings
    #                                   ------- ----            -----------------
    #                                   1       2               3
    # 1. Dockerコンテナ内のサーバーは localhost ではなく 0.0.0.0 と書く
    # 2. Dockerコンテナ内のWebアプリケーションのポート番号
    # 3. Django設定のPythonモジュール。分からなければ、Djangoの設定ファイル(src1/projectN/settings.py)の拡張子抜きのドット区切りと考えればよい
    #                                                                        -----------------
    #    例えばレッスンの最初に projectN プロジェクトを作成したなら、
    #    デフォルトでは projectN プロジェクトの --settings=projectN.settings を指定するようハードコーディングされる。
    #    この Django設定 を差し替えたくなったら、ここを変えればよい
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    depends_on:
      - db

Step [O2o1o0g8o0] プロジェクト作成 - startproject 管理コマンド

以下の説明は なんとことだか分からないだろうが、自分の頭で考えてほしい

Django では 設定ファイルを入れるフォルダーを プロジェクト フォルダー と呼んでいて、あなたの環境に複数作ることができる。
使い方は任意で、テスト環境、ステージング環境、本番環境 のように分けてもいいし、分けなくてもいい

以上で説明を終わる

あなたの開発用ディレクトリーへ移動してほしい

cd src1

そして、以下のコマンドを1回だけ叩いてほしい

docker-compose run web django-admin.py startproject project1 .
#                                                   -------- -
#                                                   1        2
# 1. 任意のDjangoプロジェクト フォルダー名
# 2. パス。 "." は コマンドを叩いたディレクトリにプロジェクトフォルダーを作る

Output:

Creating src1_web_run ... done
/usr/local/bin/django-admin.py:17: RemovedInDjango40Warning: django-admin.py is deprecated in favor of django-admin.
  warnings.warn(

👇 すると、あなたの開発用ディレクトリーの下に、プロジェクト フォルダーと、 manage.py ファイルが自動生成される

    └── 📂 src1
        ├── 📂 project1
        │   ├── 📄 __init__.py
        │   ├── 📄 asgi.py
        │   ├── 📄 settings.py
        │   ├── 📄 urls.py
        │   └── 📄 wsgi.py
        └── 📄 manage.py

Step [O2o1o0g9o0] セキュリティ対策 - SECRET_KEY 変数

プロジェクトを作成した直後には問題がある。だから対応する。

👇 以下のファイルを作成してほしい

    └── 📂 src1
        ├── 📂 project1
        │   ├── 📄 __init__.py
        │   ├── 📄 asgi.py
👉      │   ├── 📄 settings_secrets.py
        │   ├── 📄 settings.py
        │   ├── 📄 urls.py
        │   └── 📄 wsgi.py
        ├── 🐳 docker-compose.yml
        ├── 🐳 Dockerfile
        ├── 📄 manage.py
        └── 📄 requirements.txt

👇 次に、 📄 settings.py から2つの変数を探してテキストを切り取り、📄 settings_secrets.py へ貼り付けてほしい

    └── 📂 src1
        ├── 📂 project1
        │   ├── 📄 __init__.py
        │   ├── 📄 asgi.py
👉      │   ├── 📄 settings_secrets.py   # こっちへ貼り付ける
👉      │   ├── 📄 settings.py           # こっちから切り取る
        │   ├── 📄 urls.py
        │   └── 📄 wsgi.py
        ├── 🐳 docker-compose.yml
        ├── 🐳 Dockerfile
        ├── 📄 manage.py
        └── 📄 requirements.txt
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '<シークレット>'
ALLOWED_HOSTS = []

👇 以下のファイルが無ければ新規作成、あれば編集してほしい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings_secrets.py
    │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
👉  └── 📄 .gitignore

👇 例えば、 📄 .gitignore の冒頭あたりにでも 追加してほしい

# Django practice
#   |
#   +-- Secret
src1/project1/settings_secrets.py
src1/project2/settings_secrets.py

👇 以下のファイルを編集してほしい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings_secrets.py
👉  │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore

👇 冒頭のあたりにでも追加してほしい

from .settings_secrets import SECRET_KEY, ALLOWED_HOSTS
#    -----------------        -------------------------
#    1                        2
# 1. `src1/projectN/settings_secrets.py` を指しています
#                   ----------------
# 2. このファイル内では使われていませんが、このファイルを使う側から使われます

👇 以下のファイルを新規作成してほしい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
👉  │   │   ├── 📄 settings_secrets_example.txt
    │   │   ├── 📄 settings_secrets.py
    │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '<シークレット>'

ALLOWED_HOSTS = []
#               --
#               1
# 1. 例えば レンタルサーバーを借りたときなどは、ここに IPアドレス や ホスト名 を入れないと、外部からWebサイトが見れないだろう

Step [O2o1o0g9o1o0] プロジェクト名の一般化

Step [O2o1o0g9o1o1o0] asgi.py

👇 以下のファイルを編集してほしい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
👉  │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings_secrets_example.txt
    │   │   ├── 📄 settings_secrets.py
    │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore
# ...略... import文など


# vvvv 追加ここから
# [O2o1o0g9o1o1o0] プロジェクト名の一般化
from .settings import PROJECT_NAME
#    ]--------        ------------
#    12               3
# 1. 同じディレクトリー
# 2. `src1/projectN/settings.py`
#                   --------
# 3. 変数

# * 変更前
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project1.settings')
# * [O2o1o0g9o1o1o0] プロジェクト名の一般化
os.environ.setdefault('DJANGO_SETTINGS_MODULE', f'{PROJECT_NAME}.settings')
#                                                 -----------------------
#                                                 1
# 1. 設定モジュール名 `src1/projectN/settings.py`
#                         -----------------
# ^^^^ 追加ここまで


# ...略... application変数の設定など

Step [O2o1o0g9o1o2o_9o0] settings.py

👇 以下のファイルを編集してほしい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings_secrets_example.txt
    │   │   ├── 📄 settings_secrets.py
👉  │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore
# ...略...


# * 変更前
# WSGI_APPLICATION = 'project1.wsgi.application'
# * [O2o1o0g9o1o2o_9o0] プロジェクト名の一般化
WSGI_APPLICATION = f'{PROJECT_NAME}.wsgi.application'
#                    -------------------------------
#                    1
# 1. DjangoのWSGI設定の大元となるグローバル変数。
#    `src1/projectN/wsgi.py` ファイルの中の application 変数を指している
#          -------------


# ...略...

Step [O2o1o0g9o1o2o0] urls.py

Step [O2o1o0g9o1o3o0] wsgi.py

👇 以下のファイルを編集してほしい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings_secrets_example.txt
    │   │   ├── 📄 settings_secrets.py
    │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls.py
👉  │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore
# ...略...


# [O2o1o0g9o1o3o0] プロジェクト名の一般化
from .settings import PROJECT_NAME
#    ]--------        ------------
#    12               3
# 1. 同じディレクトリー
# 2. `src1/projectN/settings.py`
#                   --------
# 3. 変数


# ...略...


# * 変更前
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project1.settings')
# * 変更後
os.environ.setdefault('DJANGO_SETTINGS_MODULE', f'{PROJECT_NAME}.settings')
#                                                 -----------------------
#                                                 1
# 1. 設定モジュール名 `src1/projectN/settings.py`
#                         -----------------


# ...略...

Step [O2o1o0gA10o0] コメント - manage.py ファイル

👇 以下のファイルに、コメントを書き入れてもいいし、書き入れなくてもよい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings_secrets_example.txt
    │   │   ├── 📄 settings_secrets.py
    │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
👉  │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project1.settings')
    #                                                -----------------
    #                                                1
    # 1. Django設定のPythonモジュール。分からなければ、Djangoの設定ファイル(src1/projectN/settings.py)の拡張子抜きのドット区切りと考えればよい
    #                                                                        -----------------
    #    例えばレッスンの最初に projectN プロジェクトを作成したなら、
    #    デフォルトでは projectN プロジェクトの settings.py ファイルを指定するようハードコーディングされる。
    #    コマンドライン引数で設定ファイルを指定できるので、ここを編集する必要はない
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

Step [O2o1o0gA11o0] コメント - urls.py ファイル

👇 以下のファイルに、コメントを書き入れてもいいし、書き入れなくてもよい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings_secrets_example.txt
    │   │   ├── 📄 settings_secrets.py
    │   │   ├── 📄 settings.py
👉  │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore
"""projectN URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

urlpatterns = [
    # 最初から Django の管理画面は用意されている
    path('admin/', admin.site.urls),
    #     ------   ---------------
    #     1        2
    # 1. 例えば `http://example.com/admin/` のような URLのパスの部分
    #                              -------
    # 2. 例えば `http://example.com/admin/login/?next=/admin/` のように admin.site.urls モジュールに含まれる urlpatterns を `1.` にぶら下げる
    #                                    --------------------
    #
    # もしあなたが、あとで Django アプリケーションを作ったなら、以下のように追加することになるだろう
    # path('', include('app1.urls')),
    #      --           ---------
    #      1            2
    # 1. 例えば `http://example.com/` のような URLの直下
    # 2. `src1/app1/urls.py` の urlpatterns を `1.` にぶら下げる
    #          ---------
]

Step [O2o1o0gA12o0] 設定変更 - settings.py ファイル

👇 以下のファイルを編集してほしい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings_secrets_example.txt
    │   │   ├── 📄 settings_secrets.py
👉  │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore

import

👇 冒頭のあたりに追加

import os


# ...略...

PROJECT_NAME

👇 BASE_DIR の設定の下あたりに追加

# ...略...


# プロジェクト名を親ディレクトリー名から取得
PROJECT_NAME = os.path.basename(Path(__file__).resolve().parent)
# print(f"[projectN settings.py] PROJECT_NAME:{PROJECT_NAME}")


# ...略...

ROOT_URLCONF

# ...略...


# * 変更前
# ROOT_URLCONF = 'project1.urls'
# * 変更後
ROOT_URLCONF = f'{PROJECT_NAME}.urls'


# ...略...

DATABASES

👇 探して変更してほしい

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

# * 変更前
#DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': BASE_DIR / 'db.sqlite3',
#    }
#}
# * 変更後
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('POSTGRES_NAME'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
        'HOST': 'db',
        'PORT': 5432,
    }
}

Step [O2o1o0gA13o0] コメント - settings.py ファイル

👇 以下のファイルに、コメントを書き入れてもいいし、書き入れなくてもよい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄__init__.py
    │   │   ├── 📄asgi.py
    │   │   ├── 📄settings_secrets_example.txt
    │   │   ├── 📄settings_secrets.py
👉  │   │   ├── 📄settings.py
    │   │   ├── 📄urls.py
    │   │   └── 📄wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore

👇 抜粋

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
#                        ------------------------
#                        1
# 1. 例えば `src1/projectN/settings.py` ファイルから見て
#    .resolve()               は `code/projectN/settings.py` (`src1` は見えず `code` に差し変わっている)
#    .resolve().parent        は `code/projectN/`
#    .resolve().parent.parent は `code/`
#    となっていて、つまり BASE_DIR は あなたの開発用ディレクトリーを指している
ROOT_URLCONF = f'{PROJECT_NAME}.urls'
#                -------------------
#                1
# 1. DjangoのURL設定の大元となるPythonモジュール。
#    `src1/projectN/urls.py` を指している
#          -------------

Step [O2o1o0gA14o0] コメント - settings_secrets.py ファイル

👇 以下のファイルに、コメントを書き入れてもいいし、書き入れなくてもよい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings_secrets_example.txt
👉  │   │   ├── 📄 settings_secrets.py
    │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore
ALLOWED_HOSTS = []
#               --
#               1
# 1. 例えば レンタルサーバーを借りたときなどは、ここに IPアドレス や ホスト名 を入れないと、外部からWebサイトが見れないだろう

Step [O2o1o0gA15o0] ギット設定 - .gitignore ファイル

👇 (もしgitを使っているなら)以下のファイルを編集してほしい

    ├── 📂 src1
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings_secrets_example.txt
    │   │   ├── 📄 settings_secrets.py
    │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
👉  └── 📄 .gitignore

👇 例えば、冒頭あたりにでも 追加してほしい

# Django practice
#   |
#   +-- Winmerge
*.bak
#   |
#   +-- Database
src1/data/db

Step [O2o1o0gA16o0] ドッカーコンテナ起動 - docker-compose コマンド

👇 以下のコマンドを叩いてほしい

# がんばって docker-compose.yml ファイルを置いてあるディレクトリーへ移動してほしい
# cd src1

docker-compose up

👇 このとき、以下の巨大なフォルダーが作成される

    ├── 📂 src1
    │   ├── 📂 data
    │   │   └── 📂 db
👉  │   │       └── (たくさんのもの)
    │   ├── 📂 project1
    │   │   ├── 📄 __init__.py
    │   │   ├── 📄 asgi.py
    │   │   ├── 📄 settings_secrets_example.txt
    │   │   ├── 📄 settings_secrets.py
    │   │   ├── 📄 settings.py
    │   │   ├── 📄 urls.py
    │   │   └── 📄 wsgi.py
    │   ├── 🐳 docker-compose.yml
    │   ├── 🐳 Dockerfile
    │   ├── 📄 manage.py
    │   └── 📄 requirements.txt
    └── 📄 .gitignore

Step [O2o1o0gA17o0] Webページへアクセス

次に、ブラウザで以下のURLにアクセスしてほしい

http://localhost:8000

これで、ロケットが飛んでいるページが出てくれば インストールは完了だ。
[Ctrl]+[C] キーでWebサーバーを停めることができる

Step [O2o1o0gA18o0] Dockerコンテナの停止の練習

Dockerコンテナの停止の練習をしてほしい。そんなん知ってるという人はパスして構わない

例えば 何を言っているか分からないかもしれないが、
ターミナルのフォアグラウンドで動いていれば [Ctrl] + [C] キーを打鍵したり、
ターミナルのバックグラウンドで動いていれば docker-compose down コマンドを打鍵するといいだろう

次の記事

📖 Djangoの本番環境のプロジェクトの作り方を予習しよう!

参考にした記事

📖 Django: SECRET_KEY を GitHub に晒さない

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0