go + ginをdockerで起動してみる
目次
dockerのインストール
初期設定ではdockerがインストールされていなかったのでdockerをインストール
$ sudo snap install docker
# dockerの起動をsudoなしでできるようにする
$ sudo groupadd docker
$ sudo gpasswd -a $USER docker
# dockerサービスの再起動
$ sudo systemctl restart docker
Failed to restart docker.service: Unit docker.service not found.
# エラーになった
$ sudo systemctl restart snap.docker.dockerd
# 成功
※snapでインストールした場合、サービスの再起動等のサービス名が異なる
goのインストール
go本体をダウンロードしインストール
$ wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gz
$ rm go1.22.2.linux-amd64.tar.gz
$ mkdir ~/go
$ vi ~/.profile
# 下記を追加
GOPATH=$HOME/go
PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
$ source ~/.profile
$ go version
go version go1.22.2 linux/amd64
各ファイルを配置
ディレクトリの構成は下記になります。
project
- go
- src
- main.go
- .go_env
- Dockerfile
- docker-compose.yaml
go/src/main.go
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello World",
})
})
router.Run(":8081")
}
go/Dockerfile
FROM golang:1.22.2-alpine
RUN apk update && apk add git
WORKDIR /go/src
docker-compose.yaml
version: "3"
services:
app:
container_name: go-api
build:
context: .
dockerfile: ./go/Dockerfile
tty: true
volumes:
- ./go/src:/go/src
env_file:
- ./go/.go_env
ports:
- 8081:8081
Docker起動
$ docker-compose up -d
コンテナの中に入ります
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5dd3736db4b3 golo-app "/bin/sh" 2 minutes ago Up 2 minutes 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp go-api
$ docker exec -it go-api sh
/go/src #
接続できました!初期化、ginインストール
/go/src # go mod init golo
/go/src # go get -u github.com/gin-gonic/gin
起動
/go/src # go run main.go
別ターミナルでリクエスト送信
$ curl http://localhost:8081
{"message":"Hello World"}
動作確認完了!