概要
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
ファイルを作成し、GET
と POST
に対する処理を書きます。
(※今回は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を学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.06.23
【Terraformハンズオン】AWS SNSの基本とメール通知を実践してみよう
こちらの記事では、Amazon SNSの基本を解説し、Terraformを使ったハンズオンを行います。
- AWS
- ハンズオン
2024.04.26
ECSで実現するコンテナデプロイメント AWS DOP試験対策にも
AWS DOP試験合格を目指す方や、ECSによるCICDに興味のある方へ。このハンズオン記事では、CodePipelineとECSを活用したコンテナデプロイメントを実際に実践することで、試験対策と技術習得を同時に実現します。
- AWS
- ハンズオン
- 資格
2024.04.30
Koa.jsの解説と導入ハンズオン Express.jsの後継フレームワーク
Koa.jsはその軽量性とモダンなJavaScriptの特性を活用する設計により、Web開発者に高いパフォーマンスと優れたエラー処理能力を提供し、注目を集めています。Express.jsの開発者により作られ、最小構成で柔軟性に富むオープンソースのNode.js用Webフレームワークです。
- Node.js
- ハンズオン
- フレームワーク