個人的な備忘録：Go言語とDockerで『Hello, World!』を実装し、ローカル環境で動かしてみた

## はじめに

Googleが開発したプログラミング言語「**Go**」を学ぶために、Dockerを活用して「***Hello, World!***」を実行する手順を記録として記事にまとめました。

:::note info
***「Hello, World!」の出力やDockerファイルの作成といった基本的な操作をマスターしたいと考え、この機会に学びを整理し、備忘録として記録しています。***
:::

今回の記事では、Go言語については `main.go` ファイルの中でのみ触れていますが、この内容がどなたかの技術学習の支えになれば幸いです。

## 書こうと思ったきっかけ
以前からGo言語に興味があり、学んでみたいと思っていました。しかし、他の技術習得を優先していたため、なかなか手をつけられないでいました...。

***しかし、時間的に余裕ができたこの機会に、次はGo言語をキャッチアップしようと決めました。***

:::note warn
**普段はクラウド領域を専門としており、Lambda関数でのPythonや、TerraformのHashiCorp Configuration Language (HCL)、CloudFormationでのYAMLやJSONなどを中心に扱っています。**
:::

一方で、技術領域は広ければ広いほど応用が効くと考えています。そのため、興味を持った技術は、『**実践的なハンズオンと記事のアウトプット**』を組み合わせ、効率よく習得することを心がけています。

https://qiita.com/free-honda/items/a335a692be29791a5dda

また、前回の記事では、Linux、Mac、Windowsそれぞれの環境でのGo言語のインストールと設定についてガイドをまとめました。***詳細はこちらをご覧ください。***

https://qiita.com/free-honda/items/b3672e2ccfedbb14773a

## Go言語とDockerの知識整理
***※未来の自分への備忘録として、Go言語とDockerについて改めて知識を整理します。***

### Go言語について

Go言語（Golang）は、Googleが開発したオープンソースのプログラミング言語です。

#### 特徴
- **軽量性と高速性**  
  コンパイルが速く、実行時のパフォーマンスも高い。
- **並行処理の強力なサポート**  
  GoroutinesとChannelで効率的な並行処理を実現。
- **標準ライブラリが充実**  
  ネットワーク、ファイル操作、JSON処理など、便利な機能を提供。

#### 主な用途
- サーバーサイドアプリケーション
- クラウドツール（例: Docker、Kubernetes）
- ネットワークプログラミング

https://udemy.benesse.co.jp/development/system/golang.html

---

### Dockerについて

Dockerは、コンテナ技術を利用してアプリケーションの開発・デプロイを効率化するプラットフォームです。

#### 特徴
- **軽量な仮想環境**  
  コンテナを使用してアプリケーションと依存関係をパッケージ化。
- **高い移植性**  
  異なる環境（開発、テスト、本番）間で一貫した動作を保証。
- **迅速なデプロイ**  
  環境の準備やリリースが短時間で可能。

#### 主な用途
- 開発環境の構築
- マイクロサービスの実現
- CI/CD（継続的インテグレーション・継続的デリバリー）環境の構築

https://knowledge.sakura.ad.jp/13265/

## 実際に「***Hello, World!***」やってみた

Dockerを使ってGoプログラムをセットアップし、実行する手順をご紹介します。

:::note info
***以下は簡単なGoアプリケーションをDockerで動かす方法です。***
:::

### ディレクトリ構造
以下のようなディレクトリ構造を用意します。

```golang
my-go-app/
├── main.go
├── Dockerfile
├── docker-compose.yml
```

### 1. `main.go `ファイルの内容
以下のコードを `main.go` に保存します。

```golang
package main

import (
	"fmt"
	"net/http"
)

// リクエストを処理するハンドラ関数
func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "Hello, World!")
}

func main() {
	// ハンドラ関数をルートパスに登録
	http.HandleFunc("/", handler)

	// サーバーをポート8080で起動
	fmt.Println("Server is running on port 8080...")
	http.ListenAndServe(":8080", nil)
}
```

### 2. Dockerfile の内容
以下の内容を `Dockerfile` に保存します。

```dockerfile
# Goの公式イメージを使用
FROM golang:1.20

# 作業ディレクトリを設定
WORKDIR /app

# Goアプリケーションのソースコードをコピー
COPY . .

# Goモジュールを初期化し、依存関係を解決
RUN go mod init my-go-app && go mod tidy

# アプリケーションをビルド
RUN go build -o main .

# コンテナが起動時に実行するコマンド
CMD ["./main"]

# ポート8080を開放
EXPOSE 8080
```

### 3. docker-compose.yml の内容
以下の内容を `docker-compose.yml` に保存します。

```golang
version: "3.8"

services:
  app:
    build:
      context: .
    ports:
      - "8080:8080"
    container_name: go_app
```

### 4. セットアップと起動
以下の手順でDockerコンテナを構築して実行します。ターミナルで my-go-app ディレクトリに移動します。

```bash
cd my-go-app
```

Dockerイメージをビルドします。

```bash
docker compose build
```

コンテナを起動します。

```bash
docker compose up
```

コンテナを停止したい場合は、以下のコマンドを実行します。

```bash
docker compose down
```

## ブラウザでアクセスしてみた
ブラウザで `http://localhost:8080` にアクセスすると、`Hello, World!` と表示されます。

![Screenshot 2025-01-12 at 19.27.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6cc6aec6-125c-7d4d-33ac-936db73acdf3.png)

また、ターミナル上では以下のように、`go_app | Server is running on port 8080...` と出力され、正常に起動していることが確認できます。

![Screenshot 2025-01-12 at 20.23.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/de3b4085-3b12-6160-39df-3daf2806fcf7.png)


これで、`docker compose` コマンドを使用したGoアプリケーションのセットアップと実行が完了しました！

## まとめ
ここまでお読みいただきありがとうございました。***今回は、Docker上でGoアプリケーションを動かす基本的な技術検証を行い、想定通り「Hello, World!」を表示させることができました。***

:::note warn
**少し触った印象として、Pythonよりもかなり速い速度でコンテナが立ち上がったように感じました。**
:::

この速度は、Goの特徴である「軽量性」と「高速性」によるものではないかと個人的に思います（間違っていたら、ごめんなさい）。

***次回は、自宅環境にあるMySQLデータベースと接続する技術検証を試してみたいと考えています。***