2018/10/25

MongoDBを使ったGo言語のAPIサービスでDocker Compose対応してみたʕ◔ϖ◔ʔ

TL;DR




段取り


以下のようにしますʕ◔ϖ◔ʔ
  1. API用のDockerfileを書く
  2. Docker ComposeでMongoDBのコンテナと連携する
  3. データの永続化とバックアップ方法を習得

API用のDockerfileを書く

コンテナ内でビルド

Go言語公式Dockerイメージの「Start a Go instance in your app」を読んで、以下のようなDockerfileを書きました。コンテナ内でビルドします。
FROM golang:1.11.1

WORKDIR /go/src/app
COPY . .

ENV DBaddr localhost
ENV Port :9000

RUN go get -d -v ./...
RUN go install -v ./...

CMD ["app", "-dbaddr=$DBaddr", "-addr=$Port"]

コマンド引数は環境変数で渡す

MongoDBのアドレスやWebAPIのポート番号を引数で指定します。ENVを使って指定することにしました。
ENV DBaddr localhost
ENV Port :9000

Docker ComposeでMongoDBのコンテナと連携する

linkでコンテナ同士をつなごう

まず、MongoDBのコンテナをmongodbという名前でdocker-compose.ymlファイルに記述します。
version: '3'
services:
  mongodb:
    image: mongo

次に、APIサービスにdbapiという名前をつけて追加します。
Dockerfileを使ったビルドとmongodbとの連携、mongodbを先に実行することなどを指定しています。
version: '3'
services:
  dbapi:
    build: .
    links:
      - mongodb
    depends_on:
      - mongodb
  mongodb:
    image: mongo

データの永続化とバックアップ方法

データはvolumeに保存

やっぱりデータを貯めて取り出すAPIなので、失わないよう永続化した上でバックアップもとりたいです。Dockerコンテナにおけるデータの永続化については、docker docsの「Manage application data」ページを読んで勉強しました。

docker-compose.ymlservicesと並ぶ形でvolumesを記述して、mongodataという名前でvolumeを作り、mongodbに紐づけました。
version: '3'
services:

  dbapi:
    build: .
    ports:
      - 9000:9000
    links:
      - mongodb
    depends_on:
      - mongodb
    command: app -dbaddr=mongodb -addr=:9000
  mongodb:
    image: mongo
    container_name: mongodb
    volumes:
      - mongodata
volumes:
  mongodata:
    driver: local

コンテナを使ってvolumeの内容をバックアップ

Manage application data」の最後の方に「Backup, restore, or migrate data volumes」という節があり、ubuntuコンテナを使ってのバックアップとリストア方法が示されています。

この手順を粛々と実行しても良かったのですが、今回はたまたま見つけた@kiviewさんのdocker_volume_backup.shを使ってバックアップをしてみます。コンテナの停止、バックアップの作成、コンテナの起動という一連の操作をやってくれて、楽ちん感があって好きです(`・ω・´)b

まずはダウンロードして実行権限の付与です。
wget https://gist.github.com/kiview/5ff58ed69366e2d591d19ac34d8f8616/raw/c4ec3efbd0669bae5daeb59f4bb13c8b5d0974e9/docker_volume_backup.sh
chmod +x docker_volume_backup.sh

バックアップを保存するbackupディレクトリを作って書き込み権限を付与し、実行します。
mkdir backup
chmod +w backup
./docker_volume_backup.sh docker-compose.yml mongodata $PWD/backup/

うわぁあい、ちゃんとtarボールができてますね!
ʕ◔ϖ◔ʔ >  ls backup/
db-api_mongodata.tar

0 件のコメント: