😺

【Golang】GoのHttpServerをDockerで起動する

2023/08/19に公開

dockerからgoのhttp serverを立てるコードの例と、ポイントを解説します。
goのクマって虫コナーズのクマに似てますよね

ディレクトリ構成

最終的なディレクトリ構成は下記のようになりました

構成自体は、下記のStandard Go Project Layoutを参考にしています。

https://github.com/golang-standards/project-layout/blob/master/README.md

Docker

docker-compose.yml

goを動かすappコンテナと、mysqlを動かすdbコンテナを立てます。

version: "3"
services:
  app:
    container_name: go_container
    build:
      context: ./app
    ports:
      - 8080:8080
    tty: true
    volumes:
      - ./app:/go/src/app

  db:
    container_name: go_db_container
    image: mysql:8.0
    ports:
      - 3307:3307
    volumes:
      - go-db-volume:/var/lib/mysql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      MYSQL_USER: ${USER}
      MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}
      MYSQL_PASSWORD: ${PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
volumes:
  go-db-volume:

Dockerfile

ポイントを番号を振って下で解説しています。

FROM golang:1.20-bullseye

# 1
ENV ROOT=/go/src/app

WORKDIR ${ROOT}

# 2
RUN apt update \
    && apt clean \
    && rm -r /var/lib/apt/lists/*

RUN apt install git && \
    apt install curl

# 3
COPY go.mod go.sum ./

# 4
RUN go mod download
 # 5
RUN go get -u github.com/go-sql-driver/mysql

COPY . .

EXPOSE 8080

# 6
CMD ["go", "run", "main.go"]
  1. ENV ROOTを設定しないとコンテナ内でpermission errorが出るので設定
  2. apt cleanしないとbuild時にwarningが出る
  3. go mod downloadの実行に必要なファイルをローカルからコピー
  4. go module(依存関係の解決に必要)をコンテナ内でダウンロード
  5. mysqlとgoの接続に必要なパッケージをインストール
  6. コンテナ内のmain.goでhttp serverを設定し、go runで実行

Go

main.go

main.goファイルでhttp serverを設定し、Dockerfileから実行することでコンテナを起動する

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "hello golang")
	})

	http.ListenAndServe(":8080", nil)
}

サーバの立ち上げが確認できました。

Discussion