自分だけのクイズを作成しよう - Quipha
スポンサーリンク

【Django】DockerコンテナにMySQL/phpMyAdminを追加

Django

当サイトではアフィリエイト広告を利用しています。

スポンサーリンク

はじめに

前回、Django環境をDockerを使用し構築しました。

上記の記事で解説した環境に、MySQLを追加する手順を解説します。
また、MySQLを管理するためのツールである、phpMyAdminもインストールします。

本記事ではDjangoの開発環境をDockerで構築し、VS Codeからリモートで開発を行います。

今回使用する環境とバージョン

今回試した環境
  • Windows 11 / 10
  • macOS Monterey (M1)
  • PostgreSQL 14.2
  • pgAdmin 6.5

2022/04/20 WindowsとMacを使い、最新バージョンで確認しました。

他にも私のブログで、Djangoについて解説している記事がありますのでご覧ください。

ちなみにPostgreSQL/pgAdminを追加する方法は、以下の記事をご覧ください。

VS Codeインストール

VS Codeのインストール方法は、以下の記事にまとめましたのでご覧ください。

VS Codeのオススメ設定や拡張機能などは、以下の記事にまとめました。

以降の解説キャプチャはWindowsをベースにしていますが、Macでの操作も同様です。

スポンサーリンク

Dockerコンテナの設定

Dockerfile

前回の続きになりますので、構築が済んでいる状態で解説します。

まずは、Dockerfileの定義を修正します。
PythonからMySQLを操作するために、「mysqlclient」というライブラリをインストールします。

FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN pip install django
RUN pip install mysqlclient

docker-compose.yml

「.devcontainer」フォルダの中に、docker-compose.ymlファイルを作成します。
MySQLなどが稼働するコンテナを複数追加しますので、Docker Composeを利用します。

まずは、それぞれのコンテナごとに解説しています。
最後には全容を載せています。

Pythonコンテナ

「web」というサービス名で、Pythonコンテナを作成します。
Dockerfileをベースにビルドを行います。

  web:
    build: .
    tty: true
    volumes:
      - ../:/workspace
    depends_on:
      - db

ttyを指定することにより、コンテナが終了しないようにしています。
また、コンテナ内の「/workspace」ディレクトリに、ホスト側のDjangoプロジェクトを配置しました。

MySQLコンテナ

mysqlイメージを使用しました。
バージョンを指定し、MySQL 5.7系をインストールします。

DB名と、rootのパスワードを任意で指定します。
また、コマンドで文字コードにutf8mb4を指定します。(デフォルトでlatin1のため)

  db:
    image: mysql:5.7
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: django_sample
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin

volumes:
    mysql_data:

今回は開発目的として、データベースへのアクセスをrootユーザで行います。
また、データは永続化しています。

phpMyAdminコンテナ

phpmyadminのイメージを指定しました。
バージョンは指定していませんが、今回はphpMyAdmin 5.1.1がインストールされます。

開発環境のため、phpMyAdminへ自動でログインできるようにします。(ログイン画面不要)
自動ログインを行うためのホスト、ログイン情報を指定します。

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - 8080:80
    environment:
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=password

rootユーザを使用します。
また、開発環境以外でphpMyAdminコンテナを使用する場合は、この自動ログインの設定は適切ではありませんのでご注意ください。

全容

改めて、docker-compose.ymlの中身は以下のようになります。

version: '3'

services:
  web:
    build: .
    tty: true
    volumes:
      - ../:/workspace
    depends_on:
      - db

  db:
    image: mysql:5.7
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: django_sample
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - 8080:80
    environment:
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=password

volumes:
    mysql_data:

devcontainer.json

devcontainer.jsonファイルを以下のように修正します。

  • dockerComposeFileにdocker-compose.ymlを指定します。
  • workspaceFolderは、コンテナ側のディレクトリを指定します。(プロジェクトディレクトリ)
  • serviceは、使用するコンテナを指定します。(Pythonコンテナ)
{
	"name": "Django Sample",
	// Dockerfileでイメージ・コンテナを作成
	"dockerComposeFile": "docker-compose.yml",
	// VS Codeのワークスペースフォルダ
	"workspaceFolder": "/workspace",
	// 使用するサービス
	"service": "web",
	// リモート先のVS Codeにインストールする拡張機能
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-python.python"
			]
		}
	},
	"shutdownAction": "stopCompose"
}

コンテナのビルド

VS Codeを起動し、F1キーを押しコマンドパレットを開きます。
「Open Folder in Container」と入力し選択します。

参考までに以前とメニューの表示方法が変わりました。

今回作成したプロジェクトフォルダを開きます。
私の場合は以下です。

