記録。

めも。

docker-composeでnginx+go+mysqlの一式を作る

最近は、サーバーサイド、インフラよりなお仕事が多め? そんな日々を過ごしています。

今、個人的に開発しているアプリのインフラとかで「やってきていないことにチャレンジしたいなー」と思い、
Docker、kubernetesを使ってみてます。

今日は、サクッと開発環境的な感じで、タイトルの通りの構成を作ってみました。

構成

リバースプロキシ:nginx
apiサーバー:go
DB:mysql

使っているもの

  • nginx
  • mysql
  • gin(webフレームワーク)
  • xorm(ORM)
  • go-sql-driver/mysql

https://github.com/gin-gonic/gin

https://github.com/go-xorm/xorm

GitHub - go-sql-driver/mysql: Go MySQL Driver is a MySQL driver for Go's (golang) database/sql package

作っていく

apiサーバー

とりあえず、mysqlにつなげれられればいいや程度で作りました。
簡単に、userの情報をDBに突っ込むだけの処理を書いてます。

main.go

// ルーティング
func main() {
  router := gin.Default()

  v1 := router.Group("api/v1")
  {
    v1.POST("/user", users.Register)
  }

  router.Run(":9000")
}

users.go

//ユーザー情報の構造体
type Users struct {
    ID            int         `xorm:"id"`
    Name     string    `xorm:"name"`
    Email      string    `xorm:"email"`
}

//DBに情報を登録
func SignIn(c *gin.Context) {
 
        //dcoker-composeの名前解決の仕組みでmysqlにつなぐことができます。
    engine, _ := xorm.NewEngine("mysql", "test:test@tcp(db:3306)/test")

        name := c.Query("name")
        mail := c.Query("mail")

    user := Users{Name: name, Email: mail}

    _, err := engine.Insert(&user)

    if err == nil {
        c.JSON(http.StatusOK, gin.H{
            "status":  "success",
            "message": "success register user",
        })
                 return 
    } 
}

リバースプロキシ(nginx)

最終的にDockerfileにまとめています。
必要な情報だけdefualt.confにまとめています。

default.conf

server {
    listen 80;
    server_name localhost;

    location / {
        ## docker-compose.ymlのserviceでapiサーバーをwebとしている
        ## 9000のポートを開いている
        proxy_pass http://web:9000;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Dockerfile

FROM nginx:latest

COPY ./default.conf /etc/nginx/conf.d/default.conf

DB(mysql

docker-compose.yml内で、imageも環境変数もしているため、特に何もしていません。

compose作成

こんなdocker-compose.ymlになりました

version: "3"

services:
  db:
    image: mysql:5.7.22
    restart: always
    ports:
      - 3306:3306
    volumes:
      - ./mysql:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_DATABASE: test

  web:
    build: .
    ports:
      - 9000:9000
    depends_on:
      - db

  proxy:
    build: nginx/.
    ports:
      - 8000:80
    depends_on:
      - web

少しハマったところとしては、depends_onを最初書いておらず、 作成順序がおかしくなり、DBに接続できないことがありました。

docker-compose depends_onとlinksの違い - Qiita

Control startup and shutdown order in Compose | Docker Documentation

上記を参考にしました。 linksとdepends_onの違いが腹落ちしました。

depends_on => コンテナの立ち上がり順を制御(ただし、本当にそのサービスが準備完了ってところまでは、待ってくれない)
links => depends_on + 別のコンテナにエイリアス名でアクセスできるようにする(使用推奨されていない)

※linksは今後廃止されるそうなので、使用することが推奨されていないっぽいです。

docker-composeのversion2以降(たしか)は、networksを書かなくてもデフォルトでネットワークをはってくれるので、
特に何もせずに名前解決で繋げることができます。
それもあって以前まで、使用していたであろうlinksを使用しなくてもよくなったということですね。

といういことで以上です。

あっ、サンプルコードはここにあげてます。

GitHub - wakashiyo/compose-sample: docker compose sample