はじめに
Windows で Go を開発する場合、Windows に Go SDKを直接インストールする方法があります。
この記事では、Go の実行環境を Windows 側ではなく Dockerコンテナ内に構築し、VS Code の Dev Containersから接続して開発する方法を紹介します。
Docker Desktop の仕組みや WSL2 との関係、Docker Desktopのインストール方法については、以下の記事で解説しています。
Docker Desktop for Windows入門:仕組みと構築方法
本記事では、Docker Desktop がインストール済みで、Windows 上から Dockerコンテナを実行できることを前提とします。
この記事で分かること
- VS Code の Dev Containers の役割
- Docker コンテナを Go の開発環境として利用する方法
- Windows に Go SDK を直接インストールせずに Go を実行する方法
-
go run、gofmt、go test、go buildの実行方法 -
goplsを利用した VS Code の Go 開発環境
全体構造
ソースコードは VS Code から編集しますが、Goの実行・ビルド・テストなどは Docker の Linux コンテナ内で行います。
Dev Containers とは
Dev Containers は、Docker コンテナを VS Codeの開発環境として利用するための仕組みです。
通常の Docker利用では、作成したアプリケーションをコンテナで実行する使い方が中心ですが、Dev Containers では、コンテナそのものを開発環境として利用します。
[VS Code]
↓
[Dev Containers]
↓
[Docker Desktop]
↓
[Development Container]
├─ 開発言語
├─ コンパイラ
├─ Language Server
├─ テストツール
└─ その他の開発ツール
今回の場合は、この Development Container に Go の開発環境を用意します。
前提条件
- Windows 11
- Docker Desktop が起動していること
- Visual Studio Code
- PowerShell
Docker の動作確認
PowerShell または VS Code のターミナルで以下を実行します。
docker --version
正常に動作していれば、Docker のバージョンが表示されます。
Visual Studio Code の準備
VS Code が未インストールの場合は、公式サイトからインストールします。
PowerShell から以下を実行して確認します。
code --version
バージョン情報が表示されれば利用できます。
Dev Containers のインストール
VS Code を起動します。
左側の「Extensions(拡張機能)」を開き、以下を検索します。
Dev Containers
Microsoft が提供している Dev Containers をインストールします。
構成は以下になります。
[VS Code]
↓
[Dev Containers]
↓
[Docker Desktop]
↓
[Go Development Container]
Go プロジェクトの作成
今回は以下のフォルダにプロジェクトを作成します。
C:\work\go-docker
PowerShell で以下を実行します。
cd C:\work
mkdir go-docker
cd go-docker
VS Code で開きます。
code .
.devcontainer フォルダの作成
プロジェクト直下に .devcontainer フォルダを作成します。
その中に devcontainer.json を作成します。
go-docker
│
└─ .devcontainer
└─ devcontainer.json
devcontainer.json の作成
devcontainer.json に以下を記述します。
{
"name": "Go Development",
"image": "mcr.microsoft.com/devcontainers/go:2-1.26-trixie",
"customizations": {
"vscode": {
"extensions": [
"golang.go"
]
}
},
"remoteUser": "vscode"
}
image
以下では、Go 開発用の Dev Container イメージを指定しています。
"image": "mcr.microsoft.com/devcontainers/go:1-1.25-bookworm"
このイメージを利用することで、Windows 側へ Go SDKを直接インストールせず、コンテナ側に Go の開発環境を用意できます。
※利用可能な Go / Dev Container
イメージのバージョンは更新されるため、実際に構築する際は利用可能なバージョンを確認してください。
extensions
以下では VS Code の Go 拡張機能を指定しています。
"extensions": [
"golang.go"
]
Dev Container を起動すると、Go 拡張機能をコンテナ側の VS Code環境で利用できます。
Dev Containerの起動
ここまでの手順で作成した devcontainer.json を使用して、Go開発コンテナを起動します。
devcontainer.jsonを作成済みの場合
devcontainer.json を保存したら、VS Codeで次のショートカットキーを押してコマンドパレットを開きます。
Ctrl + Shift + P
次のコマンドを検索します。
Dev Containers: Reopen in Container
日本語表示の場合は、次の項目を選択します。
開発コンテナー: コンテナーで再度開く
VS Codeが .devcontainer/devcontainer.json を読み込み、Docker Desktopを利用してGo開発コンテナを作成・起動します。
初回起動時はDockerイメージのダウンロードが行われるため、完了まで時間がかかる場合があります。
devcontainer.jsonを作成していない場合
devcontainer.json を自分で作成していない場合は、Dev Containersが用意しているテンプレートから作成することもできます。
コマンドパレットからDev Containersの構成追加を実行し、次の画面で 「ワークスペースに構成を追加する」 を選択します。
これにより、現在のプロジェクト内に .devcontainer/devcontainer.json を作成できます。
続いて、「すべてのテンプレートを表示…」 を選択します。
テンプレートの一覧から、Go用のDev Containerを選択します。
Go
「Go & PostgreSQL」はPostgreSQLも含めた開発環境を構築するための別のテンプレートです。今回はGo単体の環境を使用します。
Go devcontainers ← ★これを選択
Develop Go based applications...
次に、使用するGoのバージョンとLinuxディストリビューションを選択します。
テンプレートや利用可能なGoのバージョン、ベースとなるLinuxディストリビューションは更新されることがあります。そのため、画面に表示される選択肢は本記事の画像と異なる場合があります。
続いて、追加機能(Features)を選択する画面が表示されます。
今回の go-docker プロジェクトでは追加機能を使用しないため、何もチェックせず「OK」を選択します。
追加ファイルを選択する画面が表示された場合も、今回は何も選択せず 「OK」を選択します。
表示されている .github/dependabot.yml などは、今回のGo開発環境の動作確認には必要ありません。
設定が完了すると、プロジェクト内に次のファイルが作成されます。
go-docker
│
└─ .devcontainer
└─ devcontainer.json
その後、VS Codeがウィンドウを開き直し、Docker Desktopを利用してGo開発コンテナを作成・起動します。
最終的には、どちらの方法でも次の構成になります。
.devcontainer/devcontainer.json
↓
Dev Containers
↓
Docker Desktop
↓
Go用Dockerイメージ
↓
Go開発コンテナ
↓
VS Codeがコンテナへ接続
Go の動作確認
Dev Container が起動したら、VS Code から新しいターミナルを開きます。
以下を実行します。
go version
Goのバージョンが表示されれば、開発コンテナ内でGoを実行できています。
linux/amd64 と表示されていることから、Windows ではなく Docker の Linux
コンテナ内で Go が動作していることが確認できます。
初回は Dockerイメージの取得などが行われるため、時間がかかる場合があります。
起動フロー
Windows 11上のVS CodeからDev Containersを実行すると、Docker DesktopがGo開発用のLinuxコンテナを起動し、VS Codeがそのコンテナに接続します。
VS Code(Windows 11)
↓ .devcontainer/devcontainer.jsonを読み込む
Dev Containers
↓
Docker Desktop
↓ Go開発用イメージを取得・コンテナを作成
Go開発コンテナ(Linux)
↑
VS Codeが接続
開発コンテナからWindows環境に戻す
Goの開発コンテナで作業している状態から、通常のWindows環境に戻してみます。
VS Code左下の 「開発コンテナー: Go @ desktop-linux」をクリックします。
表示されたメニューから、「リモート接続を終了する」 を選択します。
開発コンテナー: Go @ desktop-linux
↓
リモート接続を終了する
↓
Windows側のVS Codeに戻る
なお、DockerDesktopを終了したり、Dockerの設定を変更したりする必要はありません。
VSCodeから開発コンテナへの接続を終了しただけなので、必要になれば再びGoの開発コンテナへ接続できます。
再度Goの開発コンテナに切り替える
続いて、Windows環境から再びGoの開発コンテナへ切り替えてみます。
1. Windows側でgo-dockerを開く
VS Codeで、今回作成したGoプロジェクトのルートフォルダを開きます。
C:\work\go-docker
VS Codeのエクスプローラーでは、次のように表示されます。
go-docker
│
└─ .devcontainer
└─ devcontainer.json
2. コマンドパレットを開く
次のショートカットキーを押します。
Ctrl + Shift + P
検索欄に次のように入力します。
Dev Containers
表示されたコマンドから、
Dev Containers: Reopen in Container
を選択します。
VS Codeが、
C:\work\go-docker\.devcontainer\devcontainer.json
を読み込み、Docker Desktopを利用してGo開発コンテナを起動します。
流れは次のようになります。
Windows側のVS Code
↓
C:\work\go-docker を開く
↓
Ctrl + Shift + P
↓
「Dev Containers」と入力
↓
Dev Containers: Reopen in Container
↓
.devcontainer/devcontainer.json
↓
Docker Desktop
↓
Go開発コンテナ
↓
VS Codeがコンテナへ接続
3. Go開発コンテナへの接続を確認する
接続が完了したら、VS Code左下を確認します。
次のように表示されていれば、Go開発コンテナに接続されています。
開発コンテナー: Go @ desktop-linux
Windows側とDev Container側では、次のように対応しています。
Windows
C:\work\go-docker
│
│ Dev Containers
▼
Dockerコンテナ
/workspaces/go-docker
つまり、Windows側のプロジェクトフォルダをDev Container内から操作しているため、VS Codeで編集したファイルはWindows側の C:\work\go-docker にも反映されます。
以降のGoコマンドは、Dev Container内の /workspaces/go-docker で実行します。
Goモジュールの作成
Goモジュールとは
Goでは、アプリケーションやライブラリをモジュール(Module)という単位で管理します。
モジュールの情報は go.mod に記録され、主に次の情報を管理します。
- モジュールパス
- 使用するGoのバージョン
- 外部パッケージとそのバージョン
go mod initを実行する
Dev Container内のVS Codeターミナルで、現在のディレクトリを確認します。
pwd
次のようになっていることを確認してください。
/workspaces/go-docker
その状態で、Goモジュールを初期化します。
go mod init example.com/go-docker
go mod init は、現在のディレクトリをGoモジュールとして初期化するコマンドです。
go mod init example.com/go-docker
│ │ └────────────── モジュールパス
│ │
│ └─ モジュールを初期化
│
└─ Goコマンド
今回は学習用プロジェクトのため、モジュールパスとして、
example.com/go-docker
を使用します。
モジュールパスは、Goがモジュールを識別したり、プロジェクト内のパッケージをインポートしたりするときに使用します。
出力例:
次のメッセージが表示される場合があります。
go: to add module requirements and sums:
go mod tidy
go mod tidy は、ソースコードで使用しているパッケージを確認し、go.mod や go.sum の依存関係を整理するためのコマンドです。
GitHubで公開するプロジェクトでは、たとえば次のようにリポジトリに対応したモジュールパスを指定できます。
github.com/ユーザー名/go-docker
go.modを確認する
go mod init を実行すると、
/workspaces/go-docker/go.mod
が作成されます。
内容を確認します。
cat go.mod
出力例:
内容は次のようになっています。
module example.com/go-docker
└───────────────── モジュールパス
go 1.26.0
└─── 使用するGoのバージョン
Goのバージョンは、使用している環境によって異なる場合があります。
現在のプロジェクト構成
ここまでで、プロジェクトは次の構成になります。
go-docker
│
├─ .devcontainer
│ └─ devcontainer.json
│
└─ go.mod
それぞれの役割は次のとおりです。
| ファイル | 役割 |
|---|---|
.devcontainer/devcontainer.json |
VS CodeのDev Container開発環境を定義する |
go.mod |
Goモジュールや依存関係を管理する |
役割を整理すると、
devcontainer.json
└─ Goを実行する「開発環境」を定義
go.mod
└─ Goプロジェクトの「モジュール」を定義
となります。
Goプログラムの作成
続いて、プロジェクトルートに main.go を作成します。
作成場所は、
C:\work\go-docker\main.go
です。
Dev Container側から見ると、
/workspaces/go-docker/main.go
になります。
VS Codeのエクスプローラーで go-docker を右クリックし、「新しいファイル」を選択して、
main.go
を作成します。
main.go に次のコードを記述します。
package main
import "fmt"
func main() {
fmt.Println("Hello Go on Docker!")
}
このプログラムでは、Goの標準パッケージ fmt を利用して、文字列をターミナルへ出力します。
現在のプロジェクト構成は次のようになります。
go-docker
│
├─ .devcontainer
│ └─ devcontainer.json
│
├─ go.mod
│
└─ main.go
これで、Goプログラムを実行する準備ができました。
Go プログラムの実行
以下を実行します。
go run main.go
実行結果:
この go run は Windows 側ではなく、Go Development Container内で実行されています。
[VS Code]
↓ go run main.go
[Go Development Container]
↓
[Go]
↓
[main.go]
gofmt の確認
Go には標準のコードフォーマッターとして gofmt があります。
gofmt -w main.go
-w を指定すると、フォーマット結果をファイルへ書き戻します。
VS Code の Go拡張機能を利用すると、保存時の自動フォーマットも利用できます。
gopls の確認
Go では Language Server として gopls が利用されています。
VS Code の Go拡張機能と組み合わせることで、以下のような機能を利用できます。
- コード補完
- エラー表示
- 定義へ移動
- 参照検索
- リファクタリング
以下で確認します。
gopls version
環境によっては、初回に VS Code の Go 拡張機能から Go Toolsのインストールを求められる場合があります。
その場合は画面の案内に従って必要なツールをインストールします。
go build の実行
プログラムをビルドします。
go build
生成された実行ファイルを実行します。
./go-docker
実行結果:
今回の go build は Linux コンテナ内で実行しているため、基本的には
Linux 向けの実行ファイルが生成されます。
[Windows 11]
↓
[Docker Linux Container]
↓ go build
[Linux 向け実行ファイル]
go test の実行
Go のテストも確認します。
calc.go を作成します。
package main
func Add(a int, b int) int {
return a + b
}
続いて calc_test.go を作成します。
package main
import "testing"
func TestAdd(t *testing.T) {
result := Add(10, 20)
if result != 30 {
t.Errorf("Add(10, 20) = %d; want 30", result)
}
}
テストを実行します。
go test ./...
成功すると以下のように表示されます。
これで以下の Go 開発機能を Docker
コンテナ内で利用できることを確認できました。
go rungo buildgo testgofmtgopls
完成したプロジェクト構成
C:\work\go-docker
│
├─ .devcontainer
│ └─ devcontainer.json
│
├─ go.mod
├─ main.go
├─ calc.go
└─ calc_test.go
システム全体では以下の構成になります。
[Windows 11]
│
├─ Docker Desktop
│
└─ VS Code
│
└─ Dev Containers
│
▼
[Go Development Container]
│
├─ Go SDK
├─ gopls
├─ gofmt
├─ go run
├─ go test
└─ go build
VS Code を終了した後の再開方法
VS Code を終了してもソースコードは残っています。
PowerShell からプロジェクトを開きます。
cd C:\work\go-docker
code .
必要に応じてコマンドパレットを開きます。
Ctrl + Shift + P
以下を実行します。
Dev Containers: Reopen in Container
再び Go Development Container に接続して開発できます。
Windows に Go をインストールする必要はあるのか?
今回の構成では、Windows 側へ Go SDK
を直接インストールする必要はありません。
Windows 側:
[Windows 11]
├─ Docker Desktop
└─ VS Code
└─ Dev Containers
コンテナ側:
[Go Development Container]
├─ Go SDK
├─ gopls
├─ gofmt
├─ go run
├─ go test
└─ go build
Go の開発環境を Docker
コンテナ側へ分離できるのが、この構成のメリットです。
通常の Docker 実行との違い
通常の Docker
利用では、アプリケーションをイメージ化してコンテナとして実行する使い方が中心です。
[VS Code]
↓ docker build
[Docker Image]
↓ docker run
[Container]
↓
[Application]
Dev Containers の場合は、Docker コンテナ自体を開発環境として利用します。
[VS Code]
↓
[Dev Containers]
↓
[Docker Container]
├─ コード編集
├─ コード補完
├─ go run
├─ go test
└─ go build
まとめ
- VS Code の Dev Containers を利用すると Docker
コンテナを開発環境として利用できる - Windows 側へ Go SDK を直接インストールしなくても Go を開発できる
- Go の実行・ビルド・テストは Docker の Linux コンテナ内で行われる
-
devcontainer.jsonで開発環境を定義できる -
goplsや VS Code の Go 拡張機能もコンテナ環境で利用できる -
.devcontainer
をプロジェクトに含めることで、別の環境でも開発環境を再現しやすくなる
本連載について
| 回 | タイトル | 対応範囲 | 主な内容 |
|---|---|---|---|
| 第1回 | Docker × VS Code Dev ContainersでGo開発環境を構築する | 🐳 Go開発環境 | Docker Desktop・VS Code・Dev Containersを使ったGo開発環境の構築 |
| 第2回 | React + TypeScript + Go + PostgreSQLのフルスタック開発環境を構築する | 🛠️ フルスタック開発環境 | Docker Desktop・Dev Containers・React・TypeScript・Go・PostgreSQL・Node.js・Vite |
| 第3回 | ChatGPT Workでショッピングサイトを設計してみる | 📐 システム設計 | Project instructions・要件定義・ユースケース・画面設計・ER図・DB設計・REST API設計・テストケース仕様書 |
| 第4回 | Codex × AGENTS.md × Skillsで実装準備を整える | 🤖 AI開発ルール | AGENTS.md・プロジェクトルール・階層化・Skills・実装準備 |
| 第5回 | Codexで設計書からショッピングサイトを実装する | 🛒 ショッピングサイト実装 | 設計書・AGENTS.md・Skillsを活用した段階的なAI開発・実装・検証 |
| 第6回 | Codexで実装したショッピングサイトをテスト・動作確認する | 🧪 テスト・動作確認 | test-cases.md・ユニットテスト・結合テスト・API・ブラウザ・DBによる動作確認 |
| 発展編① | Codexのエージェントハーネスでテスト・デバッグ・再テストを自律化する | 🤖 エージェントハーネス | AGENTS.md・確定仕様・テストケース・停止条件を利用したテスト・デバッグ・修正・再テスト・Regression Testの自律化 |
| 発展編② | Playwrightでブラウザテストを自動化する | 🎭 E2Eテスト自動化 | Playwright・E2Eテスト・ブラウザ操作・Auto-waiting・Trace Viewer・Seleniumとの違い・Codexとの連携 |
















