簡単にDockerコンテナ上でVSCodeを起動(Remote - Containers)

# はじめに

ローカル環境(自分のPC)を汚さずに開発したい...

そんな時、Visual Studio Code の拡張機能「 [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) 」がおすすめです。

https://code.visualstudio.com/docs/remote/containers-tutorial

Dockerコンテナ環境内のフォルダーからVisual Studio Codeを起動し、プログラムの実行、デバッグ、コード補完、ターミナルからのコマンド実行など、通常と同じ操作ができます。

ローカル環境の代わりにDockerコンテナ環境を利用するため、同一プロジェクトを複数人で作業する際に、完全に同じ開発環境を簡単に構築できます。

今回は初めて「 [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) 」を利用する方向けの記事となります。
簡単ですので、まだ体験したことが無い方は、ぜひ一度使ってみてはいかがでしょうか。

# 前提条件

- [Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/) がインストール済み
- [Docker Desktop](https://docs.docker.jp/docker-for-windows/install.html) がインストール済み
- Docker Desktop を起動をしておく

# 「Remote - Containers」をインストール

Visual Studio Code の拡張機能の画面を開き、 [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) をインストールします。

![スクリーンショット 2022-03-22 214756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/2124ecc8-0b08-a7fd-adb1-e0a89aa1336b.png)


# Dockerコンテナを作成

Visual Studio Code の画面左下の緑色のボタン(リモートウインドボタン)をクリックし、「Remote - Containers」用のコマンドを表示します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/d7b1b5f1-a9ff-301a-7ddf-89ab56b8fbd8.png)

「Open Folder in Container...」を選択し、保存先のフォルダーを選択します。
![スクリーンショット 2022-03-26 221434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/6e5e8f8f-feb6-93d5-a8be-4ea966966673.png)


利用するDockerコンテナの種類を選択します。OS(Alpine、Debian, Ubuntuなど)、開発言語(Node.js, Rust, Go, C#, Javaなど)、データベース(PostgreSQL, MongoDB)など様々な種類が登録されています。
![スクリーンショット 2022-03-26 221702.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/99a70114-91cd-3e8a-d73b-fc5f14dd59c1.png)

今回は例として Ubuntu を選択します。
![スクリーンショット 2022-03-26 222322.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/1f440fc5-9899-00c0-49d4-3e39d179ca56.png)

利用するUbuntuのバージョンを選択します。今回は例として hirsute を選択します。
![スクリーンショット 2022-03-26 222511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/15c94962-d26b-7eca-1593-755a0390db2d.png)

Dockerコンテナにインストールするツールを選択します。今回は例として下記を選択し、OKボタンをクリックします。
- Node.js (via nvm) and yarn
- AWS CLI
- Terraform, tfint, and TFGrunt
![スクリーンショット 2022-03-26 223300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/621d7ad7-207b-78cf-28a8-ae2fd3d4b336.png)
![スクリーンショット 2022-03-26 223318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/934981ff-649f-a779-acf9-33753ebfc02c.png)

インストールするツールのバージョンを選択します。今回は例として下記のバージョンを選択します。
- Node.js: lts
- Terraform: latest
![スクリーンショット 2022-03-26 223845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/43828417-bbea-aacb-fb63-2c4e9d0145bb.png)
![スクリーンショット 2022-03-26 223902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/2cda6402-746e-6a16-747d-73113d1738cd.png)

利用するDockerイメージがダウンロードされ、Dockerコンテナが起動されます。(少し時間がかかります。)
Dockerコンテナ環境内のフォルダーで Visual Studio Code が開かれます。
![スクリーンショット 2022-03-26 225330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/bd8e8fd7-6a64-caec-e9f7-1b9b204b6c17.png)

Dockerコンテナ環境内のVisual Studio Code に、便利な拡張機能(ESLint, AWS Toolkit, HashiCorp Terraformなど)が自動的にインストールされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/9712bae0-0fce-aac6-4bfb-6dcd049a6af6.png)


# プログラムを実行

例として、ルートフォルダーに下記の様な main.js を作成します。エディタ上でコード補完が動作することを確認します。
```js:/main.js
let message = "ハローワールド";
console.log(message);
```

