DockerでDjango(SQLite)な開発環境を用意する

 DockerでDjango(SQLite)な開発環境を用意する


今回は、Pythonで実装されたWebフレームワークの1つである、DjangoをDockerコンテナ上で動かす環境を作っていきます。環境は以下のようになっています。本来であればコンテナはなるべく軽く1コンテナ1アプリケーション構成で作るべきだとは思いますが、今回は開発しやすさを優先して構築しています。
DBにSQLiteを利用していることや、Shellにexecして作業しているのもこの為で、コンテナに馴染みのない人でもわかりやすいことや、開発時のDBを共有しやすくするためにこの構成にしています。
もっとコンテナの特徴を生かした構成にしたい場合や、本番環境で利用したい場合は他のサイト(ドキュメント等)をご覧ください。

Dockerバージョン
  • Docker version 20.10.7, build f0df350
入れるもの
  • Python3.9.6
  • Django3.2.5
  • SQLite3
  • その他使うもの(vim, lessなど)

今回作成したファイルはGitHubに掲載しています。
git cloneしていただければ、そのまま動くと思います。

使い方

まず、git cloneでGitHubからファイルを落とします。(コードをコピペしても動きます)
> git clone https://github.com/Alicey0719/pythonDjangoDevelopEnv.git


次に、落ちてきたディレクトリに移動し、start.shを起動します。
この際、Dockerが起動していないと動かないので注意しましょう。
> cd pythonDjangoDevelopEnv/
> sh start.sh 


すると構築が始まり、しばらくすると...


コンテナのシェルに接続されます。


意図された環境が構築されています。


記述されている内容の解説

1つずつ順に見ていきます。

  • docker-compose.yml

ここでは、起動するコンテナの設定を記述することができます。
4行目から見ていきましょう。
4行目では、サービスの名称を"python-django"(任意の名前)と定義しています。
5行目では、build(ComposeFileを実行し、ビルドされるときのpath)するものに対して"."を指定しています。これはカレントディレクトリを示し、そこに置かれているDockerfileが対応します。
6行目では、container_nameを指定しています。そのまんまですねw コンテナの名前(任意)です。
7行目では、stdin_openを指定しています。これは、コンテナの標準入力をオープンしたままにします。
8行目では、ttyをtrueにしています。これはコンテナに擬似TTYを割り当てています。これにより、コンテナが自動的に正常終了することを防ぎ、起動したままの状態を作ることができます。
9,10行目では、Volumesの設定をしています。これは、コンテナ内の/codeとホストPCの./codeを同一のものとして扱うような設定となります。
11,12行目では、Portの割り当てをしています。これにより、コンテナ内の8000ポートとホストPCの8000ポートを同一のものとして扱えます。よって、ホストPCからlocalhost:8000のように指定すると、コンテナ上のサーバにアクセスできるようになります。

※djangoを実行する際にpython3 manage.py runserver 0:8000と指定しないとコンテナ外からアクセスできません。

より正確で詳しい説明はリファレンスを御覧ください。


  • Dockerfile

docker-composeのbuildで呼ばれているものになります。
1行目のFROMでは利用するイメージを指定しています。今回はPython3.9.6を利用します。
2行目では、Pythonの環境変数を指定しています。(非空なら標準出力・標準エラーのストリームのバッファリングを行わない)
3,4行目ではcodeディレクトリを作成し、それをワーキングディレクトリに設定しています。
5行目では、ホストPCにあるrequirements.txtをコンテナ内のcodeディレクトリにコピーしています。
6行目でaptのパッケージ一覧を更新し、aptでインストールするものを記述しています。(sqlite3とかvimとか) コンテナのお作法的には、apt install 後にapt cleanなどでアーカイブファイルを削除しコンテナを軽量化することが多いです(参考)。
7行目で、pipをアップグレードして、8行目でrequirements.txtにかかれているものを、pipでインストールしています。

本来であれば、コンテナはアプリケーションが主役であり、1コンテナ1アプリケーション等、軽い構成で作るべきだと思いますので、上記のようにアレコレ入れないほうが良いとは思います。が、作業効率化の為導入しました...
また、継続して利用するものであれば、なるべく全てのものに関してバージョンの固定を行うべきだと思います。


  • requirements.txt
pipでインストールするものの一覧です。
Djangoの3.2.5やその他使いそうなものを書いていきます。
各々使用するものを入れましょう。

  • start.sh
start.shではDockerコンテナを構築・起動し、シェルへ接続するまでの作業を1つで行うシェルスクリプトです。
まず docker-compose up -d でdocker-compose.ymlファイルを元にコンテナを起動します。
この操作が成功した場合に&&の右側に書かれたコードが実行されます。
右側のコードでは、docker exec -it でpython-djangoという名前のコンテナのシェルに接続しています。
コンテナ起動時に実行するとそのままシェルに入ることができます。


参考文献

コメント