ROOTでおさらいするDockerの使い方

Docker のコマンドを使わないとすぐ忘れてしまうので覚え書き。

Releases | ROOT a Data analysis Framework

これを見てると今は CentOS, Fedora, Ubuntu, mac, そして Windows (復活してる!) のバイナリが配布されているようだけど、少し前は Scientific LinuxMac のバイナリだけが配布されていて、研究室に新たな学生が来たらまずビルドさせるところから、みたいな感じがあった。これを Docker 使ったら簡単に、みんなのバージョンを合わせつつできないかということでやってみた。Jupyter に ROOT のカーネルをつけた Docker Image をつくりたいので、その前段階として。

インストールとイメージ作成

今回は最近借り出したさくらVPSCentOS 7 に Docker を入れてやってみる。インストールは一応 yum で一発でできる。

sudo yum install docker

インストールしたら、以下で Docker のデーモンが動く。多分。このあたりはよく分かってない。

sudo systemctl start docker

ROOT の Dokerfile は公式にある。

https://hub.docker.com/r/rootproject/root-ubuntu16/

sudo docker pull rootproject/root-ubuntu16

で Docker Image をつくることができる。Linux だと毎回 sudo するのが面倒。

sudo docker images

すると以下のように ROOT のイメージができている。

REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
docker.io/rootproject/root-ubuntu16   latest              e36801b84e23        5 weeks ago         1.6 GB

なお IMAGE ID について、全部打つ必要はなく一意に決まれば良くて、例えば今の場合 e とだけ指定すれば起動したりできるということをさっきドットインストールを見て知った。

https://dotinstall.com/lessons/basic_docker/27705

起動

今回の場合つくった image からコンテナをつくって起動するのに、 docker run しようとしたら

docker-runc not installed on system.

というエラーが出た。

これは以下を参考に、

centos7 - docker-runc not installed on system - Stack Overflow

cd /usr/libexec/docker/
sudo ln -s docker-runc-current docker-runc 

してからデーモンを走らせ直して解決。

sudo docker run docker.io/rootproject/root-ubuntu16 -it

のようにすれば

   -------------------------------------------------------------------------
  | Welcome to ROOT 6.12/07                             http://root.cern.ch |
  |                                            (c) 1995-2017, The ROOT Team |
  | Built for linuxx8664gcc                                                 |
  | From heads/v6-12-00-patches@v6-12-06-46-g7a7d314, Jun 15 2018, 18:29:00 |
  | Try '.help', '.demo', '.license', '.credits', '.quit'/'.q'              |
   -------------------------------------------------------------------------

root [0]

のように表示されて ROOT が起動したはず。今の場合、Image ID が e36801b84e23 で、

sudo docker run -it e

としても一意に決まる場合はOK。 -itインタラクティブなシェルを始めるオプション。

ボリュームのマウント

これだけだと何もできないので、ボリュームをマウントして、ローカルでつくったスクリプトを走らせる。マウントするには、docker run -v ローカルの場所:コンテナ上で場所 というように指定する。ローカルに ~/test/test.cpp という 'hello world' を出力するスクリプトがあるとして、~/test をコンテナ上で /var/lib/docker/volumes/test にマウントして実行するような場合を仮定すると、

sudo docker run -v ~/test:/var/lib/docker/volumes/test docker.io/rootproject/root-ubuntu16 root -b /var/lib/docker/volumes/test/test.cpp

という感じ。あるいは bash で入って実行しても良い。

sudo docker run -it -v ~/test:/var/lib/docker/volumes/test docker.io/rootproject/root-ubuntu16 bash
root -b /var/lib/docker/volumes/test/test.cpp

今回は X11 を設定していない。あとボリューム周りは複雑そうなので「docker ボリューム永続化」でググるといろいろ情報が出てくる。

今回使ったコマンドまとめ

  • docker pull: イメージを取ってくる
  • docker images: イメージ一覧を表示
  • docker run: 新しいコンテナの起動