Dockerの基礎からOpenFOAMをDockerで使用するまで（MacOS）

## モチベーション
Macを使っていると，大抵の場合は問題ないのですが，一部のアプリケーションをインストールする際，どうしてもネイティブのlinux環境がほしいときがあります．僕の場合，OpenFOAM-extendをインストールしようとした際，MacPortsしかサポートされておらず，Homebrewとのバッティングが嫌で，どうしてもLinux環境がほしいなという状況になりました．
そこでDockerを使ってインストールしてみようとした際に勉強したことを残しておこうと思います．

## Dockerfileの作成
ここに書くと長くなるので，GitHubに置いておきました．

* [simple\_openfoam\-extend\-v4/README\.md at master · nishiys/simple\_openfoam\-extend\-v4](https://github.com/nishiys/simple_openfoam-extend-v4/blob/master/README.md)

### OpenFOAMのインストール
[The Complete Guide to Docker & OpenFOAM · CFD Engine](https://www.cfdengine.com/blog/how-to-install-openfoam-anywhere-with-docker/)

上記記事が非常に丁寧に説明してあり，参考になります．通常のOpenFOAMをインストールする分にはこれで事足ります．

以下で上記記事で採用されているDockerfileを確認できます．

- [simple\-openfoam\-dockerfile/Dockerfile at master · CFDEngine/simple\-openfoam\-dockerfile](https://github.com/CFDEngine/simple-openfoam-dockerfile/blob/master/Dockerfile)

自分の場合OpenFOAM-extend-4.0をインストールする必要があったため，これをベースにしつつ，公式のinstall manualに則ってDockerfileを自作しました．

### Dockerfile作成時の注意点(1)
デフォルトではRUNで行われるコマンドはすべてshのため，bashや他のshellで行う必要のあるコマンドは下記のgithub issuesのスレッドを参考に変更しなければなりません．

* [USER in Dockerfile should change shell for RUN commands · Issue \#8100 · moby/moby](https://github.com/moby/moby/issues/8100)

### Dockerfile作成時の注意点(2)
基本的に毎回のRUNコマンドごとにディレクトリがもとの位置に戻ります．また，$HOMEの位置にも注意が必要です．
cdを複数回使用する場合は注意して，テストしながらDockerfileを作成する必要があります．
必要応じてWORKDIRコマンドでカレントディレクトリを変更すれば書く量が減るかも知れません．

## イメージのビルド
current directoryにDockerfileを用意．イメージのビルドは以下のコマンドで行います．

```
$ docker build -t image_name:tag_name directory-of-Dockerfile
```

```shell

# for example
$ docker build -t nishiys/simple_openfoam-extend-4 .
```

## コンテナの作成とコマンドの実行
「コマンドを叩いたときにコンテナを作成し，コマンドが終わればコンテナを削除する．」というのがDockerの本来の良い使い方らしいです．
毎回コマンドを覚えなくていいようにシェルスクリプト化するか，エイリアスを設定しておくのが良いと思います．

シェルスクリプトの例です．`$ chmod +x docker.sh`で実行権限を付与するのを忘れずに．

```docker.sh
#!/bin/sh
docker container run -ti --rm -v $PWD:/data -w /data image_name /bin/bash

# -ti : enable to use the container as an interactive terminal
# --rm : delete the container when you exit the container
# -v : mount our current working directory ($PWD) as /data in the container
# -w : tell Docker that we’d like to be in /data when the container starts.
# /bin/bash : run bash after entering the container
```


## OpenFOAMの実行と可視化

### 実行
コンテナに入り，以下を実行します．

```shell
# source etc/bashrc to enable environmental variables $FOAM_...  
% fe40
```
あとは通常通りコンテナ内でシミュレーションを行います．

### 可視化
この例では，docker内部にはparaviewなどは入っていません．Mac側に入っているParaviewから実行結果を可視化します．そのためには，シミュレーションのフォルダトップに空の`.foam`形式のファイルを作成するだけです．それをParaviewで開けばすべてのデータが読み込まれるという仕様になっています．

```
$ touch open.foam
```




## その他必須コマンド
* [dockerイメージ・コンテナの操作コマンド集 \- Qiita](https://qiita.com/gogogonkun/items/a634b94b7c3043c21614)

* [Docker コマンドチートシート \- Qiita](https://qiita.com/wMETAw/items/34ba5c980e2a38e548db)

```shell
# show all images
$ docker images -a

# show all containers
$ docker ps -a

# delete a docker image
$ docker rmi image_name

# delete docker images whose REPOSITORY is <none>
$ docker image prune

# delete all containers
$ docker rm `docker ps -a -q`

# delete all inactive containers
$ docker container prune
```


コンテナを抜けたり出たりをする場合は以下のコマンドも必要です．

```shell
# start a docker container
$ docker start <container ID or container NAME>
# enter a container
$ docker attach <container ID or container  NAME>
```

その他イメージの管理関係で必要なコマンド

```shell
# add a tag to an existing image
$ docker image tag original_image_name[:tag_name] new_image_name[:tag_name]

# share your image on Docker Hub
$ docker image push [options] repository_name[:tag_name]

```