最近は、サーバーサイド、インフラよりなお仕事が多め? そんな日々を過ごしています。
今、個人的に開発しているアプリのインフラとかで「やってきていないことにチャレンジしたいなー」と思い、
Docker、kubernetesを使ってみてます。
今日は、サクッと開発環境的な感じで、タイトルの通りの構成を作ってみました。
構成
リバースプロキシ:nginx
apiサーバー:go
DB:mysql
使っているもの
https://github.com/gin-gonic/gin
https://github.com/go-xorm/xorm
作っていく
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を使用しなくてもよくなったということですね。
といういことで以上です。
あっ、サンプルコードはここにあげてます。