Dockerで、Windows(+WSL2)上にVScode+PythonによるGPU開発＋GUI表示ができる環境を作る

比較的に安全で軽量な仮想環境を作り、それをほかの開発者とも共有できるDocker

Windows＋Docker＋VScode＋PythonでネイティブGPUを使用可能な環境を構築することを目標にいろいろとやってみました。
Gitもインストールしています。

それぞれのStepを踏んでいますが、理解できている人は必須ではないと思います。
GPU環境だけサクッとほしい人はStep4からやればOKです。
devcontainer.jsonへの接続の仕方はStep3に書いているので、Step4,5で準備をしてからStep3の手順に従えば環境が作れると思います。

2025.5/28　Step6 GUIに対応を追加

## Step1.VScodeでpythonを実行する

https://gammasoft.jp/blog/how-to-start-visual-studio-code-for-python/

こちらを参考に。VScodeもPythonもインストール済なのでここはサクサク行きます
すでに環境変数にPythonインタープリターへのPathが通っている状態だったので、ハローワールドはスムーズです。

## Step2.DockerでPythonのコンテナを作ってみる
https://qiita.com/KiYuRo/items/c016eaf5066c6cedaa11

```bash:Pythonコンテナの起動
docker pull python:3.10-slim
docker container run -it --rm python:3.10-slim /bin/bash
```

これでPython3.10のイメージをインストールして、コンテナが起動し、コンテナ内にBashを通して入っている状態になります。
なお、コンテナにはルート権限で入っています。
この状態(コンテナが起動している状態)でVScodeのRemote Development(Dev Containers？)という拡張機能をインストールの上でを使って右下の`><`をクリック、`Attach to Running Contaier`によってVScodeからPythonコンテナに接続することができます。開発も可能です。
なおルート権限なのでホームディレクトリはrootフォルダ直下となります。

またBashやVScodeのターミナルからpipを用いてnumpyなどのライブラリをインストールでき、実行できました。
ただこの状態では以下の点で不便です。
- ファイルの保存ができない
- コンテナ起動のたびにpipでのインストールが必要
- Pylanceがインストールしたライブラリを参照できず、インテリセンスが使えず警告が消えない
    - インストールしてから再接続したらインテリセンス、警告は解決しました。どゆこと…?
    - Pylanceは起動時にしか参照先を更新しないんですかねぇ…？

`sys.executalb #実行中のPythonインタプリタのパスを取得`
`pip show パッケージ名 #ライブラリのインストール先の表示`
`sys.path #python #ライブラリを検索するフォルダを取得`
で見てみてもちゃんとDocker内を見てるんですよね…

https://note.com/shirotabistudy/n/n1ea576db8aeb

## Step3.Dockerfileなどを活用する
Dockerfile, docker-compose, devcontainer.json
を活用していきます。

### Dockerfileを利用する

```bash:Dockerfile
#ベースイメージはPython3.13の最小構成で
FROM python:3.13-slim

#/workspaceというフォルダを作業ディレクトリにする
WORKDIR /workspace

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

# pipのアップデート
RUN pip install --upgrade pip

# pythonパッケージをインストール
RUN pip install --no-cache-dir -r requirements.txt

# コンテナ起動時に実行するコマンドを指定
CMD ["/bin/bash"]
```

インストールするライブラリを以下に記載
```bash:requirements.txt
numpy
```

`docker run -it --rm --name コンテナ名 イメージ名`
これらから必要なライブラリがインストールされたイメージを作成することができるので、ここにアクセスすることで都度手動でインストールする手間は省けます。

ただコンテナを再起動するたびにVScodeのPython拡張機能の再インストールが必要となります。

### docker-compose.ymlを作成する

```yaml:docker-compose.yml
services:                           # サービスを定義しますという決まり文句
  python:                           # pythonという名前でサービスを定義
    image: python:313             # イメージのREPOSITORY名:TAG名を指定
    build: .                        # Dockerfileを相対パスで指定
    container_name: python-313    # 作成されるコンテナ名を指定
    working_dir: /workspace/src     # 作業ディレクトリを指定 (←コンテナ内の作業ディレクトリ
    volumes:                        # マウントするファイルを指定する
      - ./:/workspace/src       # ローカルのカレントディレクトリをコンテナのworkspace/srcにマウント
    tty: true                       # コンテナを起動し続ける
```
KiYuRoさんの記事からほぼコピペさせていただきました。
`docker compose up -d`コマンドでコンテナを起動できます。なお、最初からインストールするライブラリを増やした場合などは、このymlから作ったイメージを消して再度イメージを作成しないと反映されないようなので注意が必要です。一応`docker compose`からはライブラリを追加したimageが作成できましたが、Dockerfileからの再作成にかかる時間との兼ね合いで悩むところですね…

### devcontainer.jsonも用いて、都度インストールする手間を省く
```json:devcontainer.json
{
    "name": "Python VScode",                    // VScodeがコンテナに接続したときのタイトルを自由に設定
    "dockerComposeFile": "docker-compose.yml",  // docker-conpose.ymlファイルを指定
    "service": "python",                        // docker-conpose.ymlファイル内に記載したサービス名を指定
    "workspaceFolder": "/workspace/src",         // VScode接続時に開くフォルダを指定
    "customizations": {
        "vscode": {
            "extensions": [                     // コンテナ作成時にインストールする拡張機能を記載　
                "ms-python.python",             // python拡張機能
                "ms-python.debugpy",            // pythonのデバッガ
                "ms-python.vscode-pylance",     // pythonのインテリセンス
            ],
            "settings": {                       // VScodeの設定を記載
                "files.autoSave": "afterDelay"  // ファイルのオートセーブ
            }
        }
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299179/2c3b1310-88a8-42c0-a77f-95c7e08e8a12.png)



`customization`の`vscode-extension`は拡張機能のIDを貼り付けます。
`vscode-settings`は表示＞コマンドパレットから`open user settings(JSON)`で開けるファイルに中身が一覧で表示されるので必要なものをコピペします。

また、ここからはフォルダ構成をテンプレートに従う必要があります
作業ディレクトリ直下に`.devcontainer`というフォルダを作り、その中に
- devcontainer.json
- docker-compose.yml
- Dockerfile
- requirements.txt
を格納します。
それに合わせてdocker-compose.ymlのvolumesで`./`から`../`に変えておきます

```yml:docker-compose.yml
services:                           # サービスを定義しますという決まり文句
  python:                           # pythonという名前でサービスを定義
    image: python:313             # イメージのREPOSITORY名:TAG名を指定
    build: .                        # Dockerfileを相対パスで指定
    container_name: python-313    # 作成されるコンテナ名を指定
    working_dir: /workspace/src     # 作業ディレクトリを指定 (←コンテナ内の作業ディレクトリ
    volumes:                        # マウントするファイルを指定する
      - ../:/workspace/src       # ←ここを変える
    tty: true                       # コンテナを起動し続ける
