VScodeのDevContainerってなんぞや


今回は、VisualStudioCodeのDevContainerについて紹介していきます。

## DevContainerとは

一言で言うと、開発用にサクッと建てられるコンテナです。
vscodeの標準機能で備わっていて、Dockerで建てることができます。

## DevContainerのここがすごい！

### DockerComposeが使える

プロダクション用のDockerComposeファイルをそのまま使えるので、動作確認も楽々ですね。
これはどういうことか？

私はDBを使うアプリケーションでよくこれを使います。
開発用にわざわざDBを立てるの正直クソだるいです。
そんな時、VScodeからワンクリックでサクッとアプリケーションもDBも立てられたら、こんなに楽なことはありません。

### リモートホストが使える

たとえば、クラウドのサーバーにコンテナを立てて、ノートパソコンでは処理できないような重たいアプリの検証環境をサクッと立てる、ということもできます。
リモートホストを使う際も、**Dockerをインストールするだけ**なので、とても簡単です。

### コンテナ内でGitが使える

DevContainer定義ファイルが含まれたリポジトリをGit 認証情報マネージャーを用いてクローンすると、コンテナ内でもgitが使えます。

## 簡単な使い方

今回は簡単な使い方として、DBとPHPのアプリが入ったDevContainerを作成してみます。

### DockerComposeを作成する

DockerComposeファイルを作成します。
ここに関する説明は今回は割愛しますが、phpにはPHPのDockerfileが割り当たっているものとします。
何も気にせずにDockerfileを作成して構いません。

```yaml:docker-compose.yaml
version: '3'
services:
  php:
    container_name: php_container
    build:
      context: './'
    ports:
      - "8080:80"
    environment:
      TZ: Asia/Tokyo
      DB_HOST: db
      DB_USER: root
      DB_PASSWORD: rootpass
  db:
    image: mariadb
    ports:
      - '3306:3306'
    environment:
      MARIADB_DATABASE: ysmfilm
      MARIADB_USER: dbuser
      MARIADB_PASSWORD: dbpass
      MARIADB_ROOT_PASSWORD: rootpass
      TZ: Asia/Tokyo
    volumes:
      - ./initsql:/docker-entrypoint-initdb.d
      - ./conf.d:/etc/mysql/conf.d
#      - db-volume:/var/lib/mysql
volumes:
  db-volume:
    name: mariadb-data
    driver: local
```

これで、DBとPHPが立つはずですね。

### .devcontainerディレクトリ内の整備

さて、ここからが本題です。
`.devcontainer`というディレクトリを作成します。
この中に設定ファイルやらを作成します。

先ほど作ったディレクトリ内に、`devcontainer.json`というファイルを作成します。
この中に、どのコンテナを起動するかなどを記述します。

```json:devcontainer.json
{
  "name": "PHP and MariaDB Devcontainer",
  "dockerComposeFile": "../docker-compose.yaml",
  "service": "php",
  "workspaceFolder": "/var/www/html",
  "postCreateCommand": "composer install",
  "remoteEnv": {
    "TZ": "Asia/Tokyo"
  },
  "portsAttributes": {
    "80": {
      "label": "Web App"
    }
  },
  "customizations": {
    "vscode": {
      "extensions": [
        "github.vscode-github-actions",
        "GitHub.copilot-chat",
        "GitHub.copilot",
        "GitHub.vscode-pull-request-github",
        "eamodio.gitlens",
        "mhutchie.git-graph"
      ],
    }
  }
}
```

各項目の説明です。

- `name`: 名前ですが、適当で構いません。
- `dockerComposeFile`: どのcomposeファイルを使用するかを記述します。
- `service`: どのサービスをvscodeで表示するかを書きます。このサービスのコンテナ内がvscodeのターミナルやエクスプローラで表示されます。
- `workspaceFolder`: どのディレクトリをターミナルやエクスプローラのワーキングディレクトリにするかを記述します。
- `postCreateCommand`: コンテナ作成時に実行するべきコマンドです。
- `remoteEnv`: コンテナの環境変数を定義します。
- `portsAttributes`: ポート転送ウィンドウに表示するポートを記述します。
- `customizations`: vscodeのカスタマイズに関する記述です。
- `extensions`: コンテナにインストールするタイプの拡張機能です。git系の拡張機能によく見られます。

これで、左下のボタンから、コンテナを起動してみましょう。

![vscode-remote.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342262/4cdfa37f-62ee-abfc-ef51-8438abffdeed.png)
![vscode-devcontainer-select.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342262/8d84a506-fd2a-592f-51e5-e98a36cf536e.png)

うまくいけば、コンテナの中をvscodeで開くことができます。


## 最後に

DevContainerの機能はこれだけではありません。
他にもいじってみたい方は、このサイトから学んでみると面白いでしょう。

https://code.visualstudio.com/docs/devcontainers/containers