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"}

動作確認完了!

Follow me!

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください