【環境構築】DockerでFortranを実行できる環境を作る

## 背景
- 学生時代に研究で使っていたFortranをdockerで動かしてみたいと思った。
- 学生時代、Fortranの環境構築で四苦八苦したので自分をdockerで救いたい。

## 目標
- dockerでFortranを実行できる環境を作る。

## Fotranとは？
- 世界初の高級プログラミング言語
- 軽量で計算がとにかく速いので、科学技術系の大規模シミュレーション計算によく使われている。
- スパコンでも現役で使われている模様
https://www.fujitsu.com/jp/about/resources/publications/technicalreview/2020-03/article07.html

## 前提環境
- macOS 11.4 (20F71)
- arm64(M1)

## ファイル構成
```
docker_fortran_ubuntu
├─ Dockerfile          #どんな「docker images」を作るのか記載された設計図みたいなファイル
├─ docker-compose.yml  #「docker container」の起動コマンドをまとめたファイル
├─ hello.f90           #Fortranで「Hello World!」を表示するプログラム
└─ a.out               #Fortranでコンパイル時に生成される実行ファイル（生成されるファイルなので最初はないです）
```

## ファイルの中身

```dockerfile:Dockerfile
FROM ubuntu:latest

RUN apt-get update && \
    apt-get install gfortran -y

WORKDIR /app
```

```yaml:docker-compose.yml
version: '3'

services:
  ubuntu_gfortran:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    stdin_open: true
    tty: true
    volumes:
      - .:/app
```

```fortran:hello.f90
program hello
  write(*, *) 'Hello World!'
end program hello
```

## コンテナの起動からコンテナの中に入る
（1）ymlファイルからコンテナ起動
```bash:
$docker-compose up -d --build
```

（2）コンテナの中に入る（buntu_gfortranの箇所はservice名に応じて変更する）
```bash:
$docker-compose exec ubuntu_gfortran /bin/sh
```

## コンテナ内部でFortranのコンパイルと実行
（1）「hello.f90」をgfortranでコンパイルし、実行ファイルを生成する。
```bash:
$gfortran hello.f90
```

（2）実行ファイル「a.out」を実行する。
```bash:
$./a.out
```

（3）「Hello World!」が表示されれば成功


## ファイルの中身解説あり
```dockerfile:Dockerfile
#ベースイメージとしてubuntuを使用する
FROM ubuntu:latest

#gfortranをinstallする処理
#apt-get install gfortran -yの「-y」はinstallをするかどうかの質問にyesと答えるオプション
RUN apt-get update && \
    apt-get install gfortran -y

#docker内部のコマンド実行場所の指定
#今回はappディレクトリがないので、appディレクトリの作成も同時に行われる
WORKDIR /app
```

```yaml:docker-compose.yml
#docker-composeのファイルバージョンを指定
#ここでは「3」でバージョン3を指定している
version: '3'

services:
  #service名を指定
  #ここでは「ubuntu_gfortran」と指定している
  ubuntu_gfortran:
    #実行時に常に再起動するように指定
    #ここでは「always」で常に再起動を指定している
    restart: always
    #立ち上げの設定を指定
    build:
      #dockerfileの参照先を指定
      #ここでは「.」でカレントディレクトリを指定している
      context: .
      #使用するdockerfile名を指定
      #ここでは「Dockerfile」と指定している
      dockerfile: Dockerfile
    #標準入出力(ターミナル？）をコンテナと結びつける設定
    #ここでは「true」で結びつけている？
    stdin_open: true
    #キーボード入力をコンテナが受け付けるようにする設定
    #ここでは「true」で結びつけている？
    tty: true
    #dockerfileがあるカレントディレクトリとコンテナ内部のディレクトリをマウントする設定
    #ホスト側:コンテナ側　の順番で記載する
    #ここでは、ホスト側「.」でカレント：コンテナ側「/app」でappディレクトリとマウントしている
    volumes:
      - .:/app
```

## 補足
- 本当は軽量イメージのalpineでやりたかったがうまくできなかった。
- そのうち、githubにリポジトリも公開したい。
- 使用される際は引用していただければ、ご自由にどうぞ。

## 参考資料
https://askubuntu.com/questions/523962/how-to-install-a-package-with-apt-without-the-do-you-want-to-continue-y-n-p

https://hub.docker.com/_/ubuntu/tags

https://itneko.blogspot.com/2019/08/ubuntugfortran.html

https://alpine.pkgs.org/3.13/alpine-main-x86_64/gfortran-10.2.1_pre1-r3.apk.html

https://www.nag-j.co.jp/fortran/FI_1.html#:~:text=1%20Fortran%20%E3%81%A8%E3%81%AF&text=Fortran%20%E3%81%AF1950%E5%B9%B4%E4%BB%A3%E3%81%AB,%E4%BD%9C%E6%88%90%E3%81%AB%E9%81%A9%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

## 個人ブログ

https://takuma-tech.com/2022/09/28/297/