```

dokc
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299179/aa3c77c8-d4c3-42a4-a481-e107cb32a36d.png)

作業ディレクトリを選んで…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299179/54fd25d6-e78b-40c2-97f3-e4373272b0d4.png)

もし以下のように聞かれたら作業フォルダを選びます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299179/d51800f2-9bf0-49e0-9b55-2a5087a65eda.png)

左下の`><`からコンテナで再度開くを選んで再接続すればDocker上でのPython開発が可能です！
なお終了時は同じく右下経由からリモート接続を終了するを押さないと、コンテナが終了されず、再試行したときに名前がコンフリクトしてエラーとなります。
その際はBashからDockerコマンドを用いて稼働しているコンテナを止めてあげる必要があります。

この手順でWindows＋Docker＋VScode＋Pythonでの開発環境ができました。

https://hub.docker.com/_/python

https://qiita.com/c0a21030/items/6f88c249955bd2ad7ed7

https://zenn.dev/tom_tan/articles/9af1818fcde7d2


## Step3.5 WSLのDockerからDockerコンテナを開く

https://qiita.com/haveAbook/items/0d0ae20a19214f65e7cd

https://qiita.com/kamiryo/items/a8807440ff780f5e16c9

Docker for Windowsはプランによっては有料であることから、Linux向けのDockerを使用することが好まれます。
上のリンクを参考にWSL2をインストールし、WSL2経由でDockerをインストールします。

WSL2にログインし、そこのコマンドプロンプトから作業ディレクトリに移動します。
そこから`code .`コマンドを打つことでWSL経由でVScodeを開くことができます。
あとはStep3と同じ手順でWSL上で稼働するDockerの中でのPython開発ができました。
ただしこの手法だとWSL上のフォルダでは作業できても、Windows上に作成している作業フォルダではエラーが発生してしまいます。

なので以下を参考にDev Containers(開発コンテナ)拡張機能のExecute in WSLタグを有効化します。参考にしたURLでは多分GUIに関する設定についても言及されていましたが、自分には理解できなかったのと、これでWSL上のDockerコンテナにアクセスできたのでいいことにします。 ~~CLIから逃げるな~~

これで作業フォルダにて`code .`コマンドを打ち、Dockerコンテナを(自動的に)起動・接続することで
WSL上で稼働するPython実行環境を持ったDockerに、Windows上のVScodeから接続して開発することが可能となります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299179/062be87b-c800-48dd-a889-c5978d079aae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299179/c253ce76-aca2-45f3-9a31-1aad08d63f5d.png)


https://zenn.dev/rhene/articles/docker-on-wsl2-for-vscode

## Step4 GPUが動作するようにする

https://www.nvidia.com/ja-jp/drivers/

PCにnvidia-driverがインストールされていない場合は上記URLから自分の環境にあったドライバをインストールします。ドライバが古い場合はCUDAとのバージョンエラーが起きるので更新も検討してください。更新した場合はWSLも再起動しましょう。

WSL上のDockerを使用する場合は続いてnvidia-Container-Toolkitをインストールします。
(Windows版のDockerを使用する場合には不要なようです)


https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

自分の環境に合わせたコマンドをポチポチしていくだけです。

:::note alert
自身のLinuxディストリビューションに加え、Dockerインストール後にやるやつ(同ページの下の方にある)のコマンドも実行しましょう
:::

:::note warn
うまくいかないときは以下のファイルをいじってみるといいかもしれません
/etc/nvidia-container-runtime/config.toml
内の以下
no-cgroups = false/true
:::

https://github.com/NVIDIA/nvidia-container-toolkit

https://qiita.com/psymonmarkrine/items/c2111d713371dac38653

## Step5 ローカルGPU上でPyTorchを実行できるようにする

https://pytorch.org/get-started/locally/

まずPyTorchの方から欲しいPyTorchのバージョンと対応するCUDAを選びます。
今回は2.7.0(安定板)、Windows、PIPインストール、Python版、CUDA12.8を選んでみました。
Run this Commandで`pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128`と表示されました。

これをこのままrequirements.txtに書き込んでしまうとエラーが出てしまうので以下のように書き換えました。
```bash:requirements.txt
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
```

続いてDocker hubからCUDAのイメージを選びます

https://www.nvidia.com/content/dam/en-zz/ja/Solutions/cloud/NGC-User-Guide_JA.pdf

https://hub.docker.com/r/nvidia/cuda


>base： 事前ビルドされたCUDAアプリケーションを展開するための最小構成のイメージ。CUDA Toolkit 9.0以降のみ。
>runtime： CUDA toolkitから全ての共有ライブラリを追加したCUDA実行用のイメージ。
>devel： 共有ライブラリだけでなくコンパイラーチェーン、デバッグ用ツール、スタティックライブラリなどが追加されたCUDA開発用のイメージ。

以下より引用

https://qiita.com/tamahassam/items/a877dc85d224ec6c2aab

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

# 作業ディレクトリ
WORKDIR /script

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

# 必要なツールをインストール
# 比較的新しいバージョンのPythonはaptの公式のライブラリに存在しません
# なので新しいPythonが必要な場合はそれがあるディストリビューションからとってきます
# セキュリティ上の問題がある場合は自力でコンパイルすことになるかと思います
RUN apt-get update && apt-get install -y \
    software-properties-common \
    wget \
    git \
    build-essential \
    curl \
    && add-apt-repository ppa:deadsnakes/ppa \
    && apt-get update && apt-get install -y \
    python3.13 \
    && rm -rf /var/lib/apt/lists/*

# Pythonのシンボリックリンクを作成
# インストールしたPythonのバージョンと同じものを
RUN ln -s $(which python3.13) /usr/bin/python

# pipのインストール（distutils なしで問題なく動作する方法）
RUN curl -sSL https://bootstrap.pypa.io/get-pip.py | python

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

# 必要なPythonライブラリをインストール
RUN pip install --no-cache-dir -r requirements.txt
```

