Docker上でPythonの開発環境を作りたい
バックエンドの開発環境をローカルに作る場合、Webサーバやデータベース、Pythonなどのプログラミング言語、さらにはバージョン違いが必要になると環境の管理が大変になります
ローカル環境をあまり汚したくない場合に活躍するのがDockerです
Docker上でPythonの開発環境を作り、そこにDjangoとPostgreSQLを導入する手順を解説します
Pythonだけではなく、他の言語にも応用ができるおすすめの方法です
- Visual Studio Code:1.76.0
- Docker Desktop
Dev Containers
Visual Studio Code(以降はVSCode)の拡張機能にDev Containersがあります
Dev Containersを使用することでDockerの制御とVSCodeのフル機能をコンテナ上で使うことができます
仕組みを簡単に解説するとローカル上のファイルはコンテナにマウントされているため共有状態になっています
コンテナ生成時にVSCodeで使用している拡張機能をインストールすることもできるため、ローカルで開発する場合と同様に作業することができるのです
まずは拡張機能からDev Containersをインストールします
最新のv0.282.0を使用していたのですが、ある時から「Add Dev Container Configuration Files」で自動生成ができなくなってしまったため、正常に動作するv0.255.4までバージョンを落としています。正常に動作する場合は最新バージョンで問題ありません
インストールが完了したら空のプロジェクトを作成します
左下の緑色のアイコンを押下してリモートウインドウを開き、「Add Dev Container Configuration Files」を選択します
Configuration Filesから「Python 3」を選択します
次はバージョン選択なのですが、お好きなバージョンを選択されて問題ありません。今回は以下を選択しました
- Python Version:3.10-bullseye
- Node.js Version:None
完了すると.devcontainerフォルダが作成され、その配下にファイルが作成されます(バージョンによってはdevcontainer.jsonだけの可能性もあります)
Docker Desktopが起動している状態で、先ほどと同様に左下の緑色のアイコンからリモートウインドウを開き、「Reopen in Container」を選択すると自動的にDockerコンテナが作成されます
Pythonが実行できることを確認するために、Hello Worldをコンソールに出力してみます
print('Hello World')
ファイルを作成して実行すると次のようにコンソールに出力されればDev Containersの動作確認は完了です
ちなみにリモートウインドウから「Reopen Folder Locally」を選択すればリモート接続が切断され、ローカル環境に戻ることができますよ
DjangoとPostgreSQLの導入
Pythonのフレームワークで一番人気のあるDjangoを導入してみます
データベースにはPostgreSQLを使用するものとします
PostgreSQLのインストール
PostgreSQLをインストールするために別のテンプレートファイルを使用します
ローカル環境に戻した状態からリモートウインドウで「Add Dev Container Configuration Files」を再度選択します
上書き確認がありますが、問題ありませんのでOKで先に進みます
テンプレートに「Python 3 & PostgreSQL」とバージョンを選択して、.devcontainerフォルダを更新します
完了すると新しくdocker-compose.ymlが作成されています
F1キー(ショートカットキー)でコマンドをパレットを表示し、「Rebuild and Reopen in Container」を選択するとDockerコンテナが再作成されます
Djangoのインストール
次のコマンドでDjangoをインストールします
pip install django
Successfully installedが表示されれば完了です
django-adminを使用してプロジェクトを作成します
django-admin startproject djangoSample
プロジェクトが作成されたら次にsettings.pyで設定を変更します
デフォルトではSQLiteを使用するようになっているため、PostgreSQLに変更します。併せてLANGUAGE_CODEとTIME_ZONEも変更します
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
LANGUAGE_CODE = "ja"
TIME_ZONE = "Asia/Tokyo"
PostgreSQLの接続情報はdocker-compose.ymlに定義されています。変更したい場合はこのファイルを変更後にRebuildしてください
DjangoからPostgreSQLに接続するためのライブラリをインストールします
pip install psycopg2
作成したプロジェクト配下に移動して次のコマンドでテーブルを作成します
python manage.py migrate
管理ユーザを作成するために次のコマンドを実行するとユーザ名、メールアドレス(任意)、パスワードが聞かれますので入力します
python manage.py createsuperuser
Superuser created successfullyと表示されれば完了です
次のコマンドでサーバを起動してみましょう
python manage.py runserver
サーバが正常に起動するとVSCodeで次のように通知がありますので「ブラウザで開く」を押下します
インストールに成功していれば次のような画面が表示されます
URLに/adminを付与して管理画面を表示してみます(例:http://127.0.0.1:8000/admin)
ログイン画面が表示されますので作成したSuperuserのユーザー名とパスワードを入力します
ログインに成功すれば管理画面が表示されます
コンテナをリビルドしたら?
コンテナをリビルドした場合、pipでインストールしたPythonのパッケージはどうなるでしょうか?
答えは初期状態に戻るです
リビルドする度にマニュアルでインストールするのは大変ですのでdevcontainer.jsonのpostCreateCommandでコンテナ作成時に一括でインストールするようにします
devcontainer.jsonに以下を追加します
"postCreateCommand": "pip install --user -r requirements.txt",
requirements.txtを読み込むようになっているのでファイルを作成しインストールするパッケージを記載します
django==4.1.7
psycopg2==2.9.5
これで設定は完了です
次回のリビルド時に一括でインストールされるようになります
最後に
Dev Containersのバージョン問題だけ半日かけでも解決策が見つからなかったのが心残りではありますが…
めんどくさいDockerがこんなに簡単に構築できるようになるとは!
Dockerに苦手意識があったけどこれからは良い関係を築けそうです