VS CodeでDevContainerを触ってみた

こんにちは！GxPの肥後です
この記事は[グロースエクスパートナーズ Advent Calendar 2023 1日目](https://qiita.com/advent-calendar/2023/gxp)です！
カレンダーの先頭は初めてです！
Dockerは勉強中で記録の意味でもかけるので一石二鳥ですね！

## 初めに
今回はDockerの勉強がてら触っていたので、その内容を記載しようと思います。
go言語の環境を作ってhello wolrdをするところまで書きます。
goを選んだ理由に意味はなくて、書籍買ったので触ってみようと思ったからです！！
また今回はローカル環境を汚さずに言語の環境構築をしたいため、Devcontainerというものを用います。
Dockerを使えるといろんな言語を迅速に使えたり物理サーバーを考慮することなく手軽にWebアプリの動作確認ができそうで気軽に何かを試すことが可能になるかと思いますので試していきましょう。
## Dockerとは
調べたらすぐに出てくるのですが簡単に言いますと、コンテナ技術を利用して、
仮想環境を素早く構築できるものです。

## DevContainerとは？
簡単に説明しますがDockerコンテナを開発環境として作成することで、その環境に必要なライブラリやランタイムのバージョン、拡張機能をコンテナ内で完結させることができます。
公式の[説明](https://code.visualstudio.com/docs/devcontainers/containers)はこちら。

## インストール
1.[Docker Desktop](https://www.docker.com/products/docker-desktop/)と[VS Code](https://code.visualstudio.com/)をインストールします。
2.VS Code内の拡張機能でRemote Developmentという拡張機能をinstallします。

## Docker Composeとは
将来的に複数コンテナを使って開発する想定があるのでDocker Composeというツールを使用します。
[公式ドキュメント](https://docs.docker.jp/compose/index.html#compose-features)に記載があります。
>複数のコンテナを定義し実行する Docker アプリケーションのためのツール
>YAMLファイルを使い、アプリケーションのサービスを設定し、コマンドを１つ実行するだけで、設定内容>に基づいた全てのサービスを生成・起動

簡単に言うと今まで一つのコンテナをコマンド打って操作してましたが複数のコンテナを操作できますよということですね。

## コンテナ起動の流れ
主に３つです。
1.**Dcokerfileの作成**
docker-compose.ymlファイルで直接イメージを指定すれば、Docker Composeでコンテナを起動するためのDockerfileは必要ないですが、既存のイメージに対して追加の設定やカスタマイズを行う場合は、Dockerfileを作成し、それをdocker-compose.ymlから参照します。

2.**docker-compose.ymlの作成**
docker Composeの設定ファイルであり、これから作成するコンテナの初期状態をYAML形式で記載します。

3.**docker-composeコマンドでコンテナ起動**
docker-compose.ymlファイルが存在するディレクトリでdocker compose upコマンドを実行すると、docker-compose.ymlファイルに記述された全てのサービス（コンテナ）をビルドし起動します。

docker-composeについては私はこのサイトを見て参考になりました。
[【初心者向け・図解】Docker Composeとは？Dockerとの違いを現役エンジニアがわかりやすく解説](https://o2mamiblog.com/docker-beginner-2/)

## 環境構築
さて、簡単な説明は以上で環境構築に入っていきます。
フォルダを作りDockerfileとdocker-Compose.ymlを用意します。
```Dockerfile:Dockerfile
FROM golang:1.15.6
RUN apt-get update && apt-get install -y curl
```
```docker-compose.yml
version: '3'
services:
  golang:
    build:
      dockerfile: Dockerfile
    volumes:
      - ..:/workspace/golang/  # プロジェクトルートをマウント
    tty: true
```
```json::devcontainer.json
{
    "dockerComposeFile": "docker-compose.yml",
    "service": "golang",
    "workspaceFolder": "/workspace/${localWorkspaceFolderBasename}"
}

```
Dockerfileは今回ほぼ不要です。
これは将来的にDevContainer内に拡張機能をいれるために予め作っておきます。
goの環境自体はdocker-composeで作れます。
拡張機能を今回Devcontainer内に入れないのでコマンドでgoを実行してあげる必要があります。

WindowsPowerShellを開きDockerが入っているのを確認。
```
docker --version
```
入っていなかったら[インストール](https://www.docker.com/products/docker-desktop/)からやりましょう。

```
cd {プロジェクトフォルダにしたい場所}
```
私の場合は以下のコマンドになりました。
```
 cd .\Documents\golang\
```
docker-compose.ymlをもとにイメージとコンテナを作成します。
Dcokerfileに拡張機能を追加して再作成したい場合は`--build`オプションを使用します。
```
docker compose up
```
無事にコンテナは起動できたようです
![スクリーンショット 2023-11-30 123400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612391/152844d9-c570-18d3-4a8f-d0ede2be4f48.png)

次にVS CodeでDevContainerに入っていきたいと思います。
方法は簡単で以下のマークをまず押下します。左下にあります。
![スクリーンショット 2023-11-30 085542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612391/61fc2200-5ba2-fdf7-098c-f674bdef1c46.png)
そうすると実行中のコンテナにアタッチというメニューがありますので押下し
実行中のコンテナ一覧が表示されます。先程作ったコンテナ内に入ります。
無事に入れました。左下の表記も変わってますね。
![スクリーンショット 2023-11-30 123801.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612391/405f9522-7179-d09f-8a83-ed14b350e5ac.png)

Hello Worldを表示するためにgoフォルダを作成しその直下にsrcフォルダを作成します。
![スクリーンショット 2023-11-30 124220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612391/c9e02040-9042-9c66-c77c-47ae6a1e579f.png)

``` go:main.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
```
拡張機能やmodule類を入れてないのでmoduleが見つからない警告文が出ますがHello Worldを表示させるだけなのでこのまま行きます。
```
cd go/src
```
```
go run main.go
```
無事に出せることができました！
![スクリーンショット 2023-11-30 124833.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612391/ae0ba60a-1cfb-3add-7618-e4c2aa0957fd.png)

## 最後に
5分で環境が作れましたね！！
本当に簡易的に環境を作っただけですのここから本格的に拡張機能等を入れていき開発環境の整えて行く必要がありますがとりえあず触ってみよう精神でやってみました！
環境汚すことなくいろんな言語の環境やLinux環境も用意できるのでかなり便利に感じました。
しかし、メインで使っているIDEがIntelliJ ですので、それでもできないかも試してみようかなと思います。

## 参考文献
https://code.visualstudio.com/docs/devcontainers/containers

https://o2mamiblog.com/docker-beginner-2/