また、GPUを認識するようにdocker-compose.ymlとdevcontainer.jsonも書き換えます。
docker-compose.ymlではGPUを使うことを明記します。
また、devcontainer.jsonでは起動時にGPUを使用する、というコマンドを送るようにしてあげます。--shm-sizeは…よくわかりませんでした。使用せずに起動し、問題があるならある程度の値を渡してあげるのはいいかもしれません。

```yml:docker-compose.yml
services:                           # サービスを定義しますという決まり文句
  python:                           # pythonという名前でサービスを定義
    image: cuda:12_8             # イメージのREPOSITORY名:TAG名を指定
    build: .                        # Dockerfileを相対パスで指定
    container_name: cuda_12_8    # 作成されるコンテナ名を指定
    working_dir: /workspace/src     # 作業ディレクトリを指定 (←コンテナ内の作業ディレクトリ
    volumes:                        # マウントするファイルを指定する
      -  ../:/workspace/src       # ローカルのカレントディレクトリをコンテナのworkspace/srcにマウント
    tty: true                       # コンテナを起動し続ける
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]
```

```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のインテリセンス
            ],
            "settings": {                       // VScodeの設定を記載
                "files.autoSave": "afterDelay"  // ファイルのオートセーブ
            }
        }
    }
}
```


こちらを多いに参考にさせていただきました！

https://note.com/tokoyono_mezu/n/n1f75bc095b14

https://scrapbox.io/bbr-software-memo/DevContainer%E3%81%A7GPU%E3%82%92%E4%BD%BF%E3%81%86

Pythonのビルドはこのようにできるらしい(まだやってない)

https://zenn.dev/exmedia/articles/python-venv-on-wsl2

```python:main.py
import torch

print(torch.cuda.is_available())
print(torch.cuda.device_count())
print(torch.cuda.get_device_name())
```
これらでGPUが認識されていればOKです！

## Step5.5(注釈)
WSL2上のDockerからGPUを触るためには、WSL2でnvidia-container-toolkitのインストールが必要なようです。
逆にDocker desktopからの場合はローカルには不要らしい？？

## Step6 GUIに対応する(25.5/28追記)
標準的なDocker環境ではGUI表示、すなわちWindowの表示ができないので、そのままではMatplotlibなどで都合が悪いのでそこに対応します。

```yml:docker-compose.yml
services:                           # サービスを定義しますという決まり文句
  python:                           # pythonという名前でサービスを定義
    image: cuda:12_8             # イメージのREPOSITORY名:TAG名を指定
    build: .                        # Dockerfileを相対パスで指定
    container_name: cuda_12_8    # 作成されるコンテナ名を指定
    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]

```

