京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

Mac版Dockerで、rocker/rstudio (= RStudio Server Docker Image)をトラブルフリーでセットアップしてみた件

概要

過去の記事で、「【macOS X編】 Homebrewで、RStudio Serverをインストールしてみた件 + nginx設定」を紹介しました。

現状、MacローカルでのRstudio Server動作について、 バージョン・アップ等の問題で*1、少々動作が不安定な場合です。 そのため、ローカル環境で構築せずに、Docker/Rocker を使用することを推奨します。

skume.hatenablog.com

Dockerとは、ホストマシンのカーネルを利用して、コンテナ型の仮想環境を作成、配布、実行するための実行環境です。

概要として、環境構築済みのDockerイメージ(= コンテナを起動させるためのベース部分)は、 Docker Hubなどで、いろいろと公開されていて、それらイメージをダウンロードしてきて、 Dockerコンテナ(= Dockerイメージから作成される仮想環境の実行部分)を起動します。 Dockerコンテナは、ユーザーごとに作成したり、ログイン設定を変えて、複数のコンテナを作成・構築できます。

RStudioのDockerイメージは、Rockerが主流で、 このリポジトリには、RStudio関連の複数のDockerイメージ・Dockerfileが含まれています。

Docker for macのインストールについて

MacでのDockerは、GUIアプリ版の「Docker for mac」を使用することをお勧めします*2。 Mac ターミナルを起動して、brew caskで、Docker.appをインストールします。

Homebrewのセットアップについては、以前の記事を参照のこと。

skume.hatenablog.com

以下の2行のコマンドを実行すれば、Dockerのインストール・起動は完了します。

#Docker for macのインストール
brew cask install docker

##現在、以下のように変更になっている。
#Error: `brew cask` is no longer a `brew` command. Use `brew <command> --cask` instead.
#$ brew install --cask docker

#Docker.appの起動
open /Applications/Docker.app

もしDockerの公式サイトからダウンロードしたい場合には、 DockerのHPに行って、Download for Macからアプリを取得します。

www.docker.com

www.docker.com

Docker.appを起動して、しばらく経つと、 メニューバーの右側に、Docker.appのアイコンが表示されます。 アイコンをクリックして、次に「Sign in / Create Docker ID」を選択します。

ここで、Docker IDとPasswordを入力して、ログインします。

もしDockerのアカウントがないなら、 公式HPでアカウントを作成してから、ログインします。

dockerコマンドの動作確認

ターミナルで、dockerコマンドの動作確認を行います。

docker -v
#Docker version 19.03.12, build 48a66213fe
#が出れば、OK

##起動の確認
docker ps -a
#まだ何も表示されないはず
#CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

#もしDockerが立ち上がってないと
#Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
#とエラーが出る

rocker/rstudioイメージの検索・ダウンロード

まずは、Docker Hub*3にあるRstudio-serverのDockerイメージを探してみます。

docker search コマンドで検索してみます。

#rockerリポジトリのイメージを検索する
docker search rocker

#NAME                                            DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
#rocker/rstudio                                  RStudio Server image                            321                                     [OK]
#rocker/shiny                                                                                    146                                     [OK]
#rocker/tidyverse                                Version-stable build of R, rstudio, and R pa…   106                                     [OK]
#rocker/r-base                                   Basic R for Rocker And Official 'r-base'        74                                      [OK]
#rocker/verse                                    Adds tex & related publishing packages to ve…   51                                      [OK]
#rocker/r-ver                                    Reproducible builds to fixed versions of R      38                                      [OK]
#rocker/geospatial                               Docker-based Geospatial toolkit for R, built…   31                                      [OK]
#rocker/shiny-verse                              Rocker Shiny image + Tidyverse R packages. U…   28                                      [OK]
#rocker/ropensci                                                                                 22                                      [OK]
#rocker/r-devel                                                                                  17                                      [OK]
#rocker/rstudio-stable                           Build RStudio based on a debian:stable (debi…   16                                      [OK]
#rocker/ml                                       Docker images with R + machine learning libr…   7                                       [OK]
#rocker/r-apt                                    R-related apt-get information                   6                                       [OK]
#rocker/binder                                   Adds binder to rocker/tidyverse, providing J…   4                                       [OK]
#rocker/r-rmd                                    Rocker container for Rmarkdown packages         4                                       
#rocker/r-parallel                                                                               3                                       
#rocker/drd                                                                                      3                                       [OK]
#rockerjp/tidyverse                              rocker/tidyverse for Japanese R users.          2                                       [OK]
#koncina/rocker-bs2                              customised rocker image to build the biostat…   2                                       [OK]
#rocker/cuda                                     NVIDIA CUDA libraries added to Rocker images    0                                       
#methodsconsultants/rocker-tidyverse-rquantlib   rocker/tidyverse + RQuantLib                    0                                       [OK]
#rocker/cuda-dev                                 Adds CUDA and cudnn development libraries to…   0                                       
#atavares/rocker-geospatial-ecmwf                This image is based on rocker/geospatial. It…   0                                       [OK]
#rhub/rocker-gcc-san                             Debian Testing, R-devel and AddressSanitizer    0                                       
#atavares/rocker-geospatial-magick               This image is based on rocker/geospatial. It…   0                                       [OK]

