広告

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

Django

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

広告

はじめに

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

【Python+Django4】VS Code+Dockerで簡単構築【Dev Containers】【Win/Mac】
Djangoの開発環境を、VS Codeと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を追加する方法は、以下の記事をご覧ください。

【Django】DockerコンテナにPostgreSQL/pgAdminを追加
Django環境をDockerを使用し、さらにPostgreSQLを追加する手順を解説しました。

VS Codeインストール

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

【VS Code】インストール手順を解説 【Windows/M1 Mac対応】
今回はVS Codeのインストール手順を解説します。WindowsとMacのそれぞれ分けてまとめました。

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

【VS Code】オススメの設定・拡張機能・便利機能・ショートカット【Win/Mac対応】
私的に最初に行う設定や、拡張機能、よく使うショートカットや便利な機能をまとめてみました。

以降の解説キャプチャは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」と入力し選択します。

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

【VS Code】Dev Containersで「Open Folder in Container」などのメニューが表示されない
Dev Containers拡張機能のメニューの表示に仕様変更があったためまとめました。

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

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が簡単に実装できます。

【Django4】Django REST FrameworkでAPI作成
Django REST Frameworkを利用して、RESTfulなAPIを作成してみます。

是非活用しましょう。

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

DjangoDockerMacOSPythonVS CodeWindowsツールプログラミング
広告

個人開発

千草 @chigusaweb

現役のITエンジニア。 気ままにコードを書いたり技術情報を発信しています。 Webアプリ/Windows・Macアプリ/モバイルアプリなど。 (Java, PHP, Javascript, Swift, Python, C#, 他) 個人開発:Clibor, Quipha, TXT-Crypter, 符計算特訓, チグサツール Kindle本: Laravel9 実践入門, 他

クリップボード履歴

Clibor

Windows

Cliborはシンプルで高機能なクリップボード履歴ソフトです。
また普段よく使うワードを定型文として登録し、いつでもクリップボードに保存することができます。高度なテキスト整形・FIFOモード・ホットキーに対応。

クリップボード履歴

Windows版Cliborの利便性を、そのままMacでも。
定型文登録、高度なテキスト整形、FIFOモードなど、便利なクリップボード履歴機能を利用できます。macOS最新のTahoeにも対応。

テキスト暗号化

テキストを暗号化してURLで共有・保存できる無料サービスです。
パスフレーズを知る人だけが復号できます。登録不要、データはサーバーに保存されません。
Notionでも利用できます。

学習

Quipha

Web / iOS

自分だけの問題集や問題を作成し、クイズを行い、学習に活用することができるアプリです。
例えば、学校の授業、語学学習、IT資格やその他の資格など多彩な分野での学習を支援します。
いつでも、どこでも、あなたの学習をサポート。

ツール

日常の「ちょっとした効率化」をサポートするWeb便利ツール集。
テキスト・データ処理から最新のAI連携まで、日々のちょっとした手間でググりがちなユーティリティを1つの場所に集約。

麻雀

麻雀の符計算をひたすら特訓しマスターしましょう。
初心者の方はもちろん、もっと速く計算したい方にも役立ちます。
5万対局以上の実践から問題を収録。

コメント

  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"
      			]
      		}
      	}
      }
      

タイトルとURLをコピーしました