第527回ではRStudioのインストール方法を紹介しました。実はコンテナ技術を使うと、インストール方法はさらにかんたんになります。今回はDockerを活用したRStudio Serverのインストール方法を紹介します。
コンテナ技術を使う利点
直近だと第521回でLXDの使い方を解説したように、本連載ではこれまでに何度もコンテナ技術に関する活用方法を紹介してきました。今回も実際に実行するコマンド自体は、これまでとほぼ変わりはありません。そこでRStudio Serverをコンテナ上で利用する際のポイントなども合わせて紹介します。
まず、RStudio Serverのインストールにおいて、コンテナ技術を活用すると得られるメリットは次のとおりです。
- ホストに余計なパッケージをインストールしなくて良い
- コマンドひとつで全部入りの環境を構築できる
- 複数のバージョンもかんたんに共存できる
- Linuxディストリビューションの差異を無視できる
- 複数のマシン間で環境のマイグレーションを行える
その多くは「コンテナ技術だからできる」というよりも「コンテナ技術だからかんたんにできる」ものです。しかしながらコンテナ技術を導入することで生じる性能上のデメリットはほぼないので、使わない手はありません。数多あるコンテナ技術のうち、今回はDockerに限定して紹介しましょう。
最初に行なうべきはコンテナプラットフォームのインストールです。Dockerのインストール方法は第458回を参照してください[1]。今回紹介する手順はDocker公式のdocker-ce版でもUbuntuリポジトリのdocker.io版でも関係なく使えます。
RockerプロジェクトのDockerコンテナ
Dockerで特定のアプリケーションを使う上で最初に考えるべきことは、どのコンテナを使うか、もしくは自分でビルドするのか、です。最近のサーバーソフトウェアの多くは、公式のイメージがDocker Hubにアップロードされていますので、まずは探してみましょう。もし見つからなかったり、見つかったとしてももう少しカスタマイズしたい場合は、自分でDockerfileを記述することになります。
幸いR・RStudioにはRocker Projectによる質の高いDockerイメージが存在します。まずはこれを使うと良いでしょう。Rockerでは主に5種類のイメージが提供されています。
『RユーザのためのRStudio[実践]入門』の勉強に使うのであれば、最低でもtidyverseイメージを使ったほうが良さそうです。第5章のR Markdownのことを考えるとverseでもいいかもしれません[2]。今回はverseイメージを使います。
まずはdocker pull
でイメージを取得しましょう。
Dockerはコンテナ起動時のオプションによって個々のイメージの挙動を変更できます。とりあえず起動してみましょう。
「-d
」はインスタンスをバックグラウンドで起動するオプションです。「-p 8787:8787
」は「-p ホストのポート番号:コンテナのポート番号
」と記述することで、コンテナのポート番号をホストのポート番号に紐付け、ホストやホストの外からコンテナのポートにアクセスできるようにします。要するにコンテナの中のRStudioサーバーに、ホストの外から「ホストのアドレス:8787」でアクセスするオプションです。
実際にウェブブラウザーから「ホストのアドレス:8787」へとアクセスしてみましょう。ユーザー名とパスワードはいずれも「rstudio」です。
コンテナの停止・削除
docker ps
で表示されるコンテナIDを使えば、コンテナを停止・削除できます。
もしくはdocker run
実行時に「--rm
」オプションを付けておけば、コンテナの停止時に自動的に削除されます。
ちなみにコンテナを削除すると、コンテナ内部で行われた変更もすべて削除されます。つまりRStudioからinstall.packages()
を呼び出したとしても、コンテナの削除によって(/usr/local/lib/R
に)インストールしたパッケージは消されてしまうわけです。
実行中のコンテナの状態を保存したいなら、docker commit
でコンテナをイメージに変換します。
上記ではコンテナIDに対して「myverse」という名前を付けて保存しています。これで次回からrocker/verseの代わりにmyverseイメージを起動すれば、パッケージの状態が保持されます。
ただし任意のパッケージセットを持ったDockerイメージを作りたいのであれば、そのイメージ用のDockerfileを書くことをおすすめします。これによりどのような変更がイメージに加えられているか一目瞭然ですし、将来的にイメージを再構築しやすくなるからです。
ワークスペースをホストと共有する
RStudioのプロジェクトワークスペースはコンテナの中にあります。つまりこれもコンテナを削除するとともに消えてしまいます。そこで作業ディレクトリはコンテナの外に保存するようにしましょう。
Dockerでホストとコンテナの間やコンテナ同士でデータを共有したい場合、Volume機能を利用します。Volume機能には、ホストのディレクトリをbind mountする方法やVolumeコンテナと呼ばれるストレージコンテナを作成しそれを利用する方法などが存在しますが、今回は単にホスト側からRStudioが保存するデータを見られれば良いので、bind mountします。
「-v /home/$(id -un)/rstudio:/home/rstudio/
」が今回追加したオプションです。「-v
」オプションは「ホストのディレクトリ:コンテナのディレクトリ」という書式で、コンテナのディレクトリをホストのディレクトリにbind mountします。これによりコンテナ内部から指定したディレクトリへの変更が、そのままホストにも反映されるのです。
Rockerの起動オプション
Rocker版RStudioでは、一般ユーザーとして「rstudio」アカウントが作成されています。また、そのパスワードは「rstudio」です。しかしながら他のユーザーからアクセス可能な環境において立ち上げるなら、せめてパスワードは変更しておきたいところです。
RockerではPASSWORD
変数を渡すことで、rstudioアカウントのパスワードを変更できます。
また同様にUSER
変数を使えば、ユーザー名も変更可能です。
rstudioユーザーはsudoersに追加されていません。そのためsystem()
関数からであってもsudo
は実行できません。コンテナ起動時にROOT
変数に「TRUE」(すべて大文字)を設定しておくと、rstudioユーザーがsudoersに追加され、パスワードなしのsudo
が実行可能になります。
環境のバージョンアップ方法
Dockerは一度pullしたイメージをそのまま使い続けます。もしより新しいイメージを使いたい場合は、次のように再度pullしてから、コンテナを起動してください。
「コンテナの停止・削除」でも説明したようにコンテナの停止によってデータが消える場合もあります。commitでコンテナのバックアップを取っておくと良いでしょう。