Docker による Windows における OpenFOAM 利用環境の整備

2015年10月29日

はじめに

Docker を使って Windows 上で OpenFOAM 利用環境を整備する方法について。

バージョン

  • OpenFOAM 2.4.0
  • Ubuntu 14.04 LTS
  • Docker Toolbox 1.8.3
  • Xming-mesa 6.9.0.31
  • MobaXterm 8.2
  • Windows 7 64 bit

ファイル

Docker

Docker とは、コンテナ型仮想化技術の一つであり、VirtualBox のような仮想化に比べて動作が軽いのが特徴である。公式の Windows 版 OpenFOAM に用いられている。

Docker は、Linux のコンテナ技術を用いており、コンテナ型仮想化はホスト OS とゲスト OS のカーネルが共通である。したがってこれは Linux 上で Linux を仮想化するものである。Windows では、Docker Toolbox (旧 boot2docker) というもので Docker を利用できるが、これは VirtualBox で仮想化された Linux 仮想マシンにより実現されている。

OpenFOAM は Linux で動くし、Linux で動くものは Linux で動かしたほうがメンテは楽だし、Windows で Docker を動かせるようだし、同じ仮想化でも VirtualBox より Docker のほうが動作は速そうだし…ということで、公式では Docker による Windows 版の提供という判断になったのだろう。

Docker って?コンテナって?

「コンテナ」と呼ばれる Linux 環境の入った仮想的な「箱」を実行すると思えばよろしい。Docker はその「箱」を管理するの。

OpenFOAM for Windows

OpenCFD 版 OpenFOAM for Windows は、現状では boot2docker ベースである。また、ソルバーのコンパイルには今のところ対応していないようだし (2016年3月8日追記: 最新版は対応している模様)、paraFoam も使えない。

いろいろ不満はあるのだが、同様の環境を自分で作れそうな気がしたので、やってみた。

基本情報

ここで整備した環境についての基本情報は、以下の通りである。

  • Ubuntu ベース。
  • SSH で接続。X11 Forwarding で X を使用可能。
  • paraFoam が使える。
  • ソルバーのコンパイルが可能。 ただし、Clang を使用 (C++11 対応済み)。
  • ソースコードのドキュメント化には global を使用。
  • firefox をインストール済み。
  • シェルは zsh。
  • エディタは vim。
  • コンテナのユーザー名は "cfd"。パスも同じ。
  • 作業ディレクトリは Windows のユーザーフォルダの "work"。
    たとえば、ユーザー名が "penguin" だったら "c:\users\penguin\work"。
  • コンテナの "~/user" が Windows のユーザーフォルダになっている。したがって、作業ディレクトリは "~/user/work"。
  • ログインしたら作業ディレクトリに自動的に移動。また、"work" と打ったら作業ディレクトリに移動できる。
  • OpenFOAM のユーザーディレクトリは、ホームディレクトリではなく作業ディレクトリに作成される。

  • イメージ (リポジトリ) 名は "ubuntu-openfoam"。
  • コンテナ名は "cfd-machine"。
  • SSH は Docker 仮想マシン (192.168.99.100 を想定) のポート番号 32779 で接続。

注意: わたしの趣味に合った環境になっているので、気に入らなければ自分でなんとかすること。