次に、docker pull コマンドで、Dockerイメージのなかで、rocker/rstudio のダウンロードを試みます。

docker pull rocker/rstudio

#Using default tag: latest
#latest: Pulling from rocker/rstudio
#a4a2a29f9ba4: Pull complete 
#127c9761dcba: Pull complete 
#d13bf203e905: Pull complete 
#4039240d2e0b: Pull complete 
#4c420e76969e: Pull complete 
#07647ba1f5c5: Pull complete 
#196fc1e9a022: Pull complete 
#8cef2622a036: Pull complete 
#Digest: sha256:45b1e0a675aad9417ebb3bb63819c6e775efa77484fbabd0a228e797e7d6cc25
#Status: Downloaded newer image for rocker/rstudio:latest
#docker.io/rocker/rstudio:latest

#ダウンロード済みのDockerイメージ一覧
docker images

#REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
#rocker/rstudio      latest              f4d862a97fdf        6 weeks ago         1.88GB

rocker/rstudioコンテナのセットアップ

Dockerイメージだけではまだ実行できず、イメージをもとに仮想環境の実行部分(Dockerコンテナ)を作成します。 Dockerコンテナの構築には、 docker run (作成 + 起動) あるいは docker create (作成のみ) コマンドを使います。

rocker/rstudioページに記載されていた、以下のQuickstartコマンドが試してみます(ただし、個人的に、この設定はあまりお勧めできない)。

## Quickstartコマンド
# dockerコマンドの最後に、イメージ名を指定する
# --rm オプション(一時実行)で、実行後にコンテナが残りません。
docker run --rm -p 8787:8787 -e PASSWORD=yourpasswordhere rocker/rstudio

#[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
#[s6-init] ensuring user provided files have correct perms...exited 0.
#[fix-attrs.d] applying ownership & permissions fixes...
#[fix-attrs.d] done.
#[cont-init.d] executing container initialization scripts...
#[cont-init.d] userconf: executing... 
#[cont-init.d] userconf: exited 0.
#[cont-init.d] done.
#[services.d] starting services
#[services.d] done.

#(command + c で停止)

dockerコマンド・オプションについて補足

  • docker run: コンテナを作成して起動する

  • --rm : コンテナの終了時に、自動的にコンテナをクリーンアップし、ファイルシステムを削除します。そのため、実行後にコンテナが残りません。

  • -p : ポート転送の指定(ホストのポート番号とコンテナのポート番号のマッピング)

  • -e PASSWORD= : パスワードの設定(パスワードは、yourpasswordhereとなる)

rocker/rstudioコンテナの起動は、以下のコマンドをお勧めする。

##個人的な推奨コマンド + オプション
#バックグラウンド起動
#好きなコンテナ名の割り当て(例えば、RStudio001)
#Rootログイン

docker run -d -p 8787:8787 --name RStudio001 -e ROOT=TRUE -e PASSWORD=PassWord rocker/rstudio

#もしコンテナ作成だけで良いなら
docker create -p 8787:8787 --name RStudio002 -e ROOT=TRUE -e PASSWORD=PassWord rocker/rstudio

dockerコマンド・オプションについて補足

  • docker run -d: コンテナを作成してバックグラウンド実行する

  • docker create: コンテナを作成して起動はしない

  • -d, --detach:コンテナを作成後、バックグラウンド実行

  • --name: コンテナ名の割り当て

  • -e ROOT=TRUE: Root設定

(その他コマンドオプション)

  • -v, --volume: コンテナへのホストのボリュームまたはディレクトリの割り当て

-v オプション、これが結構大切。ホストのフォルダを、Docker側に参照関係を持たせることができる。

