[Go] Dockerを使ってGoでRESTサーバを作成する

手元の環境を汚さずに環境を構築していろいろ試したいです。
Dokcerを使えばできるんだろうとは思っていましたが、実際に行うと色々わからない事が多々ありました。
何とかやりたい事ができたので、私の行った方法を紹介します。

やりたい事

  • Goを使ってRESTサーバを構築する。(echoを使う)
  • 手元の環境を汚さない(デプロイを意識して)Dockerを使って構築する。
  • SQLはPostgreSQLを使う(Goからのアクセスはgoreを使う)
  • Goのコードはホットリロードできるようにする

構築方法

Goを動作させるアプリケーションサーバと、SQL(PostgreSQL)のサーバとDockerのコンテナを2つ使います。

ファイル構成

以下のファイル構成で作成しました。

├── README.md
├── docker
│   └── app
│       └── Dockerfile    アプリケーションサーバのDokcerfile
├── docker-compose.yml
├── go.mod
├── go.sum
└── main.go                アプリケーションサーバのコード

Goを動作させるコンテナの定義はDockerfileに定義しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FROM golang:1.14.11-alpine3.12
 
WORKDIR /go/src/app
 
ENV GO111MODULE=on
 
RUN apk add --no-cache \
            alpine-sdk \
            git
 
# ホットリロード用
RUN go get github.com/pilu/fresh
 
# Goのライブラリを追加する
RUN go get github.com/lib/pq
RUN go get github.com/go-gorp/gorp
RUN go get github.com/labstack/echo
 
EXPOSE 8080
 
CMD ["fresh"]

Goを動作させるのに必要なライブラリをインストールしています。
DBにはgorpを使ってアクセスし、ドライバーはpqを使います。

docker-compose.ymlは以下のように定義しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3'
services:
  app:
    build: docker/app
    volumes:
      - ./:/go/src/app
    ports:
      - "8080:8080"
    tty: true
    environment:
    links:
      - db:database
 
  db:
    image: postgres:10.1
    ports:
      - "5432:5432"
    environment:
      - "POSTGRES_USER=user1"
      - "POSTGRES_PASSWORD=password"
      - "POSTGRES_DB=testdb"

docker-composeは全く詳しくはないので、いろいろな情報を調べて作成しました。
ポイントは、appサーバの定義にlinksと定義がある点です。
linksと定義しておくと、他のコンテナにアクセスできるようになります。
DSNでlinksで定義した情報を使ってアクセスするようにenvironmentに記述しています。
(これが分からなくてGoのコンテナからSQLサーバにアクセスできなくてハマりました)

go.modを作成するためにgo mod initを実行する必要があるのですが、GOROOTの下にプロジェクトを作成していない場合は適当なパッケージのパスを渡す必要があります。

$ got mod init github.com/k28/hogehoge

これも知らないとハマるので注意です。

ソースコード

  • Githubで公開しています。

参考URL

0 件のコメント :

コメントを投稿