セットアップ手順

  1. まず、Docker Toolbox をインストールして、ちゃんと動くことを確認する。"Docker Quickstart Terminal" を実行したらコマンドラインが出るので、そこで "docker version" と打ってエラーが出なければ、たぶんちゃんと動いている。
  2. 上のリンクのファイル "docker-openfoam-*.tar.gz" を展開する。ユーザーフォルダ "c:\user\ユーザー名" にファイルを入れて、Docker のコマンドライン (起動時はユーザーフォルダにいる) で以下を実行。
    $ tar xvzf docker-openfoam-*.tar.gz
    
    "docker" というフォルダができるので、そちらに移動する。
    $ cd docker
    
  3. 今回の環境のベースにする Ubuntu のイメージをダウンロードする。
    $ docker pull ubuntu:14.04
    
    選択するイメージは、Dockerfile の 1 行目 (下記) と合わせる。
    FROM ubuntu:14.04
    
  4. "build_image" を実行。apt-get で OpenFOAM のセットアップなどを行うので、1〜2 時間くらいかかる。
  5. $ ./build_image
    
    "docker images" と打って、"ubuntu-openfoam" という文字があれば OK。
    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    ubuntu-openfoam     latest              6bf11c9b8e1e        22 hours ago        3.047 GB
    ubuntu              14.04               0a17decee413        2 weeks ago         188.4 MB
    
  6. 作業フォルダを作成。
    $ mkdir ~/work
    
  7. SSH の鍵を作成。
    $ ssh-keygen -t rsa
    
    なにか聞かれるが、Enter 連打でよい。
  8. コンテナを実行。
    $ ./run_container
    
  9. SSH でコンテナに接続。
    $ ./ssh_container
    Warning: No xauth data; using fake authentication data for X11 forwarding.
    Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.19.0-30-generic x86_64)
    
     * Documentation:  https://help.ubuntu.com/
    
    The programs included with the Ubuntu system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.
    
    Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
    applicable law.
    
    /usr/bin/xauth:  file /home/cfd/.Xauthority does not exist
    cd ~/user/work
    cfd $                                                    [/home/cfd/user/work]
    
    ここまでできたら、基本設定は OK。"exit" で終了。
  10. "docker" フォルダにパスを通しておく。ユーザーフォルダに .profile というファイルを以下の内容で作成する。
    . ~/.bashrc
    
    また、ユーザーフォルダの .bashrc に以下の行を追加する。
    export PATH=~/docker:$PATH
    

作業環境の準備

作業環境としては、SSH クライアントと X サーバーが必要である。以下の選択肢がある。

  • SSH クライアント + X サーバー
  • MovaXterm

SSH クライアント + X サーバー

SSH クライアントは (設定方法がわかるなら) なんでもよい。ただし、X を使うなら X11 Forwarding と DISPLAY 変数の設定が必要。よくわからなければ、上で用いた "ssh_container" スクリプトを使えばよい。

X サーバーについては、Xming や VcXsrv などがあるが、OpenGL にちゃんと対応していないと ParaView がきちんと動作しない。Xming の Xming-mesa が無難。ここ からダウンロードできる。

Xming の起動は "Xming" のアイコンをクリックすればよい。画面には何も出てこないが、起動していると画面右下の通知領域にアイコンが表示される。それを右クリックして "View Log" を選択すると出てくるログで、DISPLAY 変数の値を確認できる。

winInitMultiWindowWM - DISPLAY=127.0.0.1:0.0

MovaXterm

MovaXterm は、X サーバーを内蔵した SSH クライアントである。ParaView も問題なく動く (少し動作がもっさりするけど)。見た目がゴテゴテしくて好みが分かれそうだが、いちいち X サーバーを立てなくてよいので楽である。

SSH の設定は、"Session" アイコンの "SSH" で行う。ユーザー名やアドレス、ポートについては、上の "基本情報" に書かれているものを設定する。鍵は、"Advanced SSH settings" タブの "Use private key" をオンにして、ユーザーフォルダの ".ssh" の中にある "id_rsa" を指定すればよい。

使い方

使い方は 2 通りある。

  • SSH でログインして作業
  • Windows からコマンドを実行して作業

SSH でログインして作業

作業環境の準備が済んでいれば、以下のようにふつうに OpenFOAM を実行できるはずである。

$ ssh_container

...

cfd $ cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily .
cfd $ cd pitzDaily
cfd $ blockMesh
cfd $ simpleFoam > log
cfd $ paraFoam

コンパイルもできる。

cfd $ cp -r $FOAM_SOLVERS/incompressible/simpleFoam .
cfd $ cd simpleFoam
cfd $ vi Make/files