以下のような設定で、参照関係を持たせる。

#ホストのフォルダをDockerに参照させる
-v $(pwd)/XXX:/home/XXX

コンテナがうまく作成されていたら、コンテナ一覧に表示されます。

#存在するコンテナ一覧の確認
docker ps -a 

以下のコマンドで、ブラウザを立ち上げけ、Rstudio-serverにログインします。

#RStudio serverをひらく
open http://localhost:8787

#ログイン画面で、以下のユーザー名とパスワードを入力する。
#ユーザー名: rstudio
#パスワード: PassWord

各種dockerコマンドについて

コンテナ操作に関するdockerコマンドについて

次に、よく使用するdockerコマンドについて説明します。

#Dockerイメージの強制削除
docker rmi -f [イメージID / イメージ名]

#未使用イメージの一括削除
#<=1.12
docker rmi `docker images -q`
#>=1.13
docker image prune

#Dockerコンテナの強制削除(指定)
docker rm -f [コンテナID / コンテナ名]
#(または複数でも可能)
docker rm -f [コンテナID 1] [コンテナID 2] [コンテナID 3]

#全コンテナの一括削除
docker rm -f `docker ps -a -q`

#コンテナの一覧表示
docker ps -a 

##コンテナの開始・起動(ID頭文字の数文字でも可)
docker start [コンテナID / コンテナ名]

#コンテナの起動停止(ID頭文字の数文字でも可)
docker stop [コンテナID / コンテナ名]

##コンテナのリソース使用状況
docker stats
# command + c で停止

#その他: バックグラウンドで稼働しているコンテナに接続する場合
docker attach [コンテナID / コンテナ名]

dockerコマンド・オプションについて補足

  • -f: 強制削除、stopされている場合には不要

dockerの設定情報

Dockerの設定情報の表示には、infoオプションを利用します。

CPUs や Total Memoryなどのリソース情報も表示されます。

docker info

Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
  scan: Docker Scan (Docker Inc., v0.6.0)

Server:
 Containers: 2
  Running: 0
  Paused: 0
  Stopped: 2
 Images: 2
 Server Version: 20.10.5
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.10.25-linuxkit
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.776GiB
 Name: docker-desktop
 ID: NFEE:WTKU:EONK:NUEH:R25J:35EV:U5OL:IOQV:HSFM:J2I7:WRNR:AGPJ
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 HTTP Proxy: http.docker.internal:3128
 HTTPS Proxy: http.docker.internal:3128
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

ローカル・コンテナ間のファイルコピー

##コンテナにファイル・コピー
docker cp [ローカルパス] [コンテナID]:/home/rstudio

##ローカルにファイル・コピー
docker cp [コンテナID]:[rockerパス] [ローカルパス]
docker cp [コンテナID]:/home/rstudio [ローカルパス] 

#ローカルコピーの操作例
cd ~/
mkdir test
docker cp [コンテナID]:/home/rstudio ~/test

Dockerコンテナ内のシェルにログインする

コンテナ内のシェルに入るには、docker exec -it を使います。

#コンテナ内にbashで入る
docker exec -it [コンテナID / コンテナ名] /bin/bash
#あるいは
docker exec -it [コンテナID / コンテナ名] bash

dockerコマンド・オプションについて補足

  • -it: -i -t と同じ。 /bin/bash あるいは R のようなインタラクティブなプロセスでは、-itオプションでコンテナのプロセスに対して tty を割り当てる。一方、Rstudio Server使用時には、-it オプションを一般的につけない。

  • -i, --interactive: コンテナプロセスの標準入力表示

  • -t, --tty: コンテナプロセスに擬似TTYの割り当て

その他Dockerイメージのセットアップについて

rocker/tidyverseイメージについて

#rocker/tidyverseイメージのダウンロード・コンテナ起動
docker pull rocker/tidyverse
docker run -d -p 8787:8787 -e ROOT=TRUE -e PASSWORD=PassWord  rocker/tidyverse

rocker/tensorflowイメージについて

rockerで、tensorflowをセットアップする際のTipsです。

#Docker.appの起動(もし起動していないなら)
open /Applications/Docker.app

#rocker/tensorflowイメージのダウンロード・コンテナ起動
docker pull rocker/tensorflow
docker run -d -p 8787:8787 -e ROOT=TRUE -e PASSWORD=PassWord  rocker/tensorflow

# R/tensorflowのCPU起動
docker run -it rocker/ml R