ターミナルから下記のコマンドを実行します。
```bash:ターミナルで実行
$ node main.js
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/86437f57-58fb-cd27-e808-1581e7cf01a1.png)



# プログラムをデバッグ

例として、 main.js を開いた状態で「実行 > デバックの開始」クリックをします。環境の種類を聞かれた場合は「Node.js」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/ae4fe718-8ab0-7958-7cc1-d71de23208b8.png)

デバッグコンソールに結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/5cfaa3cb-7436-b829-f658-df3146082998.png)

下記の様に、コード上にブレークポイントを設定し、デバッグができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/af4d5d4c-ffb5-4f0d-3aca-8f6435a12e3a.png)


# 各種ルーツを実行

今回は例として、AWS操作ツール( AWS CLI, Terraform )を実行してみます。
AWSを利用していない場合はスキップして頂いて構いません。

## 秘密の環境変数を設定

AWSアクセスキーや各種パスワードなどの秘密の環境変数は、
下記のファイル( /.devcontainer/devcontainer.env )を作成して追記します。
AWSアクセスキーをお持ちでない方は、AWSのIAM画面からアクセスキーを作成します。

```ini:/.devcontainer/devcontainer.env
AWS_ACCESS_KEY_ID=(AWSアクセスキーIDを設定)
AWS_SECRET_ACCESS_KEY=(AWSシークレットアクセスキーを設定)
AWS_REGION=ap-northeast-1
```

既存の /.devcontainer/devcontainer.json の中に、下記を追記して環境変数ファイルを読み込むようにします。

```/.devcontainer/devcontainer.json
	"runArgs": ["--init", "--env-file",".devcontainer/devcontainer.env"]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/778b62d5-cbfb-3c12-e3a3-234e774bb01e.png)


追記した環境変数をDockerコンテナに読み込ませるため、「Remote - Containers」用のコマンド(画面左下の緑色ボタン)の「Rebuild Container」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/c70bfa34-0179-d302-4a72-e606211d2086.png)


## git の除外ファイルを設定

ルートフォルダーに下記の .gitignore を作成し、秘密の環境変数ファイル( devcontainer.env )が git にコミットされないようにします。大変重要です。
```ini:/.gitignore
.env

.terraform
*.tfstate
*.tfstate.*
```

## AWS CLI を実行

今回は例として、EC2のリージョン一覧を表示します。
ターミナルから下記のコマンドを実行し AWS の EC2 のリージョン一覧が表示されれば実行成功です。

```bash:ターミナルで実行
$ aws ec2 describe-regions
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/c1e71802-852c-0397-7610-0e1a134f8453.png)


## Terraform を実行

今回は例として、EC2の作成と削除を行います。
ルートフォルダーに下記の様な main.tf を作成します。

```terraform:/main.tf
# プロバイダ
provider "aws" {
    region = "ap-northeast-1"
}

# EC2
resource "aws_instance" "test-server" {
  ami           = "ami-04204a8960917fd92" # Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
  instance_type = "t2.micro"
  tags = {
    Name = "test-server"
  }
}
```

ターミナルから下記のコマンドを実行します。AWS上にEC2を作成、削除ができれば実行成功です。
```bash:ターミナルで実行
$ terraform init  (Terraformの初期化を行う。初回に1回だけ実行)
$ terraform plan  (AWSの変更内容を確認します。まだAWSには反映されません)
$ terraform apply  (AWS上にEC2を作成します。
    「Enter a value:」と表示されるので「yes」を入力します)
$ terraform destroy  (作成したEC2を削除します。
    「Enter a value:」と表示されるので「yes」を入力します。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/85cfbf93-dbd8-54cc-61c0-a8d495beb0fa.png)

詳細な利用方法は Terraform の公式ドキュメントをご覧ください。

https://www.terraform.io/language

https://www.terraform.io/cli/commands


# 終了する場合

Visual Studio Code を閉じると、自動的にDockerコンテナも停止されます。


# 再開する場合

再び利用する場合は、保存先のフォルダーをVisual Studio Codeから開くと、画面右下に下記のメッセージが表示され、「Reopen in Container」ボタンをクリックします。
または、「Remote - Containers」用のコマンド(画面左下の緑色ボタン)から「Reopen in Container」や「Open Folder in Container...」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/5e8b99e8-e0c7-9c44-df84-a7a33f6407ce.png)


# Dockerコンテナを削除

もう利用しない場合は、Dockerコンテナの削除を行います。

いったん、Dockerコンテナ環境の Visual Studio Code からローカル環境の Visual Studio Code に切り替えます。
「Remote - Containers」用のコマンド(画面左下の緑色ボタン)から「Reopen Folder Locally」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/8235403e-8f09-a883-924b-7dea8ef0703f.png)


下記の画面の様に、画面左の「リモート エクスプローラ」をクリックします。
「Dev Containers」配下の削除したいDockerコンテナのサブメニューを開き「Remove Container」をクリックすると、Dockerコンテナを削除できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1711391/1d3b9af2-3270-5171-4851-a3e96dba90d8.png)



# まとめ

この様に簡単にDockerコンテナ上で Visual Studio Code を動かすことが出来ました。

今回は Ubuntuイメージ に後から Node.js や各種ルーツを入れる方法でしたが、Node.jsやJava専用のDockerイメージも用意されているため、手軽に開発を始めることができます。

Visual Studio Code 用のDockerイメージの詳細は下記をご覧ください。様々な開発言語ごとのプロジェクトファイルのサンプルが記載されています。これを応用して、自分のプロジェクトに取り入れてみてはいかがでしょうか。

https://github.com/Microsoft/vscode-dev-containers


# 参考資料

/.devcontainer/devcontainer.json の設定値の詳細は下記をご覧ください。

https://code.visualstudio.com/docs/remote/devcontainerjson-reference