... "$(FOAM_APPBIN)" を "$(FOAM_USER_APPBIN)" に修正 ...

cfd $ wmake

...

cfd $ which simpleFoam
/home/cfd/user/work/OpenFOAM/cfd-2.4.0/platforms/linux64ClangDPOpt/bin/simpleFoam

バイナリが "work" の中に (つまり Windows 側に) 作成されていることに注意。

Windows からコマンドを実行して作業

見かけ上、コンテナにログインせずに Windows 上で作業することもできなくはない。そのために "ssh_exec" というスクリプトを用意している。以下はすべて Windows 上のコマンドライン。

$ cd ~/work
$ ssh_exec cp -r '$FOAM_TUTORIALS'/incompressible/simpleFoam/pitzDaily .
$ cd pitzDaily
$ ssh_exec blockMesh
$ ssh_exec simpleFoam > log
$ ssh_exec paraFoam

けっして使いやすくはないが、まあ一応できるということで。

アイコンの作成

作業開始時にいちいちコマンドを打つのも面倒なので、"Docker Quickstart Terminal" をもとに起動アイコンを作ってみる。

"Docker Quickstart Terminal" を 2 つコピーして、たとえば "run container"、"terminal" などという名前にする。"run container" のリンク先を "start_docker.sh" に修正し、"terminal" のリンク先を "start_ssh.sh" に修正する。

"start_docker.sh" は、"Docker Quickstart Terminal" が実行している "start.sh" の最後の行を変更したものである。

#exec "$BASH" --login -i
docker/run_container

"run container" を実行すると、Docker 仮想マシンが起動し、コンテナがなければ作成して実行、コンテナがすでにあればそれを再開する。そのあと、"terminal" を実行すると、コンテナに SSH 接続される。

CPU 数とメモリサイズ

コンテナの CPU 数とメモリサイズは、Docker 仮想マシンの設定に従う。設定を変えたい場合は、VirtualBox を起動して、仮想マシンをシャットダウンし (メニュー[仮想マシン]-[閉じる]-[ACPI シャットダウン])、[設定] の [システム] で設定を行う。

その他

コンテナについて

コンテナは、最初の実行で作成され、あとは削除されるまで存在する。コンテナ内部の作業データは、コンテナが存在する限り保持される。

コンテナは Docker 仮想マシンが停止したら当然停止するが、消えるわけではなくて、Docker 仮想マシンが起動したらまた使えるようになる。ただし、仮想マシン起動時はコンテナは停止したままなので、コンテナを使うためには再度実行させる必要がある。

コンテナはコマンドひとつであっさり削除できるため、念のため作業データは Windows 側に置いておくのがよい。

コンテナの再起動

SSH の鍵を作り直したときなど、コンテナの再起動が必要な場合は、次のようにする。

$ docker restart cfd-machine

コンテナの削除

コンテナを初期化したいときは、コンテナを削除すればよい。次のようにする。

$ docker stop cfd-machine
$ docker rm cfd-machine

コンテナ内の作業データはすべて消えるので、注意して行う。Windows 側にある作業フォルダのデータは影響を受けない。

SSH がつながらなくなった場合

イメージの作成を再実行した場合など、SSH がエラーでつながらなくなる場合がある。そのときは、ユーザーフォルダの ".ssh" の中にある "known_hosts" を消せばよい。

SSH の接続ポート番号を変えたい

"docker" フォルダの "params" ファイルの中の "PORT" の値を変えればよい。

パスワードを変えたい

おおもとを変えるには、Dockerfile の以下の行のコロンのあとの文字列を変えればよい。

RUN echo cfd:cfd | chpasswd

ただし、イメージを作り直す必要がある。

コンテナが生きている限りでよければ、ログインして passwd でふつうに変えればよい。

時計がずれる

ソルバーコンパイル時に時刻がずれている旨の警告が出る場合は、コンテナと Windows の時計がずれている。その場合、コンテナのほうではなくて、Windows のほうの時計を時刻サーバーと同時させる。