Introduction
2018年現在、ある程度docker
やその周辺技術についても使い方がまとまってきた感があるので、普段どのように開発を進めているかメモしておきたい。
なおここでは個人開発でどうやっているかについて書くが、業務でも似たようなアプローチではある(というかそれを真似した)。
対象ソフトウェア
ここでは主にgoでAPIサーバを書くような場合を想定している。もちろんそれ意外でも適用可能ではあるが、僕自身が最近それしか書いてないので他環境では見落としがあるかもしれない。
全体的な使用ツールなど
- ローカル
- 環境
- Macbook pro
- オーケストレーション
docker-compose
- 環境
- 開発/本番環境
- 環境
- GCP
- オーケストレーション
kubernetes
- 環境
- 共通
- docker registry
hub.docker.com
- CI
circle ci
- docker registry
ローカル環境
- go自体は普通に手元のランタイムを使用している
- dockerに載せても良いが考慮することが増えるし、goなら環境依存はほぼ無いのでこれで良しとしている
- MySQLやRedisなど、ミドルウェア関連をdocker-composeで立ち上げるようにしている
- 公式のものをそのまま使ってもいいが、migrationが必要なものは別途管理し、そのimageを使用している
- CIや本番環境用にdocker imageをローカルで作っている
- CI
- go runtimeと必要なら認証周りを入れたimage
- 認証など特別なものが必要無ければ公式のimageをそのまま使っている
- golang:1.10-alpine など
- 本番環境
- buildしたgo binaryをそのまま素のalpineに入れている
- セキュリティ上、go runtimeは入れない
- ここでも必要があれば認証に使うものがあれば入れている
- CI
参考までにCI用のアプリケーション/DB、本番環境用のDockerfileを紹介する
CI用
- アプリケーション
- CIで使用するdepを事前に導入したimageを作っている
FROM golang:1.10-alpine
RUN apk update && \
apk --no-cache add \
git \
make \
openssh
RUN go get -u github.com/golang/dep/cmd/dep
CMD "cat"
- DB
- migrationを適用するためにschema.sqlを用意して流している
- ちなみにmigrationにはhttps://github.com/rubenv/sql-migrateを使っている
FROM mysql:5.7
ENV MYSQL_ALLOW_EMPTY_PASSWORD=1 \
MYSQL_DATABASE=lumber
COPY schema.sql /docker-entrypoint-initdb.d/
本番(開発)環境用
- 何もないは正義なので素のalpineにバイナリコピーするだけ
- https://github.com/takashabe/lumber/blob/master/Dockerfile
FROM alpine:3.7
ADD release/lumber /
CMD ["/lumber"]
本番環境
- k8sにローカルで作ったimageを載せて動かす
- manifestは自分で書いたものも含めてhelm chart化して管理している
- DBなどpersistenceなものは特別な理由がなければマネージドサービスを使っている
- マネージドサービスの認証情報などは極力k8s secretを参照するようにし、リポジトリに残さないようにしている
今後やっていきたいこと
- git opsに合わせたCD環境を整えたい
- ただ単に後回しになっているだけだが、手元で
helm upgrade
叩く運用はさすがにちょっとツライ - ツールでいうと
Spinnaker
かJenkins X
あたりを追っている
- ただ単に後回しになっているだけだが、手元で
- 監視を整えたい
- 残念ながらこのブログを含めてほとんどトラフィックのないサービスしか持っていないのであまり問題になっていないが、監視はやはり必要
まとめ
コンテナを中心に最近の開発スタイルを紹介した。kubernetesは取っ付きづらさがあるが、運用が楽になるし、なにより面白いので手頃なところから使い始めると良いと思う。