VSCodeを使ってDockerコンテナ内で開発を行う方法

# はじめに
最近実務で環境構築をする機会があり、面白いものを触れたので、備忘録として残しておこうと思います。
題材はタイトルの通りですが、恥ずかしながら、実務で触れるまではこんなことができるとは思っていませんでした。。。
なかなか使えると思ったので、早速紹介していきます！

# なぜやるのか
まず、なんでわざわざVSCodeを使ってDockerコンテナ内に入り、開発を行うのかというところからお話しします。
結論、私が採用した一番大きな理由は、開発者全員のVSCode環境を統一できるからです。
VSCodeの設定や拡張機能を揃えておくことで、開発者は実装に専念することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616933/9790f6c4-afda-15d1-cf0a-76dbeed922db.png)

# 実践
早速ですが、まずは動かてみましょう！！
[github](https://github.com/75ks/next-dev#vscode%E7%92%B0%E5%A2%83%E3%82%92%E5%85%B1%E6%9C%89%E3%81%97%E3%81%A6%E9%96%8B%E7%99%BA%E3%82%92%E8%A1%8C%E3%81%86%E6%96%B9%E6%B3%95)にも載せていますが、一応手順の説明からやっていきます！
とりあえず動くものを用意したので、下記手順から設定をお願いします。
#### プロジェクトのクローン
```bash
# ホームディレクトリに移動
cd

# プロジェクトをクローン
git clone https://github.com/75ks/next-dev.git

# プロジェクトディレクトリに移動
cd next-dev

# クローンしたプロジェクトをVSCodeで開く
code .
```
#### VSCodeからコンテナに接続
##### 左サイドバーの拡張機能で「Dev Containers」を検索し、インストール
※以下の画像だとインストール済みのため、「無効にする」と表示されていますが、初めてであれば「インストール」と表示されていると思うので、そちらからインストールをお願いします。「Dev Containers」が含まれている「Remote Development」でも問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616933/153e82e1-17af-66fa-9d46-2b4fae93f925.png)
##### 左下「><」アイコンをクリックして、「コンテナを再度開く」を選択
※ホストのVSCodeを日本語化していない場合は、「コンテナを再度開く」ではなく「Reopen in Container」となっていると思うので、そちらをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616933/eab828e1-9a42-36ed-4124-bfc4d0d6a613.png)
##### 画像のようにVSCodeの表示が変わっていて、[localhost:3000](localhost:3000)に接続できれば接続完了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616933/4f3cbebd-fa1d-f291-6b04-07d1a8cc4e34.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616933/c4c84327-fcdf-edcc-0555-fe62982d1c78.png)


# 解説
#### devcontainer.json
まず今回のメイン、VSCodeの設定を行っている`devcontainer.json`についてです。
`devcontainer.json`は必ず.devcontainerディレクトリを作成し、その中に配置する必要があります。
一般的にはプロジェクトのルートに.devcontainerディレクトリ作成することが多いようなので、今回だとプロジェクトのディレクトリがnext-devになるため、next-dev配下に.devcontainerを作成し、その中に`devcontainer.json`を配置する必要があります。
```:ディレクトリ構成
next-dev(プロジェクトのルート)
├── .devcontainer
    ├── devcontainer.json
```
```json:devcontainer.json
// コンテナ上のVSCodeの設定
{
  // VSCode上で表示される名前
  "name": "Next.js App",
  // docker-composeファイルのパス
  "dockerComposeFile": "../docker-compose.yml",
  // docker-composeのサービス
  "service": "app",
  // VSCodeのルートディレクトリ
  "workspaceFolder": "/app",
  // コンテナからホストに転送するポートリスト
  "forwardPorts": [3000],
  // VSCodeの設定等
  "customizations": {
    "vscode": {
      // 拡張機能リスト(拡張機能IDを指定)
      "extensions": ["MS-CEINTL.vscode-language-pack-ja"]
    }
  }
}
```
##### name
VSCode上で表示される名前を設定します。
先ほどの画像赤枠部分の「Next.js App」が表示されている部分に該当します。
##### dockerComposeFile
`dockerComposeFile`のパスを指定します。
`docker-compose.yml`はプロジェクトのルートに作成しているため、相対パスだと`../docker-compose.yml`となります。
##### service
docker-composeのサービス名を指定します。
`docker-compose.yml`のservices配下の名前と一致させる必要があります。
```yml:docker-compose.yml
version: '3'
services:
  app: ←これ
```
##### workspaceFolder
ホストで開いているワークスペースをコンテナ内のどこに配置するかを指定します。
今回はホストでnext-devディレクトリを開いていると思うので、コンテナのappディレクトリにnext-devを配置するという意味になります。

