はじめに
前回の記事でご紹介した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 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ファイルだけ追加したリポジトリを作成しました。ローカルに適当なディレクトリを作成し、その中で実行してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 | $ 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を作成し、以下のように記述してください。
1 2 3 4 5 6 7 8 | 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"] |
1 2 3 4 5 6 7 8 9 10 11 | $ 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までを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $ 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の状態を確認してみましょう。
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" 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には最近触れ始めたばかりですが、すでにバックエンドの技術としてはデファクトスタンダードになっているらしく、少し危機感を覚えています。引き続き学習し、実用に持っていきたいと思います。