Dockerを使ってHackMDを動かしたのでやり方備忘録(Docker導入から) on Windows

## はじめに
タイトル通り、Dockerを使ってHackMD(CodiMD)をたので、そのやり方を主に自分が見返すように備忘録としておきたいと思います。
ちなみにこの記事もそれで書いてます。

## この記事が対象とする人
+ 自分
+ Docker for Windowsの導入がしたい人
+ HackMDが好きで自前で動かしてみたい人
+ 業務で社内専用のHackMDを使いたい人

## 環境

+ Windows 10 pro
+ Docker for Windows
+ Git for Windows

## Docker for Windowsを導入する
まず[こちら](https://docs.docker.com/docker-for-windows/)からDocker for Windowsのインストーラーをダウンロードしておきます。

次に、Hyper-Vを有効にしておきます。
Windows機能の有効化という項目から有効にできます。

そうしましたら、インストーラーを実行します。
特に設定項目はないので詰まることはないと思います。

インストールが終わったら起動して動作確認をします。
初回の起動をしようとすると再起動を要求されるかもしれません。
起動には数分かかります。起動し終えると、タスクトレイにDockerのアイコンが表示されます。

![](https://i.imgur.com/mn08D0X.png)

こんな感じ。
ちなみに、メモリが少なめのマシンの場合はメモリ不足の警告が出るかもしれません。
その場合、タスクトレイのDockerアイコンを右クリックして、出てくるSettingsから設定に行ってメモリの割り当てを変更します。

![](https://i.imgur.com/IVI6ZVJ.png)

僕のメモリ8GBのマシンだとこんな感じで快適に動きます。
4GBのマシンとかを使ってる場合、半分くらいにしてみるといいかもしれません。

```docker
docker run hello-world
```

多分こんな感じに出ます

```bash
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```

出たら成功です。

素晴らしいことにDocker for windowsにはDocker-composeが最初から入っているので、この後わざわざcomposeを入れたりといったことは不要です。

## CodiMDをクローンしてDockerで動かす
いよいよ本題ですね。と、言ってもそんなに難しい話ではありません。
まず、公式リポジトリからクローンしてきます。

```bash
git clone https://github.com/hackmdio/docker-hackmd.git
```

そうするとdocker-hackmdディレクトリが生成されるので、あとは

```bash
cd docker-hackmd
docker-compose up
```

とすればしばらくまってWebサーバーとDBサーバーが立ち上がります。
listening at port 3000とか表示されていれば成功です。
今回は3000番ポートで待ち受けとあるので[https://localhost:3000](https://localhost:3000)
にアクセスすればCodiMDを使えます。
アカウントを適当に作ってやればいつものHackMDと同じ感覚で使えます。
また、アカウントや書いたマークダウンが消えないように勝手にローカルにマウントしてくれるので `docker-compose kill` とかしてもまた立ち上げればデータは残ったままです。

## 画像のアップロード先を弄る
デフォルトだとimgureに画像がアップロードされてしまうので、それを避ける場合config.jsonを弄ります。

```config.json
{
    "production": {
        "urlAddPort": true,
        "email": true,
        "db": {
            "username": "hackmd",
            "password": "hackmdpass",
            "database": "hackmd",
            "host": "hackmdPostgres",
            "port": "5432",
            "dialect": "postgres"
        },
        "imageUploadType": "imgur"
    }
}
```

これの一番下の項目を変えます。

```config.json
{
    "production": {
        "urlAddPort": true,
        "email": true,
        "db": {
            "username": "hackmd",
            "password": "hackmdpass",
            "database": "hackmd",
            "host": "hackmdPostgres",
            "port": "5432",
            "dialect": "postgres"
        },
        "imageUploadType": "filesystem" <=ここ
    }
}
```

このようにすれば内部に画像を保存してくれるはずです。

## まとめ
割と手軽にHackMDをローカルで使えました。
そこそこの人数が使ってるWebサービスと同じものが手元で動くというのはなかなか楽しいものです。
これからもDockerを使って色々遊んでみたいと思います。