Windows例:
\\wsl.localhost\Ubuntu\home\xxx\django-sample-app\
Mac例:
/users/xxx/Documents/django-sample-app

Windowsの場合、保存場所はWSLを指定しましょう。
Cドライブなどに保存した場合、ファイルシステムの関係で読み込みが遅くなります。

開く際にコンテナがビルドされます。
もし既に開いている状態であれば、コマンドパレットから「Dev Containers: Rebuild Container」を選択し、ビルドし直すこともできます。

Docker上から、三つのコンテナが稼働しているのが確認できます。

Djangoのテーブル作成

Djangoのデータベースの設定を変更します。
デフォルトでsqlite3が指定されていますが、MySQLに変更します。

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

DB名やユーザ、パスワードなどは、docker-compose.ymlの「db」に記載の通りです。

VS Codeのターミナルを開きます。

以下のコマンドでDjangoのテーブルを作成しましょう。

$ python manage.py migrate

以下のような出力になればOKです。

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

phpMyAdminから確認

phpMyAdminコンテナも作成しましたので、ブラウザから以下のURLにアクセスします。

http://localhost:8080/

phpMyAdminの画面が表示されました。
事前にログイン情報などを指定していたため、ログイン画面は表示されずそのままホーム画面が表示されます。

Djangoで作成したテーブルを確認します。
データが正しく挿入されています。

その他

外部サーバーへ公開

作成したアプリは公開して使ってもらいましょう!
Djangoアプリケーションを外部公開する方法をまとめました。

脆弱性対策

脆弱性を抱えたアプリケーションの場合、攻撃を受ける可能性があり大変危険です。
作成したアプリケーションは、脆弱性対策も意識しましょう。

GitHubと連携

GitHubと連携する方法を解説しました。
プロジェクトの管理はGitHubを活用しましょう。

GitHub Copilot

GitHub Copilotを導入し、AIにコーディングをサポートしてもらうこともできます。

さいごに

今回はDjango環境をDockerを使用し、さらにMySQLを追加する手順を解説しました。
Dockerを使い、コンテナを追加するだけで簡単に拡張できました。

コンテナを作り直すことも容易ですので、開発に便利です。

他にも、Django REST Frameworkを導入すると、APIが簡単に実装できます。

是非活用しましょう。

他にも私のブログで、Djangoについて解説している記事がありますのでご覧ください。

\オススメ/

コメント

  1. いぶき より:

    こんにちは。プログラミング初心者です。いつも千草さんの記事にお世話になりながら何とか個人開発を進めています。
    今回もDjangoを学習するに当たりまして、こちらの記事を参考に進めております。
    (Laravelアプリの開発でもお世話になりました。ありがとうございます!)

    途中少し躓いてしまった部分がありましたので、共有いたします。

    記事の内容に沿って.devcontainerを編集後、Open Folder in Container…を実行したところ、エラーが出てしまいました。
    ログにno matching manifest for linux/arm64/v8 in the manifest list entriesという記述がありましたので、このワードで調べたところ、docker-compose.ymlへの記載に不備があったことが原因だったようです。

    具体的には、

      db:
        image: mysql:5.7
        volumes:
          - mysql_data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: django_sample
        command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
    


    の部分を、

      db:
        # ↓の1行を追加
        platform: linux/x86_64
        image: mysql:5.7
        volumes:
          - mysql_data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: django_sample
        command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
    


    と変更することで解消されました。

    詳しいことはわからないのですが、私が参考にしたQiita記事によると、M1チップを搭載したMacで起こる問題だそうです。
    (ちなみに私が使用しているのはM2チップ搭載のMacです)

    参考にしたQiita記事:
    https://qiita.com/yusuke1209kitamura/items/80af260be8bde9d5a1c9

    何かの参考になればと思います。これからもどうぞよろしくお願いいたします。

    【実行環境】
    OS:macOS Monterey(12.5.1)
    チップ:Apple M2

    Docker:20.10.23
    Docker Desktop:4.17.0

    Visual Studio Code:1.76.2 (Universal)
    Dev Containers:0.282.0

  2. 鉄雄 より:

    devcontainer.json
    devcontainer.jsonファイルを以下のように修正します。

    "extensions": ["ms-python.python"],

    上記の部分に波線が引かれ
    以下のメッセージが表示されます。

    Property extensions is not allowed.

    • 千草 より:

      devcontainer.jsonの書き方が変わっているようで、以下のように記事を修正しました。

      {
      	..
      	// "extensions": [
      	// 	"ms-python.python"
      	// ],
      	"customizations": {
      		"vscode": {
      			"extensions": [
      				"ms-python.python"
      			]
      		}
      	}
      }