C++の開発環境をDockerで構築してVSCodeでリモート開発

## ことの発端

[VSCode でC++の開発環境構築（Windows / MacOS）](https://qiita.com/terukazu/items/003e033367052acfefe7) の記事を書いていて「何故にdocker使わない？」ということに気付き、やってみたら、更に簡単だったのでメモ。

Docker 未経験の方でも、Dockerさえインストールできれば[^1]、この手順で進めれば大丈夫です。
これをキッカケに Docker って何者なのかを調べてみると良いかと思います。

[^1]: VT-xを使っているミドルウエア（VMWareやVirtualBoxなど）をインストールしている場合はホスト環境にDockerを入れると、ネットワークドライバがコンフリクトしてアンインストールに苦労するかもなので、注意してください。

## 手順

### 1. DockerFile を作成

ここで開発用のフォルダを作成し、まずは Dockerileを作成します。

```dockerfile:Dockerfile
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y build-essential gdb cmake
```
今回は docker-compose は使用しません。[^2]

[^2]: ```docker-compose.yml```を書いても良いのですが、MS謹製の ```Remote-Containers``` がvolumeのbindとか面倒見てくれるので今回はこの子に甘えます。<strike>外部からのネットワークかインバウンドを想定したプログラムなら```docker-compose.yml```を記述する必要がありますが、ここでは割愛します。</strike>VSCodeのターミナルで起動したプロセスがTCPをリスニングした場合、自動的にポートフォワードしてくれるので特に設定不要です。

### 2. VSCodeからコンテナ内へリモート接続する

1. 拡張機能 [Remote - Containers : ms-vscode-remote.remote-containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) をインストールします。

2. インストールすると、左下の緑色のボタンが表示されるので、クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/e2a3ff7c-d89d-ed57-4181-45cb03109034.png)

3. コマンドパレットが表示されるので今回は```Remote-Containers: Open Folder in Containers...```を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/3b5756b0-179b-2cd9-998c-cb37543f8b57.png)

4. フォルダ選択画面が表示されるので、Dockerファイルが存在するフォルダを選択します。

5. コマンドパレットが表示されるので```From 'Dockerfile'```を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/e1191f1f-c73b-6f96-70c5-e31c56807aa2.png)

この手順で、コンテナビルド→設定→起動→ログインが行われます。

### 3. 開発用の拡張機能をインストール

1. 拡張機能 [C/C++ : ms-vscode.cpptools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) をインストールします。

2. 拡張機能[CMake Tools : ms-vscode.cmake-tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) をインストールします。

VSCodeはリモート環境毎に拡張機能をインストールするという素晴らしい仕様なので、既にローカルで拡張機能をインストールしていても、再度インストールがされているか確認をしてください。

### 4. 開発開始

1. [F1] でコマンドパレットを表示しして、```Cmake: Configure``` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/b51e4e7b-028d-6a86-d573-0592d7a51501.png)

2. Kit の選択が要求されるので ```GCC 7.5.0``` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/402cc623-ee24-d87e-729c-4eb845dc92a1.png)

3. 右下に ```CMakeLists.txt``` を作るか聞いてくるので```Create```を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/132150a7-d644-5e46-f7f7-89fbc5f00db0.png)

4. プロジェクト名を入力してと言われるので、適切な名前を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/86f04787-6e8f-79c8-4041-26c6d8b2b552.png)

5. 実行ファイル（Executable）からライブラリファイル（Library）かと聞かれるので、```Executable``` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1038343/732b466d-6a32-7446-adcc-ff9c0b822ff6.png)

この手順で、```CMakeLists.txt```と```main.cpp``` が生成されます。

### 5. ビルドとデバッグ実行

1. [F7] でビルドが行われます。
2. [CTRL] + [F5] でデバッグ実行が開始されます。

ブレイクポイントやら、スタックトレース、変数のウォッチなどは、一般的な開発環境と同じなので、ここでは割愛します。

## その他

* VSCode を閉じれば、コンテナは自動的に停止します。
* 次回からは VSCode を起動して Recent からフォルダを選択すれば、自動的にコンテナを起動してくれます。
* VSCodeでgitの操作を行いたいなら、```Dockerfile```にgitを追加しましょう。
* gitを使う場合 ```.gitignore``` に ```build``` と ```.devcontainer``` を追加しましょう。
* ```Remote-Container```使えば、C++以外でもDockerを使って開発環境構築するのは良いかも。