【入門】Docker+Python開発環境のおすすめな作り方

Docker上でPythonの開発環境を作りたい

バックエンドの開発環境をローカルに作る場合、Webサーバやデータベース、Pythonなどのプログラミング言語、さらにはバージョン違いが必要になると環境の管理が大変になります

ローカル環境をあまり汚したくない場合に活躍するのがDockerです

Docker上でPythonの開発環境を作り、そこにDjangoPostgreSQLを導入する手順を解説します

Pythonだけではなく、他の言語にも応用ができるおすすめの方法です

前提条件
  • Visual Studio Code:1.76.0
  • Docker Desktop
目次

Dev Containers

Visual Studio Code(以降はVSCode)の拡張機能にDev Containersがあります

Dev Containersを使用することでDockerの制御VSCodeのフル機能をコンテナ上で使うことができます

引用:Developing inside a Container

仕組みを簡単に解説するとローカル上のファイルはコンテナにマウントされているため共有状態になっています

コンテナ生成時にVSCodeで使用している拡張機能をインストールすることもできるため、ローカルで開発する場合と同様に作業することができるのです

まずは拡張機能からDev Containersをインストールします

VSCodeの拡張機能(Dev Containers)

最新のv0.282.0を使用していたのですが、ある時から「Add Dev Container Configuration Files」で自動生成ができなくなってしまったため、正常に動作するv0.255.4までバージョンを落としています。正常に動作する場合は最新バージョンで問題ありません

インストールが完了したら空のプロジェクトを作成します

左下の緑色のアイコンを押下してリモートウインドウを開き、「Add Dev Container Configuration Files」を選択します

リモートホスト
リモートウインドウ

Configuration Filesから「Python 3」を選択します

Add Dev Container Configuration Files

次はバージョン選択なのですが、お好きなバージョンを選択されて問題ありません。今回は以下を選択しました

  • Python Version:3.10-bullseye
  • Node.js Version:None

完了すると.devcontainerフォルダが作成され、その配下にファイルが作成されます(バージョンによってはdevcontainer.jsonだけの可能性もあります)

.devcontainerの作成

Docker Desktopが起動している状態で、先ほどと同様に左下の緑色のアイコンからリモートウインドウを開き、「Reopen in Container」を選択すると自動的にDockerコンテナが作成されます

DockerのPythonコンテナ

Pythonが実行できることを確認するために、Hello Worldをコンソールに出力してみます

print('Hello World')

ファイルを作成して実行すると次のようにコンソールに出力されればDev Containersの動作確認は完了です

コンソールにHello Worldを出力

ちなみにリモートウインドウから「Reopen Folder Locally」を選択すればリモート接続が切断され、ローカル環境に戻ることができますよ

DjangoとPostgreSQLの導入

Pythonのフレームワークで一番人気のあるDjangoを導入してみます

データベースにはPostgreSQLを使用するものとします

PostgreSQLのインストール

PostgreSQLをインストールするために別のテンプレートファイルを使用します

ローカル環境に戻した状態からリモートウインドウで「Add Dev Container Configuration Files」を再度選択します

上書き確認がありますが、問題ありませんのでOKで先に進みます

テンプレートに「Python 3 & PostgreSQL」とバージョンを選択して、.devcontainerフォルダを更新します

.devcontainerの更新

完了すると新しくdocker-compose.ymlが作成されています

F1キー(ショートカットキー)でコマンドをパレットを表示し、「Rebuild and Reopen in Container」を選択するとDockerコンテナが再作成されます

VSCodeのコマンドパレット

Djangoのインストール

次のコマンドでDjangoをインストールします

pip install django

Successfully installedが表示されれば完了です

django-adminを使用してプロジェクトを作成します

django-admin startproject djangoSample

プロジェクトが作成されたら次にsettings.pyで設定を変更します

Djangoプロジェクトの作成

デフォルトでは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で次のように通知がありますので「ブラウザで開く」を押下します

VSCodeの通知

インストールに成功していれば次のような画面が表示されます

DJangoのホーム画面

URLに/adminを付与して管理画面を表示してみます(例:http://127.0.0.1:8000/admin)

ログイン画面が表示されますので作成したSuperuserのユーザー名とパスワードを入力します

Djangoのログイン画面

ログインに成功すれば管理画面が表示されます

Djangoの管理画面

コンテナをリビルドしたら?

コンテナをリビルドした場合、pipでインストールしたPythonのパッケージはどうなるでしょうか?

答えは初期状態に戻るです

リビルドする度にマニュアルでインストールするのは大変ですのでdevcontainer.jsonpostCreateCommandでコンテナ作成時に一括でインストールするようにします

devcontainer.jsonに以下を追加します

"postCreateCommand": "pip install --user -r requirements.txt",

requirements.txtを読み込むようになっているのでファイルを作成しインストールするパッケージを記載します

django==4.1.7
psycopg2==2.9.5

これで設定は完了です

次回のリビルド時に一括でインストールされるようになります

最後に

Dev Containersのバージョン問題だけ半日かけでも解決策が見つからなかったのが心残りではありますが…

めんどくさいDockerがこんなに簡単に構築できるようになるとは!

Dockerに苦手意識があったけどこれからは良い関係を築けそうです

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次