DockerでPostgres, Go, Node, Keycloakの環境を整えた話

DockerでPostgres, Go, Node, Keycloakの環境を整えた話

サーバサイド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の仕様ちゃんと勉強できてたら無駄にあーだこーだする必要もなかったという、、、
セキュリティ難しい > <)

ソリューション開発室カテゴリの最新記事