【Django】VSCode+RemoteContainersを使ってDjangoのコンテナ(Docker)開発環境をサクっと構築する

#はじめに
RemoteContainers、とても便利ですよね。おかげでPyCharmからVSCodeに浮気しそうです。
Django+RemoteContainersについて書かれた記事が無かったので、最小構成でDjango開発環境を構築する手順を投稿します。


#RemoteContainersとは
超簡単にコンテナを作成・接続することができるVSCodeの拡張機能です。
Dockerコマンドを一つも手打ちすることなく環境構築を終わらせることができます。
この記事を読む分にはその程度の理解で問題ありません。


#事前準備
###１．Dockerfileを用意する
python:3.8のイメージを使用すればDjango起動に必要なパッケージは特にありませんが、
もし何か必要なパッケージがあればご自由にインストールしてください。

```dockerfile
FROM python:3.8

# 必要なパッケージがある場合インストール
# RUN apt install ~~~
```

###２．docker-compose.ymlを用意する
```docker-compose.yml
version: '3'
services:
  app:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - './:/app/sampleApp'
    working_dir: '/app/sampleApp'
    container_name: sampleApp
    privileged: true
    tty: true
```

ここまでのディレクトリ構成

```
Django-docker-sample　#今回のワークスペースフォルダ
        ├─ docker-compose.yml
        └─ Dockerfile
```

###３．VSCodeで拡張機能追加
ワークスペースフォルダをVSCodeで開き、拡張機能「Remote - Containers」を追加します。
「remote containers」で検索すればおそらく1番上に出てくると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/50407b6c-08ef-7c4b-4354-ba905a5dda37.png)

以上で準備完了です！

#いざコンテナ接続！
RemoteContainersを追加するとVSCodeの画面左下にアイコンが表示されるのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/03666208-3107-b2ef-be3e-3b9400987a02.png)

プルダウンから[Remote-Containers: Reopen in Container]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/1671de25-37f2-90e4-5aea-9ffa7fd10096.png)

プルダウンから[From 'docker-compose.yml']を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/e152795f-4d67-9096-9c6d-e50906797ed9.png)

（初回起動時はコンテナのビルドが走るので少し待ちます…:cat2:）
VSCodeの画面左下にコンテナ接続情報が表示されていればOKです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/68531655-adb9-ccc6-75c4-af2f2b89a229.png)

これでコンテナ内で起動しているVSCodeにローカルマシンから接続している状態になりました。つまり、これ以降ターミナルで実行するコマンドはホストマシンではなくコンテナ内で実行されることになります。

#Django実行
ターミナルから以下コマンドを実行します。

```bash
/workspace# pip install django
/workspace# django-admin startproject sampleApp
/workspace# cd sampleApp
/workspace/sampleApp# python manage.py migrate
/workspace/sampleApp# python manage.py runserver
```

ターミナルに表示されたURLを[Ctrl＋左クリック]で開き、Djangoのサンプル画面が表示されたらOKです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/40e2f9d8-5054-bb20-81e7-753341f29a61.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/770796ad-5514-84cf-3705-1c88f1253add.png)

#追加拡張機能
実際に開発する際にはブレークポイントやウォッチ式も使いたいと思いますが、下記手順を踏むことでそれらが可能となります。
※RemoteContainersはコンテナ上で実行されているVSCodeをローカルから使用するので、基本的には必要な拡張機能を再度追加しなおすことになります。ただしコンテナを新しくする度に毎度追加しなおすのは大変なので、楽にできるサポート機能について後述します。

###１．Python
これが無いと始まらないですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/eeb78225-6e3d-dc3a-9214-8e352d995f57.png)

###２．Django
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/5a06a6b7-18bf-50be-330b-e0d7390b0570.png)

###実践！
コードにブレークポイントが置けるようになるので適当なところに置いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/96777099-c569-b3a0-361b-5057a2113105.png)

Djangoデバッグ用のlaunch.jsonを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/617f4bab-ef63-8e95-9f88-a788e7b338a8.png)

manage.pyのパスを聞かれるので、「${workspaceFolder}/sampleApp/manage.py」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/ccc89475-f786-87cf-5c44-1477c563946d.png)

デバッグ実行！ブレークポイントで止まってくれるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/cf2f48f3-ca56-0bb7-c3c9-7e75517a379a.png)

#拡張機能の管理
ワークスペースフォルダに「.devcontainer」という見慣れないフォルダとその中にjson,ymlファイルがあると思います。これはRemoteContainersが勝手に作成したファイルです。
「.devcontainer/devcontainer.json」の"extensions"にリスト形式で拡張機能IDを記述することで、コンテナ作成時勝手にインストールしてくれます。便利！
※拡張機能IDは拡張機能一覧から[右クリック]→[拡張機能IDをコピーする]で取得可能
PythonとDjangoの拡張機能を記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663118/ff3e53f8-77ab-967d-bca6-0b9b91eaaa62.png)

これでコンテナを作り直した場合でも拡張機能を手動で入れなおす必要が無くなります。お気に入りの拡張機能を追記しておきましょう。

以上です。お疲れ様でした:cat2: