Ubuntu Weekly Recipe

第529回RStudio Serverをよりかんたんにインストールする

第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でイメージを取得しましょう。

$ sudo docker pull rocker/verse
(中略)
Status: Downloaded newer image for rocker/verse:latest
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rocker/verse        latest              a7a50ddde3dd        5 hours ago         2.45GB

Dockerはコンテナ起動時のオプションによって個々のイメージの挙動を変更できます。とりあえず起動してみましょう。

$ sudo docker run -d -p 8787:8787 rocker/verse
a465f38827b3c311dde567223349a89a2ac6593ddc18e381587b30a02f88c19d
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
a465f38827b3        rocker/verse        "/init"             8 seconds ago       Up 8 seconds        0.0.0.0:8787->8787/tcp   priceless_austin

-dはインスタンスをバックグラウンドで起動するオプションです。-p 8787:8787-p ホストのポート番号:コンテナのポート番号と記述することで、コンテナのポート番号をホストのポート番号に紐付け、ホストやホストの外からコンテナのポートにアクセスできるようにします。要するにコンテナの中のRStudioサーバーに、ホストの外から「ホストのアドレス:8787」でアクセスするオプションです。

実際にウェブブラウザーから「ホストのアドレス:8787」へとアクセスしてみましょう。ユーザー名とパスワードはいずれも「rstudio」です。

コンテナの停止・削除

docker psで表示されるコンテナIDを使えば、コンテナを停止・削除できます。

$ sudo docker stop a465f38827b3
$ sudo docker rm a465f38827b3

もしくはdocker run実行時に--rmオプションを付けておけば、コンテナの停止時に自動的に削除されます。

ちなみにコンテナを削除すると、コンテナ内部で行われた変更もすべて削除されます。つまりRStudioからinstall.packages()を呼び出したとしても、コンテナの削除によって/usr/local/lib/Rに)インストールしたパッケージは消されてしまうわけです。

実行中のコンテナの状態を保存したいなら、docker commitでコンテナをイメージに変換します。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
fc4f64b59435        rocker/verse        "/init"             5 minutes ago       Up 5 minutes        0.0.0.0:8787->8787/tcp   musing_meninsky
$ sudo docker commit fc4f64b59435 myverse
sha256:8b251722f2fd3a46fb995036939d28bf64ae17085af460f395f720907c90488f
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myverse             latest              8b251722f2fd        15 seconds ago      2.49GB
rocker/verse        latest              a7a50ddde3dd        6 hours ago         2.45GB

上記ではコンテナIDに対して「myverse」という名前を付けて保存しています。これで次回からrocker/verseの代わりにmyverseイメージを起動すれば、パッケージの状態が保持されます。

ただし任意のパッケージセットを持ったDockerイメージを作りたいのであれば、そのイメージ用のDockerfileを書くことをおすすめします。これによりどのような変更がイメージに加えられているか一目瞭然ですし、将来的にイメージを再構築しやすくなるからです。

ワークスペースをホストと共有する

RStudioのプロジェクトワークスペースはコンテナの中にあります。つまりこれもコンテナを削除するとともに消えてしまいます。そこで作業ディレクトリはコンテナの外に保存するようにしましょう。

Dockerでホストとコンテナの間やコンテナ同士でデータを共有したい場合、Volume機能を利用します。Volume機能には、ホストのディレクトリをbind mountする方法やVolumeコンテナと呼ばれるストレージコンテナを作成しそれを利用する方法などが存在しますが、今回は単にホスト側からRStudioが保存するデータを見られれば良いので、bind mountします。

$ mkdir rstudio
$ sudo docker run --rm -d -p 8787:8787 \
  -v /home/$(id -un)/rstudio:/home/rstudio/ rocker/verse

-v /home/$(id -un)/rstudio:/home/rstudio/が今回追加したオプションです。-vオプションは「ホストのディレクトリ:コンテナのディレクトリ」という書式で、コンテナのディレクトリをホストのディレクトリにbind mountします。これによりコンテナ内部から指定したディレクトリへの変更が、そのままホストにも反映されるのです。

Rockerの起動オプション

Rocker版RStudioでは、一般ユーザーとして「rstudio」アカウントが作成されています。また、そのパスワードは「rstudio」です。しかしながら他のユーザーからアクセス可能な環境において立ち上げるなら、せめてパスワードは変更しておきたいところです。

RockerではPASSWORD変数を渡すことで、rstudioアカウントのパスワードを変更できます。

$ docker run -d -p 8787:8787 -e PASSWORD=何かいい感じのパスワード rocker/verse

また同様にUSER変数を使えば、ユーザー名も変更可能です。

rstudioユーザーはsudoersに追加されていません。そのためsystem()関数からであってもsudoは実行できません。コンテナ起動時にROOT変数に「TRUE」⁠すべて大文字)を設定しておくと、rstudioユーザーがsudoersに追加され、パスワードなしのsudoが実行可能になります。

$ docker run -d -p 8787:8787 -e ROOT=TRUE rocker/verse

環境のバージョンアップ方法

Dockerは一度pullしたイメージをそのまま使い続けます。もしより新しいイメージを使いたい場合は、次のように再度pullしてから、コンテナを起動してください。

$ sudo docker commit コンテナID backup_FOO
$ sudo docker stop コンテナID
$ sudo docker pull rocker/verse
$ sudo docker run --rm -d -p 8787:8787 \
  -v /home/$(id -un)/rstudio:/home/rstudio/ rocker/verse

「コンテナの停止・削除」でも説明したようにコンテナの停止によってデータが消える場合もあります。commitでコンテナのバックアップを取っておくと良いでしょう。

おすすめ記事

記事・ニュース一覧