##### forwardPorts
コンテナからホストに転送するポートリストを設定します。リストなので複数設定も可能です。
今回は3000のみを指定しているため、コンテナで起動しているポート3000をホストの3000に転送します。
こうすることで、サーバーはコンテナで起動していますが、ブラウザからのアクセスなどがホストからも可能となります。

##### customizations.vscode.extensions
VSCodeの拡張機能を設定します。
キーには拡張機能IDというものがあり、これを指定する必要があります。
拡張機能IDは、拡張機能の歯車マークからコピーすることができます。
リストなので、複製設定が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616933/a7a09e34-c52e-083f-4369-38db1d916d50.png)

##### customizations.vscode.settings
VSCodeの本体設定を設定します。
今回の`devcontainer.json`には記載していませんでしたが、下記のように設定することが可能です。
```json:devcontainer.json
// コンテナ上のVSCodeの設定
{
　　　　(省略)
  "customizations": {
    "vscode": {
      // 拡張機能リスト(拡張機能IDを指定)
      "extensions": ["MS-CEINTL.vscode-language-pack-ja"],
      // 本体設定
      "settings": {
        "workbench.colorTheme": "Default Dark+",
        "workbench.iconTheme": "material-icon-theme",
        "bracket-pair-colorizer-2.depreciation-notice": false,
        "workbench.startupEditor": "none",
      }
    }
  }
}
```
キーには、設定キーを指定する必要があります。
ホストと同じ設定にするには、歯車マークから「設定」を選択して設定画面を開き、右上のファイルマークを選択して`settings.json`を開き、中身を`devcontainer.json`のcustomizations.vscode.settings配下にコピーします。
※設定画面はショートカット`Mac: command + ,` `Windows: Ctrl + ,`でも開けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616933/769f1f77-20fb-0080-5883-5fffff0c4029.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616933/5ccea9cd-46d6-9934-8d70-59067edce72d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616933/e8bd1338-70b8-2587-03da-b321c50d3621.png)
新たに設定を追加する場合は、設定画面の各項目にある「settings.jsonで編集」を選択して`settings.json`に追加された設定キーを確認し、それを`devcontainer.json`のcustomizations.vscode.settings配下にコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616933/e01713bc-785d-7a89-a8c2-e4a59151da0e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616933/9a8ec8e0-aa4a-5b8f-537d-f692824e64ff.png)
```json:devcontainer.json
// コンテナ上のVSCodeの設定
{
　　　　(省略)
  "customizations": {
    "vscode": {
      // 拡張機能リスト(拡張機能IDを指定)
      "extensions": ["MS-CEINTL.vscode-language-pack-ja"],
      // 本体設定
      "settings": {
        "workbench.colorTheme": "Default Dark+",
        "workbench.iconTheme": "material-icon-theme",
        "bracket-pair-colorizer-2.depreciation-notice": false,
        "workbench.startupEditor": "none",
        "editor.fontWeight": "normal", ←追加
      }
    }
  }
}
```
# さいごに
他にも`devcontainer.json`から設定できる項目がたくさんあるので、興味がある方は調べてみてください！
また面白いものあったら紹介していきます！