```bash:Dockerfile
# CUDA 12.8 + Python 3.1 環境
# nvidia/以下のcuda~から、Docker hubから探してくるといいでしょう
FROM nvcr.io/nvidia/cuda:12.8.0-cudnn-runtime-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 \
    python3-pil \
    python3-tk \
    python3-pil.imagetk \
    tk-dev \
    x11-apps \
    && rm -rf /var/lib/apt/lists/*

# 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
```


```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のインテリセンス
            ],
            "settings": {                       // VScodeの設定を記載
                "files.autoSave": "afterDelay",  // ファイルのオートセーブ
                //rootに作った仮想環境にPathを通します
                "python.defaultInterpreterPath": "/root/venv/bin/python3.12",
                //デバッグ時にターミナルをクリアする
                "debug.terminal.clearBeforeReusing": true

            }
        }
    }
}

```

好きなパッケージをインストールします
```text: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
```

また、この表示をDockerから受け取るためにはXサーバーを立てる必要があります。
今回は無料で広く使われているというvcxsrvをインストールしました。

https://sourceforge.net/projects/vcxsrv/

実行時に以下にチェックを入れると楽ですが、セキュリティ上の懸念がある場合にはポートを設定します。(未施行)
なんならチェック入れないでも同一環境なLocalHostで問題なく動作する感じ？？
概念としてはこちらのページが参考になる感じかも

https://www.iwaxlab.com/articles?id=14

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299179/5ba153b7-9a3b-483c-9b94-d8bed54a7ce8.png)

これで以下のサンプルコードが表示されれば成功です！
```python:sample.py
import numpy as np
import matplotlib.pyplot as plt

a = np.arange(5)
print(a)

x = np.arange(5)
y = np.random.random_integers(0,10, 5)

plt.plot(x, y)
plt.show()

```

## まとめ
Dockerを用いて、Windows上のVScodeでGPUを用いたPython開発を行う方法をまとめました。
DockerfileにてGitも入れているので、ターミナルからのgitコマンドにも反応してくれます。
Dockerを使うことで、ごちゃごちゃとしてローカルを汚しがちなPython＋GPUでの開発環境を作れるのは大きな魅力だと思います。Docker、Gitなど、プログラミング以外のところの勉強を多く要するのがプログラム開発のつらいところですが、この記事がDockerでの環境設定の役に立ってくれれば幸いです！

## コマンドメモ

自分用チートシート。適宜追加予定です。

### ～Docker～
```shell:コマンドたち
#docker hubからDocker Imageをダウンロードする
docker pull イメージ名:バージョン(latestも可だが、バージョン指定が望ましい)

#docker hub内のイメージを検索する
docker search イメージ名
#ローカルにいるDocker Imageを一覧で表示する
docker images

#Dockerイメージの作成履歴を見る
docker history イメージ名

#イメージを消す
docker rmi イメージ名
docker rmi -f $(docker images -a -q) #イメージをすべて消す

#稼働中のコンテナを表示する
docker ps
-a(--all):停止しているコンテナも表示する

#稼働中コンテナの状況をリアルタイム表示する
docker stats

#Docker imageからDocker containerを作成して実行する
docker run イメージ名
--name:コンテナに名前を付ける
-d:コンテナをバックグラウンドで動作させる
-e:環境変数をセットする
ex. -e KEY:VALUE
-p:ホストのポートとコンテナ内のポートを関連付ける
ex. -p 80:80
--rm:終了時に自動的にコンテナを削除する
-v(--Volume):ホストのPathをコンテナ内にマウントする
ex. -v ホストのパス:コンテナ内のパス

#bashを用いて指定したコンテナの中に入る
docker exec -it コンテナ名 bash

#Docker containerを止める
docker start コンテナ名    #再開
docker stop コンテナ名     #停止
docker restart コンテナ名  #再起動
docker rm コンテナ名       #削除
-f:なんかうまく消えない時に強制的に消す
docker rm ｰf $(docker ps -a -q) #コンテナを全部削除
docker system prune       #停止中のコンテナと無名のイメージをすべて消す
#稼働しているコンテナを強制的に全て消すとき
docker rm ｰf $(docker ps -a -q)
docker rm ｰvf $(docker ps -a -q) #ボリュームごと消えるので注意


#DockerImageを作成する
##起動中のコンテナからイメージを作成する
docker commit コンテナ名 イメージ名
##DockerfileからDockerimageを作成する
##作業フォルダ内にDockerfileなどの必要なファイルがあること
docker build --tag イメージ名 .
```

