Go言語

GolangとDockerの連携: Dockerfile作成・docker-composeによる環境構築ガイド

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

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

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

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

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

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

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

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

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

Beyond Careerに無料相談する

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


スポンサードリンク

GoとDockerの連携による開発フロー最適化

GoアプリケーションにDockerを導入する背景には、開発環境の一貫性確保とデプロイプロセスの簡略化があります。Dockerは依存関係のバージョン管理や環境差異によるトラブルを解消し、ローカルでのテストから本番環境まで同じ動作を保証します。特に「docker-compose」を使うことでRedisやデータベースといった外部サービスとの連携が簡易化され、現代の開発フローに不可欠な技術となっています。


なぜGoアプリケーションにDockerを導入するのか

  • 開発環境と本番環境の差異を解消: 実行環境の依存関係をコンテナ内に統合できます。
  • デプロイ手順の簡略化: イメージビルド→プッシュ→起動の一連の流れが標準化されます。
  • チーム間の共有性向上: 同じDockerfileとdocker-compose.ymlで動作する環境を構築可能です。

本記事で学べる内容の概要

本記事では、Goアプリケーション用にDockerfileを作成し、docker-composeで複数コンテナ(DB・Redis)を連携させる実装手順を解説します。また、ローカル環境での開発フロー構築やコンテナ間通信のベストプラクティスにも焦点を当てます。


Dockerfile作成によるGoアプリケーションのDocker化

GoアプリケーションをDocker化する際は「マルチステージビルド」を活用し、最終イメージサイズを抑えることが重要です。最新バージョンの公式ベースイメージを使用し、コンパイル環境とランタイム環境を分離することで、効率的なビルドと軽量な実行環境が実現できます


マルチステージビルドによるイメージ最適化

マルチステージビルドは、開発用のステージ(コンパイル)と最終的なランタイム用のステージに分ける手法です。これにより、不要な依存関係やツールが最終イメージから除去され、サイズ削減が可能です。

Dockerfile例:

効果:

項目 補足
イメージサイズ 約38MB(alpineベース) ベースイメージの選定によりさらに小さくなる
ビルド時間 最初のコンパイル時のみ増加 2回目以降はキャッシュが有効

Goモジュールの扱い方とワークスペース設定

Goモジュールを使用する際は、Dockerfile内でgo mod downloadを実行し、依存関係を事前にダウンロードします。また、GOPATHを指定せずにプロジェクト直下で開発できるようにしておくことで、コンテナ内での動作とローカル環境の一致が保証されます。

手順例:

  1. プロジェクトディレクトリに移動
  2. go mod init myapp でモジュールを初期化
  3. go get で依存関係をインストール

注意: go mod downloadは、ビルド前には必ず実行してください。これにより、ネットワーク接続が不安定な環境でも依存関係のダウンロードが確実に行えます。


docker-composeによる複数コンテナ連携

docker-composeは、GoアプリケーションとRedisやデータベースといった外部サービスを同時に起動できるツールです。サービス定義ファイル(yml)の構成によってネットワーク設定や依存関係管理が自動化されます


サービス定義ファイル(yml)の構成例

以下は、GoアプリケーションとRedisを連携させるdocker-compose.ymlのサンプルです。ネットワークに参加するサービスは自動でDNS名ベースで通信可能になります。

構成の特徴:

  • depends_onで起動順序を管理(redis→app)
  • 環境変数REDIS_HOSTで通信先を指定
  • サービス名(redis)からDNS解決が可能

Redis・データベースとの接続方法

RedisやMySQLなどと連携する際は、Dockerコンテナ内でサービス名(例: redis)を使用します。docker-composeのネットワークでは、同じネットワークに所属するコンテナ同士はIPアドレスではなくサービス名で通信できます

注意点:

  • 外部からアクセスする場合、ポートをホストマシンに公開する必要がある
  • データ永続化が必要な場合はvolumesを使用

ローカル開発フローの構築手順

ローカル環境での開発では、コード変更→再ビルド→コンテナ起動をスムーズにすることが重要です。ホットリロード対応やコンテナ間通信のテスト方法を解説します。


ホットリロード対応のビルドプロセス

Goアプリケーションでホットリロードを使うには、airdelveなどのツールが効果的です。以下はdocker-composeairを組み合わせた例です。

手順:

  1. go get github.com/cosmtrek/air
  2. docker-compose.ymlcommandを指定
  3. 修正後、自動で再コンパイルとリロード

docker-compose.ymlの例:


コンテナ間通信のテスト方法

コンテナ内で動作するアプリケーションを確認するには、curlやHTTPクライアントを使用します。以下はRedisに接続して値を取得する例です。

コマンド例:

トラブルシューティングポイント:

  • サービスが起動していない場合、docker-compose logsで確認
  • ネットワーク接続問題はdocker network lsからチェック

コンテナ間通信のベストプラクティスとネットワークセキュリティ設定

Dockerコンテナ同士の通信には、サービス名ベースのDNS解決とネットワークセキュリティ設定が不可欠です。特にdocker-composeのデフォルトネットワークは、同一プロジェクト内のサービスに自動で接続を許可します。


サービス名ベースのDNS解決

docker-composeでは、同じネットワークに所属するコンテナ間でサービス名(例: redis)を使用して通信できます。これは内部DNSにより自動的に解決されます。

実装時のチェックポイント:

  • ネットワークが正しく定義されているか
  • サービス名とポートが一致しているか

ネットワークセキュリティ設定

外部ネットワークに公開する場合は、network_mode: hostを避けてカスタムブリッジネットワークを使用することが望ましいです。また、セキュリティ対策として以下の点を意識してください。

  • ポートの最小限開設: 使用しないポートは閉じておく
  • サービス間通信制限: --networkでネットワークを限定できる

注意: セキュリティリスクを避けるため、必要以上にネットワークを公開しないようにしましょう。


Dockerイメージの最適化ポイント

Dockerイメージサイズを削減し、ビルドキャッシュを有効活用することで、開発効率と運用コストを改善できます。不要なパッケージの除去やレイヤー分割が鍵です。


不要なパッケージの除去

ベースイメージ(例: alpine)は軽量ですが、必要なツールだけインストールする必要があります。以下は典型的な最適化手順です。

1. 基本的な不要パッケージの一覧を確認

2. 必要ないものを削除

効果:

項目 補足
イメージサイズ 30%以上削減可能 多くのプロジェクトで実現可能
ビルドキャッシュ利用 可能 キャッシュを活用した効率的なビルド

レイヤー分割の工夫

DockerfileのRUNコマンドを複数行に分けることで、ビルドキャッシュの有効範囲を制御できます。変更頻度が高い手順は後段に配置します。

例:


まとめ

本記事では、GoアプリケーションとDockerの連携方法について、以下の点を解説しました。

  • Dockerfile作成: マルチステージビルドによるイメージ最適化
  • docker-compose: Redis・DBとの連携設定とネットワーク管理
  • ローカル開発フロー: ホットリロード対応と通信テスト
  • コンテナ間通信: サービス名ベースのDNS解決の活用
  • イメージ最適化: レイヤー分割やキャッシュの有効活用

記事内のサンプルコードを基にローカル環境で実装し、コメント欄でご自身の開発体験を共有してみましょう。

スポンサードリンク

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

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

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

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

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

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

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

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

Beyond Careerに無料相談する

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


-Go言語