はじめに
前回の記事でご紹介した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ファイルをダウンロードして実行するだけです(ダウンロードの際、アカウント作成が必要になります)。
インストール完了したらターミナルで確認しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $docker version Client: Version: 18.03.1-ce API version: 1.37 Go version: go1.9.5 Git commit: 9ee9f40 Built: Thu Apr2607:13:022018 OS/Arch: darwin/amd64 Experimental:false Orchestrator:swarm Server: Engine: Version: 18.03.1-ce API version: 1.37(minimum version1.12) Go version: go1.9.5 Git commit: 9ee9f40 Built: Thu Apr2607:22:382018 OS/Arch: linux/amd64 Experimental:true |
サンプルリポジトリのダウンロード
まっさらな状態のGitbookに1ファイルだけ追加したリポジトリを作成しました。ローカルに適当なディレクトリを作成し、その中で実行してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 | $mkdir~/test&&cd~/test git clonehttps://github.com/keitavic/gitbook-sample.git Cloning into'gitbook-sample'... remote:Counting objects:7,done. remote:Compressing objects:100%(5/5),done. remote:Total7(delta0),reused7(delta0),pack-reused0 Unpacking objects:100%(7/7),done. $ls-l -rw-r--r-- 1nomura staff 171 91823:54Dockerfile -rw-r--r-- 1nomura staff 16 91823:54README.md -rw-r--r-- 1nomura staff 69 91823:54SUMMARY.md -rw-r--r-- 1nomura staff 106 91823:54test.md |
dockerイメージ作成
公開されているAlpine Linuxイメージから、node.js用のイメージを取得してビルドします。vi ~/test/gitbook-sample/Dockerfile
でDockerfileを作成し、以下のように記述してください。
1 2 3 4 5 6 7 8 | FROM node:8.12.0-alpine RUN gitbook fetch latest RUN npm install-ggitbook-cli ENV BOOKDIR/gitbook VOLUME$BOOKDIR EXPOSE4000 WORKDIR$BOOKDIR CMD["gitbook","--help"] |
1 2 3 4 5 6 7 8 9 10 11 | $docker build./-tnode:8.12.0-alpine Sending build context toDocker daemon 1.328MB Step1/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 4seconds ago 342MB |
Node.js用のAlpine Linuxイメージが追加されました。サイズは342MBで、最小構成の5GB未満と比べるとさすがに容量が増えていますが、billryan/gitbook
に比べて4分の1程度に抑えることができました。
Gitbook初期化&実行
initからserveまでを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $docker run-it-v"$PWD:/gitbook"-p4000:4000node:8.12.0-alpine gitbook init info:create SUMMARY.md info:initialization isfinished $docker run-it-v"$PWD:/gitbook"-p4000:4000node:8.12.0-alpine gitbook install info:nothing toinstall! $docker run-it-v"$PWD:/gitbook"-p4000:4000node:8.12.0-alpine gitbook build info:7plugins are installed ... ... info:>>generation finished with success in0.6s! $docker run-it-v"$PWD:/gitbook"-p4000:4000node: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の状態を確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 | # 起動しているコンテナを表示 # CONTAINER IDとNAMESはコンテナ起動ごとに異なる値が割り振られます $docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2160abebbf9f node:8.12.0-alpine "gitbook serve" Aboutaminute ago Up2minutes 0.0.0.0:4000->4000/tcp reverent_hypatia # 停止はCONTAINER IDもしくはNAMESを指定する $docker stop2160abebbf9f $docker stop reverent_hypatia # dockerコンテナをバックグラウンドで起動 $docker run-d-it-v"$PWD:/gitbook"-p4000:4000node:8.12.0-alpine gitbook serve |
さいごに
いかがでしたでしょうか。Dockerfileやdocker-compose.ymlを細かく設定して、いかにイメージの容量を削るかを目指す場合もあるようですが、今回はなるべく軽量・なるべく簡素を目標としてみました。
Dockerには最近触れ始めたばかりですが、すでにバックエンドの技術としてはデファクトスタンダードになっているらしく、少し危機感を覚えています。引き続き学習し、実用に持っていきたいと思います。