Go
golang
Docker
docker-compose
docker-machine

GoとNginxコンテナを連携させ、そして中でgodoでファイル監視してgojiを使った開発を行えるようにした。

More than 3 years have passed since last update.

以前書いた、http://qiita.com/shinofara/items/3bf0e88ba889364c5059のパワーアップ版です。


事前準備


必要な物


dockerのhost環境をvirtualboxで作成

今回はdocker-machine を利用

dockerのhost作成

$ docker-machine create -d virtualbox dev

INFO[0000] Creating SSH key...
INFO[0000] Creating VirtualBox VM...
INFO[0009] Starting VirtualBox VM...
INFO[0009] Waiting for VM to start...
INFO[0056] "dev" has been created and is now the active machine.

確認

$ docker-machine ls

NAME ACTIVE DRIVER STATE URL SWARM
dev * virtualbox Running tcp://192.168.99.100:2376

dockerコマンドも確認

$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

当然なにもない


サンプルをクローン

サンプルはこのリポジトリですが

$ git clone https://github.com/shinofara/golang-web-application.git

$ golang-web-application


Containerを立ち上げる

build an image for your code, and start everything up

ビルドして、そして全部立ち上げます。

$ docker-compose up -d

Recreating demo_go_1...
Recreating demo_nginx_1...
Attaching to golangwebapplication_go_1, golangwebapplication_nginx_1

最後にgoをnginxにアタッチと出てます。

これはnginxコンテナにgoコンテナをリンク付けした感じです


確認してみましょう

$ curl -l http://<docker host serverのIP>/hello/world

Hello World !


編集してみましょう

vimなどでmain.goを編集してください。

- fmt.Fprintf(w, "Hello, %s!", c.URLParams["name"])

+ fmt.Fprintf(w, "Hello 2, %s!", c.URLParams["name"])

編集したら保存しましょう。閉じちゃってもOKです。


確認してみましょう

$ curl -l http://<docker host serverのIP>/hello/world

Hello 2 World !


更新されましたか?

コンテナ内のgoはgo run 状態であるはずなのに、なぜ?

それは、goコンテナ内ではgo run ではなく、godo が実行状態にあるからです。

godo は、gruntのようなものでファイルの変更を検知して、様々なtasksを実行してくれます。

このコンテナではgo run main.goを再実行する様に定義しています。

なのでmain.go の変更を検知して、内部でgo run main.go を再実行してくれたのです。


最後に

ここまでで


  1. Nginxコンテナ作成

  2. Go FCGIコンテナ作成

  3. GoのWAFであるgojiの導入

  4. ファイルの更新を検知しするタスクランナーgodoの導入

といった4つの事が出来るようになりました。

あとはMysqlコンテナを作って連携すればひと通りのWEBサービス開発を行える状態になりそうです。

作成したコード一式

https://github.com/shinofara/golang-web-application/tree/goji