Docker環境 Rstudio で文字化け回避、ファイルシステムの共有を行う（Docoker-composeも）

## 文字化けとファイルシステム共有の問題
Docker Hubには、GISの分析も可能な Rstudio Server 環境として、`rocker/geospatial` があります。ただ、見よう真似で `docker pull` して、`docker run rocker/geospatial` を行っても、以下2点の問題がありました。

1. ggplot2 などでplotした図が日本語に対応していない（文字化けしてしまう。）
2. Host/Container間のファイルシステムを共有していないと、いつもデスクトップ版で使用していたファイルにアクセスできない。（`Docker run`の際に設定をしておかないと、立ち上げてから `setwd` しようとしてもできない。）

この2点に対処した内容を、覚書として残しておきます。

## Dockerfile の作成

まず、Host（コンピュータ）側の任意の場所に、Dockerfileを作成します。今回はDropbox上にdockerという名前のディレクトリを作成してDockerfileを作ります。（例：（Mac） `C:\Users\user\Dropbox\docker` 、（Windows）`D:\Dropbox\R\docker`）

メモ帳でもエディタでも良いので、`Dockerfile`という名前のファイルを作成し、docker のディレクトリ内に設置します。ディレクトリ内には `Dockerfile` 以外のファイルは原則置かないようにしてください（`Docker build` の際に影響します。）。RUNごとにimageが作成されてしまうので、なるべく RUN は バックスラッシュ \ で繋げて書くのが望ましいとされます。[^1][^2]

```
# ベースとするイメージ（任意のrocker/*に変更可能）
FROM rocker/geospatial:latest

# OS環境（rockerはdebianベース）に日本語ロケールを追加し切り替える
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
RUN sed -i '$d' /etc/locale.gen \
  && echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen \
    && locale-gen ja_JP.UTF-8 \
    && /usr/sbin/update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
RUN /bin/bash -c "source /etc/default/locale"
RUN ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# 日本語フォントをインストール
RUN apt-get update && apt-get install -y \
  fonts-ipaexfont \
  fonts-noto-cjk
```

## Docker build
（Macなら）Terminalを起動。Windowsであれば TeraTermやWindows Terminalを使用してください。`Dockerfile` がおいてある場所に移動します。

```
# 自分（Mac）の場合 /Users/user から /Users/user/Dropbox/docker へ移動

cd Dropbox
cd docker
```

`Dockerfile`がおいてある場所に移動したら、`docker build -t <name> <directory>` で、`build`します。（今回は`<name>`は`geo:geospatial`とします）

```
# /Users/user/Dropbox/docker

docker build -t geo:geospatial .
```

build後、Docker runをしますが、 -v オプションでファイルシステムを共有し、-p オプションでHostとContainerのポートを繋げます。[^3]

### Macの場合

```
docker run -p 8787:8787 -v C:\Users\user\Dropbox\R\:/home/rstudio -d geo:geospatial
```

`C:\Users\user\Dropbox\R\` はそれぞれご自身が使用している任意のフォルダパスを入力してください。

### WindowsでDドライブを使用している場合

```
docker run -p 8787:8787 -v D:\Dropbox\R:/home/rstudio -d geo:geospatial
```
などとなると思いますが、Dドライブ上のディレクトリでうまくマウントできない場合は、ローカルセキュリティポリシーの設定を確認してください。[^4]

また、Windowsの場合は、Virtual Hard DiskをDドライブに設定しておいたほうが良さそうです。[^5]

## ブラウザからRstudioへアクセス
上記のコマンドを入力して、エラーが出なければ、無事にRStudioが起動できています。http://localhost:8787 で確認してみてください。今回はパスワードを任意のものに設定しなかったため、Username、Passwordともに、rstudioでログイン出来ると思います。

# （おまけ）Docker-composeの活用

ここまで書いておいてですが、`Docker-compose`を使ってRstudioを管理することもできます。上記記事のままでも問題ないのですが、`Docker run` する際に、毎回長いコードを書くのも、覚えるのも、大変です。また、将来的に RStudio Server 以外にも色々なコンテナを併用したい場合がでてくるかもしれません。そのようなときは `Docker-compose` が役に立ちます。

## `docker-compose.yml` を作成する

`Dockerfile`と同じ場所に、`docker-compose.yml` というファイルを作成し、エディタで編集をしていきます。上記と同じように `Dropbox > docker` 上で作業をします。（例：（Mac） `C:\Users\user\Dropbox\docker` 、（Windows）`D:\Dropbox\R\docker` ）

上記では、`docker build` と `docker run` の際に

```
docker build -t geo:geospatial .
```

```
docker run -p 8787:8787 -v C:\Users\user\Dropbox\R\:/home/rstudio -d geo:geospatial
```

と書きましたが、これを `docker-compose.yml` 上で設定すると、下記のようになります。

```
version: '3'

services:
  rstudio:
    build: .
    image: geo:geospatial
    container_name: geo
    ports:
      - 8787:8787
    volumes:
      - ../R:/home/rstudio
    tty: true
    stdin_open: true
```

それぞれコロン（`:`）やダッシュ(`-`)のあとには`半角スペース`を入れるのを忘れないようにしてください。例えば、`version: '3'`は、`version:`と`'3'`の間に`半角スペース`があります。`build: .`などもコンマ(`.`)の前に`半角スペース`が必要です。これは書式のルールとして従ってください。

また、今回は`volumes`は相対パスで指定しています。`C:\Users\user\Dropbox\R` というフォルダをRstudioのホームディレクトリに指定したい場合は、今 `C:\Users\user\Dropbox\docker` というフォルダにいるので、`..` でひとつ上の階層にあがり（`C:\Users\user\Dropbox\`）、それから `/R` のディレクトリを指定しています。

相対パスを指定することで、使っているマシンの環境に依存しないコードになりました。これで MacでもWindowsでも同じ`docker-compose.yml` ファイルで管理が可能になりました。

## docker-compose up -d でbuildする

Dockerの際と一緒です。（Macなら）Terminalを起動。Windowsであれば TeraTermやWindows Terminalを使用してください。`Dockerfile`および`docker-compose.yml`がおいてある場所に移動します。

```
# 自分（Mac）の場合 /Users/user から /Users/user/Dropbox/docker へ移動

cd Dropbox
cd docker
```

`Dockerfile`および`docker-compose.yml` がおいてある場所に移動したら、今回は`docker build`や`docker run`の代わりに`docker-compose up -d`と入力・実行します。これだけです。

```
# /Users/user/Dropbox/docker

docker-compose up -d
```

エラーが出る場合は、先程の半角スペースを入れ忘れていないか、まずは確認してみてください。問題なければ http://localhost:8787 で前回の設定と同じように無事にrstudioに接続できると思います。


[^1]: Dockerfile はこちらを参考にしました：https://k-metrics.github.io/cabinet/env_install_svr.html
[^2]: RUNごとにimageが作成されてしまうことについて：https://datawokagaku.com/dockerfile_commands/
[^3]: https://qiita.com/y4m3/items/baf1eb9a765be8672e3b
[^4]: https://qiita.com/ditflame/items/bf4b5f412bf607c5c6d2
[^5]: https://wand-ta.hatenablog.com/entry/2018/12/06/123229