GromacsをDockerでインストール

VSCodeのターミナルにて作業を行うことを想定している
なおDocker desktopにて動作を確認

# Docker環境の作成

https://qiita.com/Ag_smith/items/2432375399e7d7868138

こちらをDockerfileに落とし込んだだけ
以前作成したPytorch+GPU用のDocker環境を流用しているためPythonなどもインストールされることに注意
このDockerfileにて後半のVMD用のライブラリもインストールしておく

```bash:Dockerfile
# CUDA 12.8 + Python 3.11 環境
# nvidia/以下のcuda~から、Docker hubから探してくるといいでしょう
FROM nvcr.io/nvidia/cuda:12.8.0-cudnn-devel-ubuntu24.04

# 作業ディレクトリ
WORKDIR /workspace/src

# タイムゾーンの選択を自動化する
ENV DEBIAN_FRONTEND=noninteractive
RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && echo "Asia/Tokyo" > /etc/timezone

# 必要なツールをインストール
# 比較的新しいバージョンのPythonはaptの公式のライブラリに存在しません
# なので新しいPythonが必要な場合はそれがあるディストリビューションからとってきます
# セキュリティ上の問題がある場合は自力でコンパイルすことになるかと思います
# ppaディストリビューションから取ってきた場合はTkinterの関係でトラブルが生じたので
# バージョンをある程度許容してTkinterに対応するようにします
# Python3.12まではディストリビューションにあるようなのでそこから取ってきます
# 仮想環境にPipインストールしないとエラーが出てしまうのでpythonXXX-venvも入れます
# Libx関係はXサーバー関係なようですがよくわかりません…
# x11-appsも入れているのでxeyesというLinuxプログラムが動くはずなので
# ターミナルからのxeyesの実行でエラーが生じるのであればXサーバー関係の通信に問題があるのでしょう
RUN apt-get update && apt-get install -y \
    software-properties-common \
    wget \
    git \
    build-essential \
    curl \
    python3.12 \
    python3.12-venv \
    python3-pip \
    libx11-dev \
    libxext-dev \
    libxrender-dev \
    libx11-6 \
    libxext6 \
    libxrender1 \
    python3-pil \
    python3-tk \
    python3-pil.imagetk \
    tk-dev \
    x11-apps \
    libssl-dev \
    zlib1g-dev \
    libncurses5-dev \
    pkg-config \
    cmake \
    libfftw3-dev \
    libglu1-mesa \
    libgl1 \
    libxi6 \
    libxrandr2 \
    libxcursor1 \
    libxinerama1 \
    libxxf86vm1 \
    libdbus-1-3 \
    && rm -rf /var/lib/apt/lists/*

# CMAKEのインストール
RUN cd /tmp && \
    mkdir cmake_latest && \
    wget https://github.com/Kitware/CMake/releases/download/v3.31.6/cmake-3.31.6.tar.gz && \
    tar zxvf cmake-3.31.6.tar.gz && \
    cd cmake-3.31.6 && \
    ./bootstrap --prefix=/opt/cmake/3.31.6 --parallel=4 && \
    make -j4 && \
    make install
# パスを通す（必要に応じて）
ENV PATH="/opt/cmake/3.31.6/bin:${PATH}"

# Gromacsのインストール
# GROMACS のビルド（Dockerfile内に入れる場合）
RUN cd /tmp && \
    curl -LO https://ftp.gromacs.org/gromacs/gromacs-2025.2.tar.gz && \
    tar zxvf gromacs-2025.2.tar.gz && \
    cd gromacs-2025.2 && mkdir build && cd build && \
    cmake .. \
        -DCMAKE_INSTALL_PREFIX=/opt/gromacs/2025.2 \
        -DCMAKE_C_COMPILER=gcc \
        -DCMAKE_CXX_COMPILER=g++ \
        -DGMX_MPI=OFF \
        -DGMX_DOUBLE=OFF \
        -DGMX_OPENMP=ON \
        -DGMX_GPU=CUDA && \
    make -j$(nproc) && \
    make install
ENV PATH="/opt/gromacs/2025.2/bin:${PATH}"

# Pythonのシンボリックリンクを作成
# インストールしたPythonのバージョンと同じものを
# 仮想環境のPythonを使うことにするので不要でいいでしょう
# RUN ln -s $(which python3.12) /usr/bin/python

# pipのインストール（distutils なしで問題なく動作する方法）
# pipはapt-getからのインストールに変更しています
# RUN curl -sSL https://bootstrap.pypa.io/get-pip.py | python

#requirements.txtをコンテナ内にコピーする
COPY requirements.txt ./

# 必要なPythonライブラリをインストール

# 共通領域にpipでインストールすると「環境を汚すな」と怒られるようになったようです@Ubuntu24.04以降
#RUN pip install --upgrade --break-system-packages pip
#RUN pip install --no-cache-dir -r --break-system-packages requirements.txt

# なぜか作業ディレクトリには仮想環境を作ってくれませんでした…
# RUN python3 -m venv /workspace/src/venv \
#     && /workspace/src/venv/bin/pip install --upgrade pip \
#     && /workspace/src/venv/bin/pip install --no-cache-dir -r requirements.txt

# /rootにはうまく作れたのでそこにpip installしています
RUN python3.12 -m venv /root/venv \
    && /root/venv/bin/pip install --upgrade pip \
    && /root/venv/bin/pip install --no-cache-dir -r requirements.txt

# Gitの設定を行う
RUN git config --global core.editor 'code --wait'
```

