サーバサイドGo+Beego,クライアントはwebpackを使用するためにnodeを使います。
また、今回は後々のサービス展開のためにユーザの認可サーバを別途用意することとしました。
PostgreSQL
本番環境ではおそらくAWSのRDSを使用しますが、開発環境上ではDockerで提供する。
各自がホストOSにインストールすると後々困ることになるのでDocker上で稼働させる。
Go(言語)
あくまでも開発用の環境。将来的にはdockerコンテナごとサーバにデプロイしたい。
各自がホストOSにインストールすると後々困ることになるのでDocker上で稼働させる。
RunやBuildはゲストOSに対してシェルログインして行うことになる。
Node(npm)
Javascriptやcss、htmlをコンパイル、トランスパイルする環境。
各自がホストOSにインストールすると後々困ることになるのでDocker上で稼働させる。
ファイル監視や自動BuildはゲストOSに対してシェルログインして行うことになる。
KeyCloak(認可サーバ)
今回企画しているサービスはいわゆるマイクロサービスという位置づけになりそう。
今後サブシステムを増やす予定でもあるため、認可機能はアプリケーション上に構築しない。
(OpenID, GSuite, SAMLを対応予定)
Docker構成ファイル
docker-compose.ymlはプロジェクトの直下に配置、仮想マシンの定義ファイル等は.dockerへ配置することとした。
# Base image is in https://registry.hub.docker.com/_/golang/
# Refer to https://blog.golang.org/docker for usage
FROM golang:1.10.3-alpine3.7
ENV GOPATH $GOPATH:/go/src
RUN apk update && \
apk add --update git && \
rm -rf /var/cache/apk/*
RUN go get -u github.com/golang/dep/cmd/dep
EXPOSE 9000
Go環境はイメージにAlpineを使用します(軽量だから)。
サードパーティはdepにて管理しますのでGitを追加後、go getにてdepをインストールします。
この後はBeegoを使う予定なので、depで依存性を管理しながら開発を進めることになる。
# Base image is in https://registry.hub.docker.com/_/golang/
# Refer to https://blog.golang.org/docker for usage
FROM node:8.11.3-alpine
RUN mkdir /src
RUN apk update && \
apk add --update git && \
rm -rf /var/cache/apk/*
Node環境も同じAlpineを使用。
NPMを利用するのが目的なのでGitだけパッケージ追加します。
version: '3'
services:
web: # サーバサイド(Go)
build: .docker/golang # Dockerfileへのパス
volumes:
- ./src:/go/src/saaslab # マウントするソース
ports:
- 9000:9000 # beegoは9000を使って稼動予定
tty: true # これをいれておかないと仮想マシンが停止する
links:
- postgres:postgres # goからpostgresへアクセス
- keycloak:keycloak # goからkeycloakへアクセス
client: # クライアント(NPM)
build: .docker/node # Dockerfileへのパス
volumes:
- ./src:/src # マウントするソース(Goも一緒)
tty: true
keycloak: # 認可サーバ
image: jboss/keycloak # keycloakの最新イメージ
environment:
KEYCLOAK_USER: admin # keycloakの管理者ユーザ
KEYCLOAK_PASSWORD: admin # keycloakの管理者パスワード
DB_VENDOR: POSTGRES # postgresイメージを参照
DB_ADDR: postgres # 定義したpostgresに合わせる
DB_DATABASE: keycloak # 認可データベース
DB_USER: postgres # 定義したpostgresに合わせる
DB_PASSWORD: postgres # 定義したpostgresに合わせる
ports:
- 8080:8080 # 8080ポートで稼働
depends_on:
- postgres # postgresに依存
postgres: # DB
image: postgres # postgresの最新イメージ使用
environment:
POSTGRES_USER: postgres # user
POSTGRES_PASSWORD: postgres # pass
ports:
- "5432:5432" # お決まりポート
volumes:
- asp-db:/var/lib/postgresql/data # データのマウント箇所
- ./.docker/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d # 初期実行するSQL置き場
volumes:
asp-db: # db用のボリューム
src: # ソース用のボリューム
driver_opts:
type: none
device: ./src # PJ上のsrc
o: bind
使い方
# docker-compose.ymlがあるディレクトリで
$ docker-compose up -d
Starting asp_postgres_1 ... done
Starting asp_client_1 ... done
Starting asp_keycloak_1 ... done
Starting asp_web_1 ... done
すると、こんな感じに仮想マシンがにょきにょき立ち上がる(初回はイメージのダウンロードがあるので、ちょっと時間がかかります)
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2bfcc6c2f598 asp_web "/bin/sh" 24 hours ago Up 35 seconds 0.0.0.0:9000->9000/tcp asp_web_1
a8bc0bd4b64e jboss/keycloak "/opt/jboss/docker-e…" 24 hours ago Up 35 seconds 0.0.0.0:8080->8080/tcp asp_keycloak_1
f033071912c4 postgres "docker-entrypoint.s…" 24 hours ago Up 36 seconds 0.0.0.0:5432->5432/tcp asp_postgres_1
7a0b9cab1c44 asp_client "node" 24 hours ago Up 36 seconds asp_client_1
仮想マシンの起動状況です。
他、コマンドのおさらい。
$ docker volume ls # ボリューム状況
DRIVER VOLUME NAME
local asp_asp-db
local asp_auth
local asp_src
$ docker volume rm asp_auth # ボリューム削除
asp_auth
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
asp_client latest 55c706333e88 25 hours ago 89.6MB # node環境
node 8.11.3-alpine dd574b216ad7 2 days ago 68MB # asp_clientの元
jboss/keycloak latest b244ccfe3a8a 3 days ago 727MB # keycloak
asp_web latest b1a421838f7a 9 days ago 434MB # npm環境
golang 1.10.3-alpine3.7 c4b5d89b27f4 2 weeks ago 376MB # go環境
postgres latest 61d053fc271c 4 weeks ago 236MB # postgres
$ docker-compose stop # 仮想マシン停止するが消さない
$ docker-compose down # 仮想マシン削除する(もup -dですぐ立ち上がる)
Stopping asp_web_1 ... done
Stopping asp_keycloak_1 ... done
Stopping asp_postgres_1 ... done
Stopping asp_client_1 ... done
Removing asp_web_1 ... done
Removing asp_keycloak_1 ... done
Removing asp_postgres_1 ... done
Removing asp_client_1 ... done
Removing network asp_default
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker-compose.exe up -d
Creating network "asp_default" with the default driver
Creating volume "asp_auth" with default driver
Creating asp_postgres_1 ... done
Creating asp_client_1 ... done
Creating asp_keycloak_1 ... done
Creating asp_web_1 ... done
GoやNodeの仮想マシンに入る場合は
$ docker exec -it asp_web_1 sh
/go # go version
go version go1.10.3 linux/amd64
/go # dep version
dep:
version : devel
build date :
git hash :
go version : go1.10.3
go compiler : gc
platform : linux/amd64
features : ImportDuringSolve=false
/go #
ここ2週間、dockerの記事調べまくったけど、開発環境であればこのぐらいが使いやすいと思た。
プラットフォームを固定するのが目的ですしね。
次はBeegoでKeycloakと認可させたり、AWSにActiveDirectory立ち上げてSAML認証させたり。
(ここ数年の取り組みで認可が一番ハードル高い気がする。つい先日もOpenIDの仕様ちゃんと勉強できてたら無駄にあーだこーだする必要もなかったという、、、
セキュリティ難しい > <)