Dockerを使ってR Studio ServerをLinuxサーバにインストールする。Rockerイメージが使いやすかった
Rで統計学を学んでいくにあたって、R Studioを導入することにした。
パソコンのローカルにR Studio Desktopを入れてもいいんだけど、普段使っているパソコンが2台以上あるから、我が家で常時稼働しているLinuxサーバにR Studio Serverをインストールして、どの端末でも使えるようにしよう。
しかも、普通に入れて環境が汚れるのが嫌だったから、Dockerで入れてやることにした。
そうすれば、WindowsのWSLなんかでも使えるようになるし便利かな、くらいのノリで。
Rockerプロジェクトのイメージを使う
さて、LinuxサーバにDockerでR Studio Serverを導入するとして、ちょうどいいイメージがあるか探していたところ、Rockerプロジェクトというのが使えそうだった。
Rの開発元でも紹介されていたし、おそらく身元の明らかなプロジェクトなのだろう。Docker Hubは個人で作っている野良イメージも多いから、下手なのを引くとアレヤコレヤのリスクがあるし・・・
ということで、Rockerを採用することにした。
まずはRockerプロジェクトで紹介されている方法でコンテナを立ち上げたところ、すんなりR Studioを導入することはできた。
日本語ロケールにするため、Dockerfileを作る
ただ、グラフやらを書いたときに日本語が化けるのとか気になる。
Rockerの元になっているUbuntuが日本語ロケールじゃないからだろうか。フォントとか入ってるのかな。
そこで、更に調べてみると、同じようなことに悩んだ人が、日本語ロケールを導入したDockerイメージを作るレシピを公開していた。
これを参考にDockerfileを作って、オリジナルのDockerイメージを作ることにした。
FROM rocker/tidyverse:latest
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
最初から色々とライブラリが入ってる方がいいかと、元のイメージは rocker/tidyverse を使用している。
Docker composeで設定を管理する
さらに、Docker composeを使って、パラメタなどの設定情報も残しておくことにする。
Dockerコマンドでコンテナを起動するのもいいんだけど、Docker composeで設定ファイルを作っておく方が後からわかりやすいと私は思っていて、好んで使っている。
再現性高いの大事。
Rockerプロジェクトで公開されている docker-compose.yml を参考にして、一部はちょいなちょいなと変更する。コンテナが常時起動するようにしたり (restart: always)、コンテナ内でroot権限が使えるようにしたり (ROOT: TRUE)。
services:
rstudio:
build:
dockerfile: Dockerfile
container_name: rstudio
restart: always
ports:
- 8787:8787
environment:
PASSWORD: passwordmuzukashi
TZ: Asia/Tokyo
ROOT: TRUE
volumes:
- ./.rstudio_config:/home/rstudio/.config/rstudio
- ./workspace:/home/rstudio/workspace
こうして、オリジナルのDockerイメージを作り、コンテナ化するところまで完成した。
ディレクトリの権限を変更する。
立ち上げたコンテナのR Studio Serverにログインしてみる。
ちゃんとR Studioが使えている!すばらしい。
ただ、Consoleなどは普通に動いていたんだけど、画面テーマを保存したり、Rスクリプトファイルを保存したりするのがなんだかできなかった。
これはディレクトリの権限の問題かと思い、R Studioの「Terminal」からディレクトリの権限を設定してやる。
R StudioのTerminalは非常に優秀なターミナルだと思っていて、これを使えば普通にLinuxの操作ができるのだ。
しかも、Dockerコンテナ上のR StudioのTerminalを使えば、いきなりDockerコンテナの中で活動できる。これがいい。そのままコンテナのディレクトリの権限を設定してやる。
Docker composeで指定した、マウントポイントのディレクトリをデフォルトユーザ「rstudio」の持ち物にしよう。
> sudo chown -R rstudio: .config
> sudo chown -R rstudio: workspace
こうしてやることで、R Studioの設定や、スクリプトファイルを保存できるようになった。
ちなみに、ここでディレクトリの持ち主変更をするために、docker-compose.ymlに「ROOT: TRUE」という環境変数を入れている。この設定があることで、コンテナ内で sudo 実行ができるようになるそうだ。以下ページの「4.1.2 ROOT」にこの環境変数の記載があったので参考にした。
ひとまずここまでやればいいだろう。普通にR Studioを使えるようになった。
おわりに
R StudioをDockerでインストールしようと試行錯誤してみた。
ひとまず動くものができたんだけど、ここまでやらないといけないものだったんだろうか?
もう少しRのことがわかってきたら、調整できるポイントが出てくるのかもしれないが・・・
また、これだとコンテナを作り直したときに、新たに導入したRパッケージを入れ直す必要もあるし、その辺がうまいことできないかなぁとも思っている。スクリプトファイルはコンテナの外に保存できるから、やり直しは効くのだけれど。
コンテナを適宜commitしてやればいいのかもしれないが、もっとスマートなやり方があるようならそれが望ましいと思う。
なにはともあれ、Rを学習する環境を作ることはできたし、環境を作るのに躍起になってないで、そろそろ肝心のRの学習を進めていくとしよう。