Go言語

DockerでGoアプリを開発・デプロイする手順ガイド

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

開発環境の準備

本セクションでは、Docker と Go の動作要件を確認し、インストールから動作確認までの流れを示します。開発マシンが正しくセットアップされていることは、後続のビルドやデプロイで生じる環境依存エラーを防ぐ鍵となります。

Docker Desktop のインストール

Docker Desktop は Windows、macOS、および一部 Linux ディストリビューション向けに公式サポートが提供されています。最新のサポート対象は次の通りです。

OS バージョン 備考
Windows 10/11 (Home, Pro, Enterprise) WSL 2 有効化必須 Windows Store 版または公式サイトからインストーラを取得
macOS Ventura(13)以降 Apple Silicon(M1/M2)および Intel 両方に対応
Ubuntu 22.04 LTS、23.10 以降 apt パッケージで Docker Engine を利用する場合は Desktop は不要
Debian / Fedora / RHEL 最新の LTS リリース Docker Engine (docker.io) のみ公式サポート。Desktop が必要な場合は Community Edition を参照

インストール手順(共通)
1. 公式ダウンロードページ https://www.docker.com/products/docker-desktop/ にアクセスし、OS 別の「Download for …」ボタンをクリック。
2. ダウンロードしたインストーラを実行し、画面指示に従ってインストール。
3. インストール完了後、ターミナル(PowerShell / iTerm2 等)で docker version を実行し、ClientServer のバージョンが表示されれば成功です。

Linux 環境で Desktop が不要な場合は、公式リポジトリから Docker Engine をインストールしてください。

前提条件の確認

以下のツールがインストール済みかどうかを、コマンドラインで簡単にチェックできます。全てが揃っていることを ローカルビルドCI 環境 の両方で前提とします。

ツール 推奨バージョン チェックコマンド
Go 1.22.x 以上 go version
Git 任意の最新版 git --version
VS Code (または好みのエディタ) - code --version(VS Code がインストールされている場合)
Docker CLI Desktop/Engine に同梱 docker version --format '{{.Server.Version}}'

Tip: VS Code の「Docker」拡張機能と「Go」拡張機能を併用すると、イメージビルドやデバッグが GUI から直感的に実行できます。


プロジェクト構成とコード実装

この章では、典型的な Go プロジェクトのディレクトリレイアウトと、Docker ビルドに必要な設定ファイル(go.mod.dockerignoreDockerfile)を具体例とともに解説します。

ディレクトリ構成

以下は、シングルバイナリ アプリケーション向けの推奨レイアウトです。ソースコードは src/ に集約し、ビルド成果物やテストは同層に配置します。

Go モジュールの初期化

src/ ディレクトリへ移動し、モジュールを作成・依存解決します。CI 環境でも同様に実行できるよう、go.modgo.sum を必ずコミットしてください。

Hello World アプリ(main.go

最小構成で HTTP サーバを立ち上げるコード例です。実際のビジネスロジックはこのファイルに追加していきます。

.dockerignore のベストプラクティス

Docker ビルド時に不要なファイルがコンテキストに含まれると、イメージサイズが肥大化しビルド速度も低下します。Go プロジェクト専用の除外設定は次の通りです(node_modules は削除しました)。

効果: 上記パターンを除外することで、ビルドコンテキストが数十 MB から数 MB に縮小し、ネットワーク転送やレイヤー作成のコストが大幅に削減されます。


マルチステージ Dockerfile とイメージ最適化

本節では、ビルダー ステージで Go バイナリを生成し、ランタイム ステージで Alpine Linux(数 MB 程度)または scratch ベースの超小型イメージへ移行する手順を解説します。

Builder ステージの構成

まずは依存取得とバイナリビルドだけを行うステージです。キャッシュ活用により、ソースコードが変更されても go.mod が固定されていれば再ダウンロードは発生しません。

重要ポイント解説

  • CGO_ENABLED=0:純粋なスタティックバイナリを生成し、Alpine の musl と互換性を保ちます。
  • GOARCH=amd64(または arm64):マルチアーキテクチャ対応は docker buildx で実現可能です。
  • キャッシュ層の順序go.mod のコピーと go mod download を最初に配置することで、コード変更時でも依存解決は再利用されます。

Runtime ステージ(Alpine)

ビルダーで生成したバイナリだけを持ち込み、軽量なランタイム環境を構築します。ベースサイズは 数 MB 程度 になる点に留意してください(実際の最終イメージは追加レイヤーや ca-certificates の有無で変動します)。

Alpine のサイズに関する注意

  • ベースイメージは約5 MBですが、ca-certificates(HTTPS 通信が必要な場合)や tzdata を追加すると総容量は 10–15 MB 程度になることがあります。
  • 必要最小限のパッケージのみをインストールし、--no-cache オプションで一時的なキャッシュを残さないようにします。

Scratch ベースの超軽量イメージ(任意)

さらにサイズ削減が求められる場合は scratch を使用できます。scratch は空のベースイメージなので、バイナリだけが格納されます。

  • サイズ比較:Alpine が数 MB、scratch は 2 MB 未満(バイナリ自体のサイズのみ)。
  • 制約:TLS 証明書やロケールが必要な場合は別途コピーする必要があります。

BuildKit とマルチプラットフォームビルド

Docker Desktop の設定画面で BuildKit を有効化するか、環境変数 DOCKER_BUILDKIT=1 をエクスポートしてください。マルチアーキテクチャ対応は docker buildx が提供します。

docker-bake.hcl のサンプルは以下です。


開発時のコンテナ活用とデバッグ

ローカル開発では、コード変更を即座に反映させる ホットリロード と、Go の公式デバッガ dlv を利用したコンテナ内デバッグが有効です。ここでは具体的な設定例と実行コマンドを示します。

ボリュームマウントによるホットリロード

ソースコードはローカルに保持しつつ、開発用イメージでリアルタイムにビルド・再起動させます。以下の docker run コマンドは 開発ステージbuilder の成果物)を利用します。

  • -v オプションでローカルの src/ ディレクトリをコンテナ内 /app/src にマウント。
  • ポートはホストとコンテナ双方で同一(8080)に設定し、ブラウザから http://localhost:8080 へアクセスできます。

