1. ホーム
  2. 記事一覧
  3. DockerにGoでREST APIのTODOアプリを作るとDockerと仲良くなれる

2024.04.14

DockerにGoでREST APIのTODOアプリを作るとDockerと仲良くなれる

概要

Dockerは「学習コストが高い」と敬遠されがちですが、いざ触ってみると簡単に使えてしまう便利なツールです。

今回は、「Dockerを使ってみたいけどよくわからない」という人を対象に、

  • Docker上に
  • Goを使って
  • REST APIで操作する
  • TODOアプリケーション

を作成することで、Dockerの操作に慣れていきましょう。

(※便利なTODOアプリの作成ではなく、Dockerの理解を深めるための内容になっています。)

前提

  • Dockerインストール済み
  • Goを使える

※この記事ではWindowsを使用しています。コマンド等、Windows向けの内容なのでご注意ください。

Goアプリケーションの作成

まずはGoでローカル環境にTODOアプリを作成してみましょう。アプリがローカルで動作しないことにはコンテナ化もできません。

今回はGin Webフレームワークを使用してREST APIを構築します。

初期設定とパッケージを準備

todo-app フォルダ内にGoプロジェクトを作成し、Ginをインストールします。

mkdir todo-app
cd todo-app
go mod init todo-app
go get -u github.com/gin-gonic/gin

main.goの作成

todo-appフォルダ直下に main.goファイルを作成し、GETPOST に対する処理を書きます。

(※今回はDockerマスターになるのが目的なので、コードの解説は省略します。)

package main

import (
	"github.com/gin-gonic/gin"
)

type TodoItem struct {
	ID        string `json:"id"`
	Item      string `json:"item"`
	Completed bool   `json:"completed"`
}

var TodoItems = []TodoItem{}

func main() {
	router := gin.Default()

// TODOアイテムの取得
	router.GET("/todos", func(c *gin.Context) {
		c.IndentedJSON(200, TodoItems)
	})

// 新しいTODOアイテムの作成
	router.POST("/todos", func(c *gin.Context) {
		var newItem TodoItem
		if err := c.BindJSON(&newItem); err != nil {
			return
		}
		TodoItems = append(TodoItems, newItem)
		c.IndentedJSON(200, newItem)
	})

	router.Run(":8080")
}

現在のディレクトリ

todo-app
├─go.mod
├─go.sum 
└─main.go

ローカルで起動

簡単なTODOアプリが作成できたので、ローカルで動作確認してみましょう。

go run コマンドで起動します。

go run main.go

ファイアウォールに関する通知が出た場合は許可をクリック。

まずはタスクを1つだけ登録してみましょう。

以下のJSONデータを localhost:8080/todosにPOSTメソッドで送信してください。

(※APIのテストにはPostmanやcurlコマンドなど様々あるので好きな物を使用してください。)

{
  "id" : "1",
  "item" : "initial task"
}

postmanについてはこちらの記事で解説しています。 https://envader.plus/article/154

200が返ってきたので無事に登録できたようです。

POSTに対するレスポンス

ではlocalhost:8080/todosにGETメソッドを送信してタスク一覧を取得してみましょう。

bodyは空で構いません。

GETに対するレスポンス

200が返され、POSTで送信した3つのタスクが無事に表示されました。

Goアプリケーションの作成は以上です。

Dockerイメージの作成

次に、先ほど作ったGoアプリケーションをDockerでコンテナ化していきましょう。

Dockerfileを作成

まずはGoアプリケーションをDockerコンテナ化するためのDockerfileを作成します。

# Go 1.22のベースイメージを使用
# 注意 go.mod記載のversionと合わせる
# 軽量にするためalpineを使用
FROM golang:1.22-alpine

# コンテナ内の作業ディレクトリを/appに設定
WORKDIR /app

# ホストマシンからtodo-app内の全ファイルを、コンテナ内の作業ディレクトリ(/app)にコピー
COPY . ./

# go.modファイルに記載された依存パッケージをdownload
RUN go mod download

# main.goファイルをコンパイルして、実行ファイルを作成
RUN go build -o main /app/main.go

# コンテナの8080ポートを公開
EXPOSE 8080

# コンテナ起動後に、実行ファイルを実行
CMD /app/main

現在のディレクトリ

todo-app
├─Dockerfile
├─go.mod
├─go.sum 
└─main.go

Dockerイメージのビルド

以下のコマンドでDockerイメージをビルドしていきましょう。

(※Docker Desktopを起動した状態で行ってください。)

docker build -t todo-app .

以下のようなメッセージが出ればビルド成功です!

 ...
 => [5/5] RUN go build -o main /app/main.go   
 => exporting to image
 => => exporting layers
 => => writing image sha256:...
 => => naming to docker.io/library/todo-app

View build details: docker-desktop://dashboard/build/default/default/...

What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview

Dockerコンテナの実行

Dockerイメージが作成できたら、コンテナを起動してTODOアプリを実行しましょう。

以下のコマンドを実行してください。

docker run -p 8080:8080 todo-app

起動に成功したら先ほどと同じように動作確認しましょう。

以下のJSONデータを localhost:8080/todosにPOSTメソッドで送信してください。

{
  "id" : "1",
  "item" : "1st task"
}

200を返し、無事に登録できました!

いくつか登録した後、localhost:8080/todosにGETメソッドを送信し一覧を取得してください。

bodyは空で構いません。

200を返し、無事に一覧を取得できました!

さいごに

この記事では、DockerにGoでREST APIで操作するTODOアプリケーションを作成しました。

しかし、このアプリは最小限の機能しかないので、実際に使えるようにするにはさらなる改善が必要です。例えば、DELETE・PUTに対応させたり、DBコンテナを使ってデータを保持できるようにするなど、自由に機能を拡張することができます。

これを機にDockerを使ったアプリケーション開発にどんどん挑戦していきましょう!

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事

2020.02.25

完全未経験からエンジニアを目指す爆速勉強法

USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

  • キャリア・学習法
  • エンジニア

2024.04.30

Koa.jsの解説と導入ハンズオン Express.jsの後継フレームワーク

Koa.jsはその軽量性とモダンなJavaScriptの特性を活用する設計により、Web開発者に高いパフォーマンスと優れたエラー処理能力を提供し、注目を集めています。Express.jsの開発者により作られ、最小構成で柔軟性に富むオープンソースのNode.js用Webフレームワークです。

  • Node.js
  • ハンズオン
  • フレームワーク

2024.04.14

手を動かして身につける AWSでサーバレスのハンズオン

サーバレスコンピューティングの最大のメリットは、インフラの管理から解放されることです。開発者はサーバーのプロビジョニングや保守に関する心配をする必要がなく、アプリケーションのコードの作成とその実行に専念できます。より迅速にアプリケーションを市場に投入することが可能となり、イノベーションの速度を高めることができます。

  • AWS
  • ハンズオン

2024.03.19

初心者からステップアップ!Docker Compose応用ハンズオン

前回は「初心者でもサクッとできるDocker Composeハンズオン」でDocker Composeの基本を学びました。今回はさらに一歩踏み込み、Docker Composeを使った応用技術に目を向けます。ログの確認からデバッグ方法まで、効率的なトラブルシューティング技術を身に付けましょう。

  • ハンズオン
  • Docker