本記事は、Shiny Advent Calendar 2017の21日目の記事です。
Shiny100本ノックもかれこれ第21弾となりました。
今回はDockerを使った環境構築周りについて、紹介します。
面倒な環境構築
Shinyを使うために、多くの方は手元のPCにRやRstudioをインストールし、そしてShinyを始めとする必要なパッケージ群をインストールして…。ということを行っていると思います。
しかし、この方法は結構面倒。例えば会社で途中まで実装していたものを、自宅のパソコンで引き続き作業する場合、同じ環境構築をする必要があります。
また会社ではできたはずなのに、自宅PCだと何か他のシステムとバッティングして、インストールできないパッケージが出てきたりすると、めちゃくちゃ大変です。
また会社の先輩が途中まで実装したものを引き継ぐ場合も、先輩のPCでは動いたのにこっちのPCでは動かない…ということが起こりえます。
そんなとき、手軽に会社で使っているPCの環境や先輩の環境を手元に再現したいですよね。
そこで登場するのがDockerです!
Dockerとは
Dockerとは、手元のPCに「コンテナ」と呼ばれる仮想環境を簡単に作ることができるツールです。必要なのはDockerfileという「どんな環境構築を行うか」について書かれた設定ファイルだけです。Docker環境さえ手元にインストールできれば、DockerfileだけでどのPCでも同じ環境を作ることができます。
また同時に複数のコンテナを作ることもでき、各コンテナや手元のPC環境がコンフリクトしないようになっています。そのため、気軽に試して使わなくなったら壊して…ということを繰り返すことができます。
またDockerhubという、Dockerで作った環境をクラウド上で管理できるツールもあり、自分の作った環境をDockerhubにあげたり、他の人が作った環境を持ってくることができます。
私は今まで下記記事で紹介しような方法で、直接PC上に環境を作っていましたが、今後はDocker上でR環境を作っていこうと思います!(なにその宣言)
www.randpy.tokyo
なお、Dockerに関して私は以下の書籍でまずは勉強してみました。2015年なので少し情報が古いですが、体系的に学ぶことができたのでおススメです。ただ、Web上にもたくさん情報があるので、ググりならが勉強するのでも良いと思います!
プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化
- 作者: WINGSプロジェクト阿佐志保
- 出版社/メーカー: 翔泳社
- 発売日: 2015/11/19
- メディア: Kindle版
- この商品を含むブログ (3件) を見る
Windows にDockerをインストール
Window10 Proの方は、Docker for Windowsという簡単にDocker環境を構築できるものが提供されています。簡単に導入手順を紹介します。https://docs.docker.com/docker-for-windows/install/#download-docker-for-windowsから「Stable channel」のほうを選んでダウンロードしてください。
ダウンロードできたら、ファイルを実行してインストールに進みましょう。
インストールが完了すると、一度PCのサインアウトを要求されるので指示に従ってサインアウト後、再度ログインしてください。
ログインして数秒待つと、「ちょっとまだ設定できていないんで、再起動して良いっすか?」という以下のような画面が出ます。これはDockerを使うために必要な仮想環境設定なのでOKを押して再起動してください。(既に別の仮想環境を入れたことがある場合は、不要かもしれません。)
この再起動後に恐らくDocker環境が入ったはずです。
お使いのターミナル(私はcmderを使っています)を開いて
$ docker -v
と入力して、バージョン情報が表示されたらOKです。
Shiny環境が入ったコンテナをDockerで立ち上げる
Dockerが入ったところで、早速Shinyが入った仮想環境を立ち上げてみましょう。前述したとおり、環境構築を行うためにはDockerfileが必要なのですが、一から自分で作るのは結構大変です。
しかし安心してください!多くの優秀な方々がDockerhubに、様々な環境の情報を残してくれています。
基本的には、Dockerhubから欲しい環境を持ってきて、それに上書きする形でオリジナルの環境を作るのが手っ取り早いです。
今回は、https://hub.docker.com/r/tokyor/rstudio/こちらを参考にしてみました。
説明を読むと、Rstudioとtidyverse、そして日本語フォントの環境が作れるようですね。ですが、肝心のShinyが入っていません。
ということで、Shinyライブラリだけ追加で入れるためのDockerfileを作成してみます。
お好きなディレクトリに移動し、拡張子等何にもつけず、以下のような「Dockerfile」という名前のファイルを作成してください。
FROM tokyor/rstudio RUN R -e "install.packages(c('shiny', 'shinythemes'), repos='http://cran.rstudio.com/')"
一応Githubにも置いてあります。
github.com
一行目の
FROM tokyor/rstudio
これは「tokyor/rstudio」のDockerfileをベースにするよ、ということ表しています。このようにベースとなる環境をDockerhubから探してきて、それを元に作ります。
二行目の「Run ~」ではDockerコンテナ上で実行するコマンドを書いていきます。
今回shinyライブラリとshinythemesライブラリを入れるので、このように書けばOKです。
もし他にもよく使うライブラリがあれば、この部分に追加していってください。
これにてほとんど作業は終わったようなもんです!
ターミナル上で以下を実行してください。必要なファイルをダウンロードしてくるので、ネットワーク環境が悪いと少し時間がかかります。
$ docker build -t shiny:1.0 .
docker buildにて、DockerfileをもとにDocker imageというものを作ります。これはDockerコンテナを構成するファイルシステムの集合だと思ってください。
- Dockerfile制作
- Dockerfileを元に必要なファイルシステムを制作(これがDocker image)
- Docker imageをもとに、コンテナ立ち上げ
という流れです。
なお、「-t shiny:1.0」という部分は今回作るDocker imageにshinyという名前を付けて、更にそのバージョンを「1.0」とするよ。ということを意味しています。
さてこの説明を読んでいるあたりで、Docker Buildは終了したでしょうか?
Docker Buildが成功したら、以下でコンテナを立ち上げましょう。
$ docker run -d -p 80:8787 shiny:1.0
「docker run イメージ名」にてDocker imageをもとにコンテナを作ってくれます。
「-d」とつけると、実行後にバックグラウンドでコンテナを動かしてくれます。
「-p 80:8787」という部分は、ホスト(PC側)で80番のポートにアクセスすると、コンテナ側の8787番のポートと繋いでくれるよ。という意味です。
これでコンテナが立ち上がったので、ブラウザに「localhost:80」を入力してみましょう。
Rstudioが立ち上がっていれば成功です!
Dockerコンテナで作ったR環境
なお、ユーザー名とパスワードを聞かれますが、どちらもrstudioと入力してもらえれば入れると思います。shinyとshinythemesライブラリもちゃんとインストールされているようです!
適当なShinyアプリケーションを作って「runApp」させたところ、「新しいブラウザ開いていいかい?」と聞かれるのでOKとしましょう。
ちゃんと立ち上がりました!ちょっと感動!!!
お疲れ様でした!!
Dockerを停止する
Dockerコンテナを使わない場合は停止させておきましょう。$ docker ps
と打つと、現在動いているコンテナの情報(CONTAINER ID, IMAGE, COMMAND, CREATED, STATUS, PORTS, NAMES)が表示されます。
その中から停止したいコンテナを選び
$ docker stop コンテナ名
と入力してください。コンテナ名というのは、docker psと打った時に「NAMES」に該当する部分です。
また一度作ったDocker imageは、
$ docker images
で確認することができます。
最後に
今回は、Dockerを使ったRstudioやShinyライブラリなどを含むR環境の構築に挑戦してみました。一度作ってしまえば、PCが変わってもすぐに再現できるので非常に便利です!
また、Dockerfileの記法は結構奥が深く、まだまだ説明が必要なところはたくさんあります。
書籍にて勉強するか、Docker hubで気になるものが見つかったらDockerfileを見てみて、「何だろうこの書き方?」と疑問に思ったところをググるのが良さそうです。
ただ、基本的にはDockerhubから欲しい環境を見つけてそのまま使うか、ちょっと上書きする程度でも十分有用だと思います。是非試してみてください!