https://qiita.com/noralife/items/18301143c20cc5172c56

https://qiita.com/wMETAw/items/34ba5c980e2a38e548db

https://kinsta.com/jp/blog/docker-remove-images/

https://qiita.com/t-yotsu/items/559731aca6300eef78ec


### ~docker compose~
```bash:コマンドたち
docker compose build #docker-compose.ymlからのイメージのビルド
docker compose up #composeの起動
docker compose down #composeの停止
docker compose rm コンポーズ名 #composeの削除
docker compose images #作成したイメージの一覧
docker compose ps -a #起動したコンポーズの一覧(-aオプションで停止中も含む)

#すべてのDocker composeを消す
docker-compose down --rmi all --volumes --remove-orphans
```
https://qiita.com/souichirou/items/6e701f6469822a641bdd

https://qiita.com/suin/items/19d65e191b96a0079417


## ～Git/Github～
```bash:Git
git init            #作業ディレクトリの初期化
git add ファイル名/. #ファイルや全ツリーを追加
git commit          #追加したファイルなどをコミット
git commit --amend  #現在のステージでローカルリポジトリをしゅうせい
git rm              #ファイルの削除
git mv
git status          #ファイルの変更状況を表示
git diff            #ファイルの変更内容を表示

git checkout --ファイル名/フォルダ名/.  #ローカルファイルの変更を戻す
git reset HEAD ファイル名/フォルダ名/.  #
/home/.gitconfig:UserやURLなどのユーザーデータを保存
.gitignore .gitの親ディレクトリに保存、gitしないファイルなどを指定
```


## トラブルメモ
### -volumeキーワードによるWindowsのフォルダと仮想環境のフォルダをマウントできない
```sh:docker
#-v --volumeタグにてホストのフォルダをDocker containerのフォルダにマウントできる
docker -v (windows Path):(docker container path)

#Windows PowerShellからの実行の場合は
#下記のようにPathの最初にスラッシュが2つ必要
 docker run --volume //c/Users/myName/Documents/dockerTest://usr/share/nginx/html 
```
https://wiki.fukuchiharuki.me/?%E9%9A%9C%E5%AE%B3%E3%83%A1%E3%83%A2/Docker+for+Windows%E3%81%A7%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84

### ファイルの保存ができない
Step3.5で発生。Linux上のファイルパーミッションが影響していそう
どうしても解決できず、ファイルを作り直しました…
ファイルの作成などはVScode上でやることを徹底した方がよさそうですね…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299179/b4fe3e95-b25f-43a4-aad4-248543800b49.png)

### CUDAのイメージが実行できない

:::note alert
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running prestart hook #0: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: requirement error: unsatisfied condition: cuda>=12.8, please update your driver to a newer version, or use an earlier cuda container: unknown
:::

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-12-0-release-notes

CUDAのバージョン毎に最低限のnvidia driverのバージョンがありますので、必要に応じてアップデートしてください


## その他参考にした資料
Udemyの講座。4時間で学べると

https://www.udemy.com/share/103iSk3@-7o8Oyt3QBlXHN9aYeqyaAB9D9d0VFk0DUJ6Cm-jfMd8s2UH2G4YIt00Hu0O92YJ1g==/

他、ネット上のあまたの資料と、ChatGPTに感謝します