カテゴリー: BackEnd

軽量なAlpine Linuxイメージでgitbookのローカル環境を構築する

はじめに

前回の記事でご紹介したgitbookですが、環境構築の方法はローカルに直接node.jsを入れるものでした。できればローカル環境は汚さず、Dockerで構築できるに越したことはない…と考えておりました。

ググってみると`billryan/gitbook`というイメージが公開されており、`Dockerfile`や`docker-compose.yml`を一切書かず、dockerコマンドをコピペ実行するだけでgitbookを動かすことができます。
ただこのイメージは1.34GBとそこそこ容量を食うため「試すだけなら最小限のリソースで!」→「`Alpine Linux`で何とかできないかな?」と思い立ち、試してみました。

Alpine Linuxとは

  • 超軽量なLinuxディストリビューションです。とにかく容量が小さく、OS最小構成だと5MB(!)を下回ります。CentOSの最新版が約200MBですから、圧倒的な差です。
  • Docker用というわけではありませんが、その軽量っぷりでDocker界隈では人気のようです。
  • 今回は出てきませんが、`apk`という独自のパッケージ管理システムを使います。

Docker本体のインストール

環境はmacOS High Sierra 10.13.6を前提としています。すでにDockerがPCにインストール済みであれば、この項目は読み飛ばしてください。

インストール手順は簡単です。Docker公式でdmgファイルをダウンロードして実行するだけです(ダウンロードの際、アカウント作成が必要になります)。
インストール完了したらターミナルで確認しましょう。

$ docker version
Client:
 Version:      18.03.1-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   9ee9f40
 Built:        Thu Apr 26 07:13:02 2018
 OS/Arch:      darwin/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.03.1-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.5
  Git commit:   9ee9f40
  Built:        Thu Apr 26 07:22:38 2018
  OS/Arch:      linux/amd64
  Experimental: true

サンプルリポジトリのダウンロード

まっさらな状態のGitbookに1ファイルだけ追加したリポジトリを作成しました。ローカルに適当なディレクトリを作成し、その中で実行してください。

$ mkdir ~/test && cd ~/test
git clone https://github.com/keitavic/gitbook-sample.git
Cloning into 'gitbook-sample'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 7 (delta 0), reused 7 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.

$ ls -l
-rw-r--r--  1 nomura  staff  171  9 18 23:54 Dockerfile
-rw-r--r--  1 nomura  staff   16  9 18 23:54 README.md
-rw-r--r--  1 nomura  staff   69  9 18 23:54 SUMMARY.md
-rw-r--r--  1 nomura  staff  106  9 18 23:54 test.md

dockerイメージ作成

公開されているAlpine Linuxイメージから、node.js用のイメージを取得してビルドします。`vi ~/test/gitbook-sample/Dockerfile`でDockerfileを作成し、以下のように記述してください。

FROM node:8.12.0-alpine
RUN gitbook fetch latest
RUN npm install -g gitbook-cli
ENV BOOKDIR /gitbook
VOLUME $BOOKDIR
EXPOSE 4000
WORKDIR $BOOKDIR
CMD ["gitbook", "--help"]
$ docker build ./ -t node:8.12.0-alpine
Sending build context to Docker daemon  1.328MB
Step 1/8 : FROM node:8.12.0-alpine
...
...
Successfully tagged node:8.12.0-alpine

# 確認
$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
node                  8.12.0-alpine       a9952732684f        4 seconds ago       342MB

Node.js用のAlpine Linuxイメージが追加されました。サイズは342MBで、最小構成の5GB未満と比べるとさすがに容量が増えていますが、`billryan/gitbook`に比べて4分の1程度に抑えることができました。

Gitbook初期化&実行

initからserveまでを実行します。

$ docker run -it -v "$PWD:/gitbook" -p 4000:4000 node:8.12.0-alpine gitbook init
info: create SUMMARY.md
info: initialization is finished

$ docker run -it -v "$PWD:/gitbook" -p 4000:4000 node:8.12.0-alpine gitbook install
info: nothing to install!

$ docker run -it -v "$PWD:/gitbook" -p 4000:4000 node:8.12.0-alpine gitbook build
info: 7 plugins are installed
...
...
info: >> generation finished with success in 0.6s !

$ docker run -it -v "$PWD:/gitbook" -p 4000:4000 node:8.12.0-alpine gitbook serve
Live reload server started on port: 35729
...
...
Serving book on http://localhost:4000

ここまで成功すれば、ブラウザで閲覧できる状態になります。ターミナルに出力されている`http://localhost:4000`にアクセスしてみましょう。

Dockerの状態確認、停止など

上記のコマンドで起動はできていますが、`Serving book on http://localhost:4000`のまま`CTRL+C`も受け付けない状態になっていると思います。
ターミナルを別ウィンドウで立ち上げて、Dockerの状態を確認してみましょう。

# 起動しているコンテナを表示
# CONTAINER IDとNAMESはコンテナ起動ごとに異なる値が割り振られます
$ docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED              STATUS              PORTS                    NAMES
2160abebbf9f        node:8.12.0-alpine   "gitbook serve"     About a minute ago   Up 2 minutes        0.0.0.0:4000->4000/tcp   reverent_hypatia

# 停止はCONTAINER IDもしくはNAMESを指定する
$ docker stop 2160abebbf9f
$ docker stop reverent_hypatia

# dockerコンテナをバックグラウンドで起動
$ docker run -d -it -v "$PWD:/gitbook" -p 4000:4000 node:8.12.0-alpine gitbook serve

さいごに

いかがでしたでしょうか。Dockerfileやdocker-compose.ymlを細かく設定して、いかにイメージの容量を削るかを目指す場合もあるようですが、今回はなるべく軽量・なるべく簡素を目標としてみました。
Dockerには最近触れ始めたばかりですが、すでにバックエンドの技術としてはデファクトスタンダードになっているらしく、少し危機感を覚えています。引き続き学習し、実用に持っていきたいと思います。

参考

nomura

シェア
執筆者:
nomura
タグ: Dockergitbook

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前