Go言語のAPIを、Docker上で構築しよう。

以下の記事を見ながら、golangで作ったAPIをDocker上に作成する方法をまとめていきます。

Go言語自体の環境構築はこちらに、

Dockerの操作方法はこちらの記事にまとめています。

前提として、どちらもインストール済みとして、進めていきます。


以下、ファイル構成です。

今回は、Dockerfileとcompose.ymlファイルとを、どのように書いていくかの一例となります。

// 今回作成する、projectフォルダに移動します。github.com/アカウント名/プロジェクト名をそれぞれの値に置き換えてください。
$ cd $GOPATH/src/github.com/Akitsuyoshi/project
/*このプロジェクト内に、以下のファイル、フォルダを作成していきます。
api/Dockerfile  
api/server.go
api/controllers/product_controller.go
api/models/product.go
api/models/database.go
docker-compose.yml
*/

まずは、Dockerのcomposeファイルを作成します。アプリに必要なサービス(今回の場合はDBなど)を、ここで定義します。詳細はこちらに、あります。

docker-compose.yml

api:  
build: ./api
ports:
- 3000:3000
volumes:
- ./api:/go/src/github.com/{githubのユーザー名}/{プロジェクト名}/api
links:
- database
environment:
- DB_NAME={プロジェクト名}

database:
image: mongo:3.0
command: mongod --smallfiles --quiet --logpath=/dev/null

上の処理としては

  • ./apiフォルダから Dockerfile を探し、buildしてコンテナーをインスタンス化します。
  • また、コンテナーに、 volumes 設定で、指定のファイルにアクセスできるようにします。
  • アプリのポートを3000に設定し、 links 設定で、DBとアプリとをつなげます。(ここでのDBは、defaultでMongoDBになります)

このcomposeファイルのポイントとしては、linksフィールドでDBとの連携を行う点にあります。

次は、そのコンテナーを作成する基となる、 Dockerfile を見ていきます。

api/Dockerfile

FROM golang:latest

# Copy the local package files to the container’s workspace.
ADD . /go/src/github.com/{githubのユーザー名}/{プロジェクト名}/api

# Install our dependencies
RUN go get github.com/go-martini/martini
RUN go get github.com/martini-contrib/binding
RUN go get github.com/martini-contrib/render
RUN go get labix.org/v2/mgo
RUN go get labix.org/v2/mgo/bson

# Install api binary globally within container
RUN go install github.com/{githubのユーザー名}/{プロジェクト名}/api

# Set binary as entrypoint
ENTRYPOINT /go/bin/api

# Expose default port (3000)
EXPOSE 3000

上の処理内容は

  • ローカル上のapiフォルダを、コンテナーの作業スペースにコピーして渡しています。例えば、コンテナーの作業スペースを設定する場合は、 WORKDIR /api をこのファイルに加えます。
  • アプリに必要な依存性パッケージをインストールします。
  • ポート番号は3000を設定し、バイナリーをentrypointに設定します。
  • また、コンテナー内にバイナリーをインストールする為に、今回作成したAPIパッケージを入れます。例としては、 go install github.com/Akitsuyoshi/apiDocker/api のようにします。
    予め、作成したAPIをgithubにあげる必要がありますね。

また、以下4つのファイル(API)については、こちらのレポにpushしています。

api/server.go  
api/controllers/product_controller.go
api/models/product.go
api/models/database.go

以上が、Go言語で作ったapiを、Docker上に作成する方法になります。


参考リンク