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を使ったアプリケーション開発にどんどん挑戦していきましょう!

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

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

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

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

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

関連記事