文字化けとファイルシステム共有の問題
Docker Hubには、GISの分析も可能な Rstudio Server 環境として、rocker/geospatial
があります。ただ、見よう真似で docker pull
して、docker run rocker/geospatial
を行っても、以下2点の問題がありました。
- ggplot2 などでplotした図が日本語に対応していない(文字化けしてしまう。)
- 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 は バックスラッシュ \ で繋げて書くのが望ましいとされます。12
# ベースとするイメージ(任意の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に接続できると思います。
-
Dockerfile はこちらを参考にしました:https://k-metrics.github.io/cabinet/env_install_svr.html ↩
-
RUNごとにimageが作成されてしまうことについて:https://datawokagaku.com/dockerfile_commands/ ↩