```json:devcontainer.json
{
    "name": "Python VScode GPU",                    // VScodeがコンテナに接続したときのタイトルを自由に設定
    "dockerComposeFile": "docker-compose.yml",  // docker-conpose.ymlファイルを指定
    "service": "python",                        // docker-conpose.ymlファイル内に記載したサービス名を指定
    "workspaceFolder": "/workspace/src",         // VScode接続時に開くフォルダを指定
    "runArgs": ["--gpus", "all", "--shm-size", "64gb"], //GPUを使うことを明記、--shm-sizeはよくわからん…
    "customizations": {
        "vscode": {
            "extensions": [                     // コンテナ作成時にインストールする拡張機能を記載
                "ms-python.python",             // python拡張機能
                "ms-python.debugpy",            // pythonのデバッガ
                "ms-python.vscode-pylance",     // pythonのインテリセンス
                "mechatroner.rainbow-csv",       //CSV操作の拡張機能
                "donjayamanne.githistory",      //Gitのツリーを見る
                "eamodio.gitlens"               //Gitlens
            ],
            "settings": {                       // VScodeの設定を記載
                "files.autoSave": "afterDelay",  // ファイルのオートセーブ
                //rootに作った仮想環境にPathを通します
                "python.defaultInterpreterPath": "/root/venv/bin/python3.12",
                //デバッグ時にターミナルをクリアする
                "debug.terminal.clearBeforeReusing": true

            }
        }
    }
}
```

```yml:docker-compose.yml
services:                           # サービスを定義しますという決まり文句
  python:                           # pythonという名前でサービスを定義
    image: cuda:12_8             # イメージのREPOSITORY名:TAG名を指定
    build: .                        # Dockerfileを相対パスで指定
    container_name: gromacs    # 作成されるコンテナ名を指定
    working_dir: /workspace/src     # 作業ディレクトリを指定 (←コンテナ内の作業ディレクトリ
    volumes:                        # マウントするファイルを指定する
      -  ../:/workspace/src       # ローカルのカレントディレクトリをコンテナのworkspace/srcにマウント
      # WSLg
      # 2つ目の方は不要かもしれません。。。
      - /tmp/.X11-unix:/tmp/.X11-unix
      - /mnt/wslg:/mnt/wslg
    environment:
      # WSLg
      # WSLgを使うものについては未検証です。。。
      # - DISPLAY=$DISPLAY
      # - WAYLAND_DISPLAY=$WAYLAND_DISPLAY
      # - XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR
      # - PULSE_SERVER=$PULSE_SERVER
      # VcXsrv
      # ディスプレイをDocker上のLinuxからWindowsに送るように指示する
      DISPLAY: host.docker.internal:0.0
    tty: true                       # コンテナを起動し続ける
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]
```

```tex:requirements.txt
numpy
pandas
polars
matplotlib
seaborn
scikit-learn
torch --index-url https://download.pytorch.org/whl/cu128
torchvision --index-url https://download.pytorch.org/whl/cu128
torchaudio --index-url https://download.pytorch.org/whl/cu128
```

`gmx --version`コマンドが動作することを確認する

# VMDをインストールする

https://dajiro.com/entry/2021/04/11/221704

VMDはダウンロードにライセンス処理が必要なので、Dockerfileに含めることはできない。
下記からダウンロードして作業ディレクトリに置いておくこと

https://www.ks.uiuc.edu/Research/vmd/

```bash:コマンド

#VMD圧縮ファイルを解凍
# ダウンロードしたファイル名に合わせて変更すること
tar -xzvf vmd-1.9.4a57.bin.LINUXAMD64-CUDA102-OptiX650-OSPRay185.opengl.tar.gz
# 生成されたフォルダ名に応じて変更すること
cd vmd-1.9.4a57

# Makefileの作成
# Configureファイル内でインストール先のディレクトリをいじれる
./configure
# コンパイルの実行
cd src
make install
```

インストールに成功すれば`vmd`コマンドにて起動できる。
なおXサーバーが必要となるので事前にインストールの上で起動しておくこと