🦁

【Docker】環境構築をしよう!【Django】

2024/04/03に公開

はじめに

Dockerの環境構築をやり直すきっかけがあったので、せっかくならと思い、手順をまとめることにしました。
初学者なので間違っている部分、効率の悪い部分などあるかもしれませんが、ご了承ください。
勉強しながら、構築しながらこれを書いているので、おそらくなぞっていけば私と同じように進められるはずです。

前提

あまり関係ないとは思いますが、私のマシンスペックを記載しておきます。

  • OS: Windows 11 Home 64bit
  • CPU: AMD Ryzen 5 5625U with Radeon Graphics 2.30 GHz
  • RAM: 8.00 GB
  • HDD/SSD: SSD 256GB

手順自体は以下の書籍(Zenn)の流れに沿います。

Docker IDの作成

Docker Hubにアクセスして、Docker IDを作成しましょう。

私は連携が好みではないので、メールアドレス、ユーザー名、パスワードを入力して登録しましたが、どちらでもいいと思います。

Dockerにログイン

「Choose your Docker Core subscription」と書かれたページに飛びます。個人利用であれば「Continue with Personal」をクリックしましょう。

メールが飛んでくるので、確認します。

「Verify Email Address」ボタンをクリックすればOKです!

設定まわり

右上のアイコンをクリックし、「My Account」をクリックします。

「Default Privacy」からリポジトリの公開範囲が設定できます。使用用途にもよるとは思いますが、不用意に全世界公開することにならないよう、「Private」にしておくと安心かなと思います。

ほか、設定したい項目があればしておきましょう。

Docker Desktopのインストール

トップに戻り、「Download the desktop application」からダウンロードするか、以下からインストールしてください。

https://docs.docker.com/desktop/install/windows-install/

以下にアクセスして、リリースノートから好みのバージョンでインストールすることもできます。

https://docs.docker.com/desktop/release-notes/

私は4.25.1をインストールします。

インストーラを起動し、指示に従って進めてください。

クリックするとパソコンが再起動するので、何か保存する必要のあるものがある場合は保存してから再起動しましょう。

インストールできたらサインインし、こんな感じになればOKです。

ちなみに、Docker Desktopをインストールすると、同時にDockerComposeもインストールされますので、改めてインストールする必要はありません。

環境構築の前に

イメージ……?コンテナ……?何それ、おいしいの?という方は、以下を参照してください。これの回し者というわけではありません。全くの無関係ですが、私はこの記事に助けられたので、きっとあなたの助けにもなると思います。

https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59

Dockerのことを深く理解したい方は、上記に沿って勉強を進めていくのが良いでしょう。

この先の流れ

ここからの流れを整理します。

  1. Dockerfileの作成
  2. requirements.txtの作成
  3. docker-compose.ymlの作成
  4. イメージのビルド
  5. コンテナの起動
  6. Djangoプロジェクトの作成
  7. mysqlを使うように設定
  8. サーバー起動
  9. コンテナの終了
  10. docker-compose.ymlの更新
  11. 接続確認

となります。dckerfileを理解するための、イメージやコンテナについては、再三言いますが、以下を参照してください。

時間をかけて手順通りに学ぶのがかえって近道だと思いますので、どうしても近道をしなければならない人、もしくはある程度の知識はあるという人、そういう方のみ、以下のリンクを無視してこの記事を読み進めてください。

https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59

1.Dockerfile の作成

さあ、まずはdockerfileを作っていきましょう。

dockerfile
FROM python:3.11.1
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install --upgrade pip && pip install -r requirements.txt
COPY . /code/

2.requirements.txt の作成

requirements.txt
Django==4.1.7
mysqlclient

先ほど書いたDockerfileにある通り、pip installするものになります。

3.docker-compose.yml の作成

docker-compose.yml
version: '3'
services:

  db:
    container_name: django-blog-db
    image: mysql:8.0
    volumes:
      - db-store:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: django_blog_db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    healthcheck:
      test: mysqladmin ping
      interval: 15s
      retries: 5

  web:
    container_name: django-blog-web
    build: .
    command: tail -f /dev/null
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      db:
        condition: service_healthy
    tty: true
    stdin_open: true

volumes:
  db-store:

4.イメージのビルド

ターミナル
docker compose build --no-cache

5.コンテナの起動

ターミナル
docker compose up -d

6.Djangoプロジェクトの作成

以下をターミナルで打ってコンテナ内に入りましょう。

ターミナル
docker exec -it django-blog-web bash

コンテナ内で以下を実行してください。

ターミナル(コンテナ内)
django-admin startproject django_blog

するとこのようにファイルが複数生成されます。

7.mysqlを使うように設定

django_blog/settings.pyを開いてください。

真ん中あたりにDATABASESという項目があるので、そこを編集します。

こうなっているのを、

django_blog/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

こんな感じに。

django_blog/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_blog_db',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': '3306'
    }
}

8.サーバー起動

ターミナル(コンテナ内)に戻り、以下を打ってみてください。

ターミナル(コンテナ内)
cd django_blog
python3 manage.py runserver 0.0.0.0:8000

するとこんな感じに色々出てくると思います。

ターミナル(コンテナ内)
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
April 01, 2024 - 12:39:43
Django version 4.1.7, using settings 'django_blog.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
[01/Apr/2024 12:39:54] "GET / HTTP/1.1" 200 10681

赤文字で怒られても気にしなくてOKです。

http://0.0.0.0:8000/ をブラウザで開いてみましょう。

このような画面が表示されれば成功です!

9.コンテナの終了

では一旦コンテナを終了しましょう。

ターミナル(コンテナの外)で以下を実行してください。

ターミナル
docker compose down
docker rmi $(docker images -q)
docker volume rm django_db-store

これで、作成したコンテナが停止し、コンテナ・イメージ・ボリュームが削除されます。

10.docker-compose.ymlの更新

manage.pyとDocker関連のファイルは同じディレクトリにあったほうが楽なので、docker-compose.ymlDockerfilerequirement.txtを外側のmanage.pyと同じディレクトリ に移動させてしまいましょう。

それが完了したら、この部分を

docker-compose.yml
web:
  container_name: django-blog-web
  build: .
  command: tail -f /dev/null
  ・
  ・
  ・

こう書き換えてください。

docker-compose.yml
web:
  container_name: django-blog-web
  build: .
  command: python3 manage.py runserver 0.0.0.0:8000
  ・
  ・
  ・

これによって、コンテナを立ち上げると同時にpythonのサーバーが立つようになりました。

11.接続確認

再度コンテナを立ち上げてみましょう。

ターミナルで以下を実行してください。

ターミナル
docker compose build --no-cache
docker compose up -d

http://0.0.0.0:8000/ を開くか、ターミナル(コンテナの外)でopen http://localhost:8000を打ってみましょう。

先ほどと同じページが表示されれば問題ありません!

おしまい

これにて環境構築は完了です!お疲れ様でした!

おまけ

Djangoの大きめチュートリアルとして、以下を投稿しています。よければご覧ください。

https://zenn.dev/ramu_k/articles/20240320-django-blog-crud

参考

参考にさせていただいたサイトたちです。感謝申し上げます。

Discussion