Air を用いた自動ビルド・再起動

Air は Go 向けのライブリローダです。開発イメージに組み込む手順は以下の通りです。

.air.toml のシンプル設定例(30 行未満):

この構成で docker run(上記と同様)を実行すると、src/ 配下の .go ファイルが変更されるたびに自動ビルド・再起動が走ります。

Delve(dlv)によるコンテナ内デバッグ

本番イメージに dlv を含めず、デバッグ専用イメージを作成する方法をご紹介します。builder ステージへインストールし、ポート公開とヘッドレスモードで起動します。

コンテナ起動例:

VS Code の Go 拡張機能で「Attach to Remote」設定を作成し、localhost:40000 に接続すればブレークポイントが有効になります。

コンテナ内での go test 実行

CI と同一環境で単体テストを走らせることで、ローカルと CI の結果差異を排除できます。以下は開発イメージ上でテストを実行する例です。

  • go.mod がマウントされた状態なので、依存解決も自動的に行われます。
  • テストが失敗した場合はコンテナの終了コードが 1 になるため、シェルスクリプトや CI の判定ロジックと自然に連携できます。

CI/CD と本番デプロイ

GitHub Actions を活用し、マルチアーキテクチャ対応イメージの自動ビルド・Docker Hub へのプッシュを実現します。エラーが発生した際の対処法も併せて掲載しています。

GitHub Actions ワークフロー例

.github/workflows/docker.yml に配置する YAML は、20 行以内に収まるシンプルかつ拡張性の高い構成です。コメントは省略し、必要最小限のステップだけを書きました。

ワークフローのポイント

  • QEMUBuildx の組み合わせで、amd64arm64 両方のイメージを同時にビルド。
  • docker/build-push-action@v5 が内部的に BuildKit を有効化するため、手動で環境変数を設定する必要はありません。
  • シークレットとして保存した Docker Hub の認証情報は、GitHub リポジトリの Settings > Secrets and variables > Actions から登録してください。

本番向け最小イメージ戦略

Alpine ベース(汎用的)

  • サイズca-certificates を含めても 10–12 MB 程度に抑えられます。
  • TLS が必須な外部 API 呼び出しや HTTPS サーバの場合は、上記行を有効にしてください。

Scratch ベース(超小型)

  • 利用シーン:社内マイクロサービスやリソース制約が厳しいエッジデバイス向け。
  • 注意点/etc/passwd や証明書が無いため、ログ出力は標準出力に限定し、TLS が不要な場合のみ推奨。

よくあるエラーと対処法

エラー 原因 解決策
go.mod not found Dockerfile の WORKDIR が期待通りでない WORKDIR /app/src を明示し、COPY src/go.mod . のパスを確認
ポートがマッピングされていない docker run -p オプションの記述ミス -p 8080:8080 の形でホストポートとコンテナポートを同一に指定
ビルドが遅くなる(キャッシュ未使用) BuildKit が無効、もしくは go.mod が変更されている 環境変数 DOCKER_BUILDKIT=1 を設定し、docker build --no-cache で再確認
デバッグ時に dlv が接続できない ポート公開忘れ、またはファイアウォール制限 -p 40000:40000 を必ず付与し、ローカルのセキュリティポリシーを緩和
GitHub Actions のプッシュ失敗 Docker Hub の認証情報が未設定または期限切れ リポジトリシークレット DH_USERNAMEDH_TOKEN を再生成し、正しく登録

ベストプラクティス:CI でのビルドエラーは、ローカル環境と同一の Dockerfile/docker-compose 設定で再現できるかをまず確認してください。


まとめ

  • 開発環境: 最新版 Docker Desktop(Windows/macOS)または Docker Engine(Linux)に加え、Go 1.22、Git、VS Code をインストールし、docker version で動作確認を行います。
  • プロジェクト構成: src/ にコード・テスト・モジュール情報を配置し、.dockerignore で不要ファイル(Go キャッシュや IDE 設定)を除外します。
  • マルチステージ Dockerfile: Builder → Runtime(Alpine)または Scratch の二段階構成により、イメージサイズは数 MB に抑えつつビルド速度と再現性を確保します。BuildKit と --target オプションでビルドプロセスを柔軟に制御できます。
  • 開発時の利便性: ボリュームマウント+Air によるホットリロード、dlv によるコンテナ内デバッグ、go test のコンテナ実行でローカルと CI が同一環境になるよう統一します。
  • CI/CD と本番デプロイ: GitHub Actions でマルチアーキテクチャビルド・自動プッシュを設定し、Alpine または Scratch の最小イメージへデプロイすることで、セキュリティと運用コストの両面を最適化します。

本ガイドに沿って手順を実践すれば、ローカル開発 → 継続的インテグレーション → 本番環境への安全なデプロイ がシームレスに行えるようになります。ぜひご自身のリポジトリで試し、チーム全体の DevOps 効率化に役立ててください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Go言語