# RStudio/tensorflowのCPU起動
docker run -d -p 8787:8787 -e PASSWORD=PassWord -e ROOT=TRUE rocker/ml

もしrocker/tensorflowでのPython/pipのセットアップするなら、

Rstudio server上でConsole横のTerminalタブに移動して、以下の2つのコマンドを実行します。

sudo apt update
sudo apt install python3 python3-pip

まとめ

5-10分ぐらいで、Rstudio-serverがセットアップできます。いろいろと助かりますね。

補足・参考資料

HomeBrewでインストールした rstudio-serverのアンイストール

brew uninstall rstudio-server
#Uninstalling /usr/local/Cellar/rstudio-server/1.2.5001... (1,366 files, 298.2MB)

#設定ファイルの表示確認
cat /etc/rstudio/rsession.conf
cat /etc/rstudio/rserver.conf

#設定ファイルを消す
sudo rm -rf /etc/rstudio

nginxの設定はそのままでOKだけど、消しても良い。

cat /usr/local/etc/nginx/servers/default.conf
#server {
#    listen 80;
#    server_name localhost;
#location /rstudio/ {
#      rewrite ^/rstudio/(.*)$ /$1 break;
#      proxy_pass http://localhost:8787;
#      proxy_redirect http://localhost:8787/ $scheme://$http_host/rstudio/;
#    }
#  }

rm /usr/local/etc/nginx/servers/default.conf

#nginxを消すなら
brew uninstall nginx

rm -rf \
  /usr/local/etc/nginx \
  /usr/local/etc/nginx/fastcgi.conf \
  /usr/local/etc/nginx/fastcgi.conf.default \
  /usr/local/etc/nginx/fastcgi_params \
  /usr/local/etc/nginx/fastcgi_params.default \
  /usr/local/etc/nginx/koi-utf \
  /usr/local/etc/nginx/koi-win \
  /usr/local/etc/nginx/mime.types \
  /usr/local/etc/nginx/mime.types.default \
  /usr/local/etc/nginx/nginx.conf \
  /usr/local/etc/nginx/nginx.conf.default \
  /usr/local/etc/nginx/scgi_params \
  /usr/local/etc/nginx/scgi_params.default \
  /usr/local/etc/nginx/uwsgi_params \
  /usr/local/etc/nginx/uwsgi_params.default \
  /usr/local/etc/nginx/win-utf

nginxの設定が残っている場合は、http://localhost/rstudio/で、OK

sudo nginx
open http://localhost/rstudio/
#でもアクセス可能なるはず

Docker for Macでのメモリ上限の設定

Docker for Macでのメモリ上限とかを変更するには、 メニューバーのDockerアイコンから、Preferences... に入る。

PreferencesのResourcesパネルをみると CPUs、Memory、Swap、Disk image sizeの設定があるので、 Memory設定を変えることで、メモリ上限を変更できる。

8787ポートの使用有無の確認

ポート使用が重複していると、 うまくRstudio-serverが立ち上がらないので、 補足として述べておく。

#オープンしているポート一覧
sudo lsof

#8787ポート使用の表示
sudo lsof -i:8787

Docker run リファレンス

docs.docker.jp

docs.docker.jp

Docker create リファレンス

docs.docker.jp

参考

qiita.com

medium.com

www.naka-sys.okinawa

www.tohoho-web.com

*1:実際、よく分からないが、、、

*2:なぜか、CUI版はうまく動作しない

*3:ユーザーが作成したイメージ・コンテナをアップロードして公開・共有できるサービスで、自由にダウンロードして環境構築できる。

【Rのジミ〜な小技シリーズ】ベクトルに「含まれる」「含まれない」要素の取り出し、論理値について

はじめに

処理途中で、ある数値・ある文字列が、こっちのベクトルにも含まれるのか、何番目に出現するのか等を考えると、しばしば悩ましい状況となります。。

この記事では、このような、R環境でのベクトル間の関係性を調べる方法を紹介します。きっと、役に立つシーンが多いはずです。

あるベクトルから他ベクトルに「含まれる要素」あるいは「含まれない要素」を抽出する方法

例1: 共通に含まれている要素を取り出す

あるベクトルから他ベクトルに含まれる要素(共通要素)の抽出を実行します。

%in%という特殊な論理子を扱います。

x <- c(1, 2, 3, 4, 5)
y <- c(4, 5, 6, 7, 8)

# x を基準にする場合
a <- x %in% y
a
#[1] FALSE FALSE FALSE  TRUE  TRUE
x0 <- x[a]
x0
#[1] 4 5

# y を基準にする場合
b <- y %in% x
b
#[1]  TRUE  TRUE FALSE FALSE FALSE
y[b]
#[1] 4 5

例2: 共通に含まれない要素を取り出す

ここでは、あるベクトルから他ベクトルに含まれない要素(非共通要素)、x %in% yの論理値の逆を求めます。 つまりは、!でTRUE・FALSEを逆転させます。

x <- c("A", "B", "C", "D", "E")
y <- c("F", "C", "A", "G", "E")

# ベクトル y に含まれない ベクトル x の要素を取り出す
c<- !(x %in% y)
c
#[1] FALSE  TRUE FALSE  TRUE FALSE

x[c]
#[1] "B" "D"

# ベクトル x に含まれない ベクトル y の要素を取り出す
d <- !(y %in% x)
d
#[1]  TRUE FALSE FALSE  TRUE FALSE

y[d]
#[1] "F" "G"

ベクトル間で、「すべて」あるいは「いずれか」と一致する関係があるか?

ここでは、all関数とany関数の使い方を解説します。

z <- c(1, 2, 3)

#ベクトル内のすべてと一致するかで、「TRUE」を返す
all(z == z)
#[1] TRUE

all(z == 1)
#[1] FALSE

#ベクトル内のいずれかと一致するかで、「TRUE」を返す
any(z == z)
#[1] TRUE

any(z == 1)
#[1] TRUE

まとめ

%in%all()any() はマイナーな関数だけど、使える様になれば、プログラムの組み方が広がるはずです。。

参考

kenpg2.seesaa.net

stackoverflow.com

【Rのジミ〜な小技シリーズ】

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

Macで、mds_stores のプロセスを消し出したら、Spotlightとの決別のサインかも!?

Spotlightとの決別

mds_store というMacのプロセスは、Spotlight のインデクスを作成するプロセスです。これに加えて、mdworkerというプロセスもあり、これらのプロセスが良くも悪くも頑張ってくれるお陰で、Macのファイル検索システムであるSpotlight関連の機能を実現されています。

知らず知らずのうちに、mdsプロセスたちが動き出すと、CPU使用率を非常に消費するうえに、Mac本体の温度上昇も半端ないのです。

私の場合、mds_storeが動き出したと気づけば、即座に、アクティビティモニターでプロセスの息の根を止めていました。

ただ、mdsプロセスは大変しぶとく、すぐに復活してきます。。。

mds_storesに対するイライラが域値を超え、Spotlightとの決別を決めました。

【関連キーワード】

  • mds_stores mac cpu

  • mac mds_stores 暴走

  • mac mds_stores 重い

  • mac mds_stores alfred

  • mac mds_stores 是什么

  • mac mds_stores high cpu usage

  • mds_stores cpu big sur

実行環境 & mds_storesのプロセスの止め方

MacOS Catalina (バージョン 10.15.6)

Spotlightとの決別でやることは、 Terminalを立ち上げて、以下のコマンドを打ち込むだけです。

# インデックス作成のOFF設定
$ sudo mdutil -a -i off

# 念のため、再度有効にする場合(インデックス作成のON設定)
$ sudo mdutil -a -i on

他の記事も見る限り、このコマンド実行のポイントは、 すべてのボリュームに適用する -a の 引数をいれることかと思います。

当然、デメリットとしては、Spotlightの機能がまったく使えなくなります。Terminalコマンドで言えば、find は使えますが、Spotlightで動いている mdfind コマンドは全く使えなくなります。

まとめ

mdsプロセス問題、ファイル検索の利便性、どちらを選択するかは貴方次第です。

2020年、Spotlight / mdfind との決別を私は選択しました。

関連情報

「MaryCoreさん」のブログでは、Spotlightのプロセスである「mds」を強制終了する方法が紹介されていました。 Macの「アクティビティモニター.app」を起動して、該当のプロセスを選択し、ツールバーから「終了」を選択するとのことです。 この操作は「自己責任で行ってください。」とのことです。 ただ、この後、Spotlightプロセスは自動的に再起動するようです。 私は何度も試してますが、、、

marycore.jp

yamazさんのブログでは、「mds_storesがCPUを食いまくってたので切った」と報告されていました。同じく、ターミナルで、"sudo mdutil -a -i off"での実行をしているようです。

zenn.dev

「MacBookを快適に!快適なマックライフを~」さんの記事では、mdutilの実行など、詳しく説明されています。

fanblogs.jp