TL;DR
- IoT機器のデータをWeb API経由でDBに保存するサービスを作った
- MongoDBを使ってる
- ビルドもデプロイも手動で、起動するまでが面倒だった
- Docker ComposeでMongoDBと一緒に一発起動できるようにする!
- データの永続化と、バックアップ方法を習得する!
段取り
以下のようにしますʕ◔ϖ◔ʔ
- API用のDockerfileを書く
- Docker ComposeでMongoDBのコンテナと連携する
- データの永続化とバックアップ方法を習得
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.ymlにservicesと並ぶ形で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 件のコメント:
コメントを投稿