Dev Containerによる開発環境の構築-人工知能応用特論I 第4回

232 Views

November 02, 25

スライド概要

東京農工大学大学院先進学際科学府の人工知能応用特論Ⅰの第4回講義資料です.

profile-image

東京農工大学工学部知能情報システム工学科・先進学際科学府 准教授

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

2025年度 人工知能応用特論Ⅰ: 機械学習・データサイエンスのための プログラミング 第4回:Dev Containerによる開発環境の構築 東京農工大学大学院先進学際科学府 山田宏樹 1

2.

スケジュール 第1回:Gitの基礎 第2回:Git・GitHubの実践 第3回:Pythonの環境構築 第4回:Dev Containerによる開発環境の構築 第5回:読みやすいpythonコードの書き方 第6回:pytestを使ったテスト駆動開発 第7回:pytorch-lightningを使った深層学習の実装 第8回:機械学習のプロジェクトにおける実験管理 スケジュールはあくまで暫定的なものです 2

3.

今回の授業の目標 VS CodeのDev Containerを使ったコンテナ環境の構築を学ぶ なぜコンテナ環境が必要か? Python本体のバージョンやライブラリの依存関係の管理 → 第3回講義資料で解説した uv というツールで再現性を担保 Python以外のライブラリやツールはどう管理する? pythonのパッケージには外部ライブラリを必要とするものも多い プロジェクトによって,違うバージョンのCUDAを使いたい場合もある Dockerというツールを使うと,コンテナによる独立した開発環境を構築すること が可能です.コンテナを構築する設計図に外部ライブラリをインストールする設 定をしておけば,いつでも開発環境を再現することができます.DockerをVS Codeで効率よく使う機能がDev Containerです. 3

4.

実行環境 今回の講義で使うツールは以下の通り Docker Desktop Git GitHub GitHub CLI Visual Studio Code (VS Code) 拡張機能:「Dev Containers」も必要です. 講義の課題で,上記のインストールは完了していると思います. 4

5.

目次 1. VS Codeの基礎 VS Codeの画面構成 VS Codeのワークスペース VS Codeのコマンドパレット 2. Dockerの基礎 Dockerとは? Dockerの用語 ボリュームマウントとバインドマウント 3. Dev Containerによるコンテナ環境の構築 Dev Containerの基本 devcontainer.jsonのプロパティと設定例 コンテナの運用方法 5

6.

1. VS Codeの基礎 6

7.

VS Code の画面構成 アクティビティーバー サイドバー エディタ パネル ステータスバー 7

8.

VS codeのワークスペース 一般的に開発プロジェクトに必要な設定ファイルやソースコードは一つのフォル ダにまとめて管理します.gitでは,このフォルダをプロジェクトと呼び,そのフ ォルダの直下で .git が作られていたかと思います. VS Codeでは開発プロジェクトごとの作業環境をワークスペースと呼びます. A Visual Studio Code workspace is the collection of one or more folders that are opened in a VS Code window (instance). In most cases, you will have a single folder opened as the workspace. However, depending on your development workflow, you can include more than one folder, using an advanced configuration called Multi-root workspaces. What is a VS Code workspace? VS Codeではgitのプロジェクトに相当するフォルダをワークスペースとして開 き,開発を進めていくのが基本です. 8

9.

ワークスペースとしてフォルダを開く ワークスペースとしてフォルダを開く方法は5パターンあります. ウィンドウメニューから「File」→「Open Folder...」を選択 コマンドパレットから「File Open Folder ...」を選択 エクスプローラービューを開き「Open Folder」を選択 フォルダをVS Codeのウィンドウに,ドラッグ&ドロップ シェル上で開きたいフォルダまで移動し code . を実行 演習:上のどの方法を使ってもいいので,下記のリポジトリをクローンし て,そのフォルダをワークスペースとして開いてください. https://github.com/koki-yamada-lab/devcontainer_lecture 9

10.

以下のような感じで, devcontainer_lecture がワークスペースとして開くこと ができていればOKです. 10

11.

コマンドパレット コマンドパレットは全てのコマンドを検索・実行できる機能です.各種操作で使 うことが多いので,ショートカットキーを覚えてすぐ開けるようにしましょう. ショートカットキー: Windows/Linux: Ctrl + Shift + P macOS: Command + Shift + P 11

12.

コマンドパレットの使用例 の各種操作を行いたいと思ったとき,コマンドパレットで git と検索してみ ましょう. git 関連のコマンドが候補として表示されます.表示されたコマンド をクリックするとその操作が実行できます. git 12

13.

ファイルのあいまい検索 Windows/Linux: Ctrl + P macOS: Command + P でワークスペース内のファイルをあいまい検索できます.あいまい検索なので, ファイル名の部分一致でも検索されます.また,さっきのコマンドパレットと違 い > が検索の部分に記入されていないことに注意してください.ちなみにこの検 索部分で > を入力するとコマンドを検索できます. 13

14.

2. Dockerの基礎 14

15.

Dockerとは? コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープ ンプラットフォームです. コンテナとは? コードとその全ての依存関係をパッケージ化した,軽量で独立した実行環境 Jupyter Lab, My SQLなど Docker: コンテナを管理 Linux, macOS, Windows 15

16.

コンテナを使うメリット メリット 独立した実行環境:「アプリ+依存関係+設定」をまとめてコンテナに閉じ込 めることで,環境の違いによる問題を回避できる 再現性: Dockerfile に環境構築手順を書いておくことで,同じ開発環境を 再現可能.つまり,開発マシンが変わっても同じ動作を保証できる. 16

17.

Dockerの用語 Dockerfile 「どんな環境を構築するか」を記述したスクリプトファイル.Docker imageの設 計図です. Docker Image Dockerfileから作られる実行可能な環境のテンプレート.Docker imageからDocker containerが作られます.Docker imageをカスタマイズして,新しくDocker image を作ることもできます. Docker container Docker imageをもとに作られる,実際に動く実行環境.Docker imageは不変です が,コンテナは実行時に変更が可能です.ただし,コンテナを削除すると変更内 容も消えます (volumeをマウントしていると変更を保存できる). 17

18.

コンテナへのボリュームのマウント ボリューム: ストレージの1領域を区切ったもの マウント: 「取り付ける」という意味.対象を接続して,支配下に置くこと. コンテナへのボリュームのマウント方法は2種類 「バインドマウント」と「ボリュームマウント」の2種類があります.どちらのマ ウントでも,コンテナを削除してもボリュームに影響はありません. 18

19.

バインドマウント ホスト (コンテナを動かしている側の環境)上の特定のディレクトリをコンテナ内 にマウントすることを指します.ホスト側のディレクトリとコンテナ内にマウン トされたディレクトリは同期されています.つまりコンテナ内でマウントされた ディレクトリの中のファイルを編集したら,ホスト側の同じファイルにもその変 更が反映されます (逆もまた同様です).後述するDev Containerでは,デフォルト でホストのVS Codeのワークスペースがコンテナにバインドマウントされます. 用途 ソースコード等が格納されているディレクトリをコンテナ内にバインドマウ ントして開発を行う ワークスペースの外のデータセットをバインドマウントして,コンテナ内で データセットにアクセスする 19

20.

ボリュームマウント Docker Engineが管理している領域内にボリュームを作成し,コンテナにマウント することを指します.バインドマウントと違って,ホスト側とファイルを同期し たりはしません.コンテナ内で作られるキャッシュや仮想環境をボリュームマウ ントされたディレクトリに保存することで,コンテナの環境構築の高速化を図っ たりすることが可能です.コンテナを削除しても作ったボリュームは削除されな いので,不必要になったらボリュームを削除した方が良いです. 20

21.

3. Dev Containerによるコンテナ環境の構築 21

22.

VS Codeの機能: Dev Container Dockerを使うには,本来はCLIで docker run 等を実行し,コンテナを立ち上げた りなどの操作をする必要があります.しかし,VS Codeが提供しているDev Containerという機能を使えば,プロジェクト専用のDocker開発環境を自動で立 ち上げ,VS Codeから直接操作できるようになります. Dev Containerによりコンテナ環境を作るには? ワークスペース直下に .devcontainer というフォルダを作り,その中に devcontainer.json という設定ファイルを作る必要があります. devcontainer.json に書かれた設定に基づき,Dev Containerはコンテナ環境の 作成・起動を行います. 22

23.

devcontainer.json の設定 はVS Code の Dev Container(開発用コンテナ)環境を定義 する設定ファイルで,「どんなイメージを使うか」「どのフォルダをマウントする か」「どんな拡張機能を入れるか」などを指定します. devcontainer.json を共有することで,同じ開発環境を再現することが可能! devcontainer.json devcontainer.json の設定方法 では,様々なプロパティに対して設定を行っていきます. 主要なプロパティをこの講義では解説しますが,細かいプロパティは以下の公式 サイトで確認しましょう. Dev Container metadata reference devcontainer.json 23

24.

プロパティを説明する前に Dev Containerの起動のしかたは3パターンあります. 既存のDcoker imageを使うパターン → "image"プロパティでDocker imageを指定 Dockerfileを使い,1つのコンテナのみを使うパターン → "build"プロパティで独自のDockerfileを使う設定をする Docker Composeで複数のコンテナを起動するパターン → "dockerComposeFile"プロパティで独自のDocker Compose fileを指定 devcontainer.json では,上記の"image", "build", "dockerComposeFile"のうち 1つのみを指定する必要があり,複数同時には使えないことに注意してください. 本講義では"dockerCompose"を使う設定は扱わないので,興味がある人は以下を 参考にしてください. Docker Compose specific properties 24

25.

devcontainer.json 基本のプロパティ のプロパティ "name"プロパティ コンテナの名前を指定します.コンテナをVS Codeで起動したときにステータス バーに設定した名前が表示されます. 設定例: "name": "Lecture of Dev Container" 25

26.
[beta]
"image"プロパティ

既存のDockerイメージを直接使い,その一つのコンテナのみを起動します.
設定例: "image": ghcr.io/astral-sh/uv:python3.12-alpine
uv は公式のdocker imageを提供しています.(参考:Using uv in Docker)

"build"プロパティ(参考: Image or Dockerfile specifi properties)

Dockerfileを指定してコンテナを起動します.既製の"image"を使う代わりに,カ
スタム環境を構築したいときに使います.以下,設定例:
"build": {
"dockerfile": "Dockerfile",
"context": "."
},

"dockerfile": ビルドに使うDockerfileの場所を指定. .devcontainer フォルダ
の相対パスを指定します.
"context": Docker buildが走るpathを指定. .devcontainer フォルダの相対パ
スを指定します.
26

27.

"runArgs"プロパティ Dev Containerを起動する際に docker run コマンドへ渡す引数を指定するプロパ ティです.オプションの詳細は以下を参照 dockerdocs: docker container run 設定例: "runArgs": [ "--gpus", "all", "--shm-size", "8g", ] "--gpus": コンテナにgpuを追加する ("all"は全てのGPUを追加する).GPUが ないマシンだと,このオプションはつけないようにしましょう. "--shm-size": コンテナに割り当てる共有メモリを指定します.デフォルトが 64MBなので,機械学習のコードを回す時には変更がほぼ必須です.PyTorch はマルチプロセスでデータを読み込む際に共有メモリを使っています. 27

28.

"workspaceMount"プロパティ ホストマシンのどのフォルダを,コンテナ内のどこにマウントするかを指定しま す.デフォルトで,ホスト上のVS Codeで開いているワークスペースフォルダがコ ンテナ内の /workspace/${localWorkspaceFolderBasename} にバインドマウント されるので,基本的には設定しなくても大丈夫です. 設定例(以下はデフォルトの設定です): "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind" "workspaceFolder"プロパティ コンテナ内でVS Codeが「ルートディレクトリ」として扱うフォルダを指定しま す.デフォルトで, /workspace/${localWorkspaceFolderBasename} が設定され るので,基本的には設定しなくても大丈夫です. 設定例(以下はデフォルトの設定です): "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}" 28

29.
[beta]
"features"プロパティ

features機能を使うと,コンテナ内にソフトウェアをインストールすることができ
ます.利用可能なソフトウェアは以下にまとまってます.
Available Dev Container Features
設定例 (common-utilsによるユーザーの作成とgit, GitHub CLIのインストール):
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": "true",
"username": "vscode",
"userUid": "1000",
"userGid": "1000",
"upgradePackages": "true"
},
"ghcr.io/devcontainers/features/git:1": {
"version": "latest",
"ppa": "false"
},
"ghcr.io/devcontainers/features/github-cli:1": {
"version": "latest",
"ppa": "false"
}
},

29

30.
[beta]
(補足) common-utilsを使った初期設定

Dev Containerでは,デフォルトでワークスペースのフォルダがコンテナ内にバイ
ンドマウントされます.コンテナでは何も設定していないとrootユーザーで実行さ
れるので,コンテナ内のrootユーザーでバインドマウントされたフォルダ内のフ
ァイルを書き込んでしまうとそのファイルがroot所有になってしまい,権限の問題
が発生する場合があります.それを避けるために,featuresの common-utils で
usernameが vscode ,ユーザーIDが1000であるユーザーを作成し,そのユーザー
を"remoteUser"と指定するのが良いそうです.(出典: 改訂新版Visual Studio Code
実践ガイド,第7章 開発コンテナ機能)
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": "true",
"username": "vscode",
"userUid": "1000",
"userGid": "1000",
"upgradePackages": "true"
},
},
"remoteUser": "vscode"

30

31.
[beta]
さらに補足

Ubuntu 24.04のDockerイメージから,UID/GID:1000のubuntuというユーザーが
追加されました.そのため,Ubuntu 24.04以降を使用する場合,UID/GID:1000の
ユーザーをcommon-utilsで設定するとエラーが発生します.Ubuntu 24.04を
Docker imageとして使う場合は, common-utils でnon-rootユーザーを作らず
に,"remoteUser"を"ubuntu"とすれば良いようです.
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": "true",
"upgradePackages": "true"
},
},
"remoteUser": "ubuntu"

参考: Ubuntu 24.04 docker images now includes user ubuntu with UID/GID 1000?
参考: Dockerfileを使った簡単な開発環境の構築

31

32.
[beta]
"customizations"プロパティ

コンテナ環境で起動するVS Codeの設定やインストールする拡張機能を定義した
りします.
"customizations": {
"vscode": {
"settings": {
"python.defaultInterpreterPath": "${containerWorkspaceFolder}/.venv/bin/python",
},
"extensions": [
"ms-python.python",
"ms-python.debugpy",
"mhutchie.git-graph",
]
}
}

"python.defaultInterpreterPath"はデフォルトで使うpythonを設定します.上記
設定では,コンテナ内のワークスペースフォルダの仮想環境内のpythonをデ
フォルトで使う設定になってます.
"extensions"はVS Codeに入れる拡張機能を設定します.入れたい拡張機能の
Identifier を記載すれば,その拡張機能がコンテナのVS Codeにインスト
ールされます.

32

33.

(補足) 拡張機能のIdentifierの確認方法 拡張機能ビューで入れたい拡張機能を開くとIdentifierを確認できます 33

34.

devcontainer.json の設定例 ここまでで,主要なプロパティについて紹介しました.これから,2つ devcontainer.json の設定例を紹介するので,これらをベースに自分なりにカス タマイズしてみましょう.特に, 自分に必要な拡張機能は extensions のところに追加 features に自分が使いたいソフトウェアを追加 Dockerfile で使うDocker イメージ変更 Dockerfile に必要なライブラリをインストールするコマンドを追加 はやったほうが良いです. 設定例は以下のリポジトリにおいています. https://github.com/koki-yamada-lab/devcontainer_lecture 1つ目の設定例は devcontainer_bindmount.json 2つ目の設定例は devcontainer_volumemount.json 34

35.
[beta]
シンプルに uv をコンテナで使う設定例
{
"name": "Lecture of Dev Container: Bind Mount Example",
"build": {
"dockerfile": "Dockerfile",
"context": "."
},
"runArgs": [
"--shm-size",
"8g"
],
"containerEnv": {
"TZ": "Asia/Tokyo"
},
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": "true",
"username": "vscode",
"userUid": "1000",
"userGid": "1000",
"upgradePackages": "true"
},
"ghcr.io/devcontainers/features/git:1": {
"version": "latest",
"ppa": "false"
},
"ghcr.io/devcontainers/features/github-cli:1": {
"version": "latest",
"ppa": "false"
}
},
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"mhutchie.git-graph",
"yzhang.markdown-all-in-one"
]
}
},
"remoteUser": "vscode",
"postCreateCommand": "uv sync"
}

35

36.

使っている Dockerfile FROM debian:bookworm-slim RUN apt-get update && apt-get install -y \ tmux \ && rm -rf /var/lib/apt/lists/* COPY --from=ghcr.io/astral-sh/uv:0.9.4 /uv /uvx /bin/ のところで使うdocker imageを指定します RUN apt-get ... のところで必要なライブラリをインストールします. COPY --from=ghcr.io/astral-sh/uv:0.9.4 /uv /uvx /bin/ のところで uv をコンテナにインストールしています. FROM debian:bookworm-slim 36

37.

この設定例の特徴 コンテナ内で uv を使うシンプルな設定例 コンテナ起動後に自動で uv sync が実行され("postCreateCommand"プロパ ティで設定しています), uv の環境が構築されます. このプロジェクトはコンテナ内でしか実行しないという運用をする必要があ ります. ホスト側で uv sync しないようにしましょう. ワークスペースがバインドマウントされているので,コンテナ内で作っ た .venv はホスト側にも保存されます. コンテナ内で作った .venv はホスト側では使えません この .vevn の挙動が気になるなら,次で紹介する .venv をボリュームマウントす る方法を採用するといいかもしれません. 37

38.
[beta]
.venvをボリュームマウントしコンテナの実行環境を分離する
{

}

"name": "Lecture of Dev Container: Volume Mount Example",
"build": {
"dockerfile": "Dockerfile",
"context": "."
},
"runArgs": [
"--shm-size",
"8g"
],
"containerEnv": {
"TZ": "Asia/Tokyo",
"UV_LINK_MODE": "copy",
"UV_CACHE_DIR": "${containerWorkspaceFolder}/.cache/uv"
},
"mounts": [
{
"target": "${containerWorkspaceFolder}/.venv",
"type": "volume"
},
{
"source": "${localWorkspaceFolderBasename}_uv_cache",
"target": "${containerWorkspaceFolder}/.cache",
"type": "volume"
}
],
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": "true",
"username": "vscode",
"userUid": "1000",
"userGid": "1000",
"upgradePackages": "true"
},
"ghcr.io/devcontainers/features/git:1": {
"version": "latest",
"ppa": "false"
},
"ghcr.io/devcontainers/features/github-cli:1": {
"version": "latest",
"ppa": "false"
}
},
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"mhutchie.git-graph",
"yzhang.markdown-all-in-one"
]
}
},
"remoteUser": "vscode",
"postCreateCommand": "sudo chown -R vscode:vscode ${containerWorkspaceFolder}/.cache ${containerWorkspaceFolder}/.venv && uv sync"

38

39.

Dockerfile ひとつ前の設定例と同じものを使ってます. この設定例の特徴 を匿名でボリュームマウントすることで,たとえホスト側に .venv が あったとしてもコンテナ内で .venv を構築・利用するので,ホスト環境を汚 染することがない. また,uvの cache もボリュームマウントしているので,キャッシュを利用し て高速に仮想環境を作ることが可能. ただし,コンテナをrebuildするたびに,新しく .venv の匿名ボリュームが作 られるので,定期的にホスト側で docker volume prune をして使われなくな った匿名ボリュームを削除する必要があります. この設定例は以下の記事を参考にしました. Zenn: uv in Dev Containers .venv 39

40.

コンテナの運用方法 開発をしているとpython以外のライブラリが必要になる場合があると思います. その時は,忘れずに Dockerfile でそのライブラリをインストールするコマンド を追加しておくと,実行環境の再現性が保たれます. 40

41.

実際にあったケース opencv というpythonパッケージを uv add してimportしようとすると ImportError: libGL.so.1: cannot open shared object file: No such file or directory というエラーが出る.これは必要なpython外のライブラリが入っていないと発生 するエラーで, libgl1 と libglib2.0-0 をインストールするとエラーが発生しな くなる.このとき,忘れずに以下のようにDockerfileを変更して,自動でインスト ールできるようにしておくと良いです. FROM debian:bookworm-slim RUN apt-get update && apt-get install -y \ tmux \ libgl1 \ libglib2.0-0 \ && rm -rf /var/lib/apt/lists/* COPY --from=ghcr.io/astral-sh/uv:0.9.4 /uv /uvx /bin/ 41

42.

コンテナでGPU環境を作りたい場合 コンテナ環境でGPUを使った深層学習の実装をしたいことがあると思います.そ の場合は,前述した設定例を以下のように変更しましょう. (PCにはNvidia Driverとnvidia-container-toolkitが入っている必要があります.これ らのインストールについては解説しません.) 1. devcontainer.json の"runArgs"プロパティを変更する "runArgs": [ "--gpus", "all", "--shm-size", "16g", ] GPUを使う場合は, "--gpus", "all" が必要です. 扱うデータのサイズに応じて "--shm-size" で共有メモリのサイズを変えま しょう. 42

43.

2. Dockerfile のdocker imageを変更する 自分が使いたいバージョンのCUDAのDocker imageに変更しましょう. CUDAのDocker imageの選定にあたって以下のことを考える必要があります. 自分のPCのNvidia DriverがどのCUDAバージョンに対応しているか? 入れたいPyTorchやTensorFlow,FlashAttentionなどのライブラリでどのバージ ョンのCUDAが必要か? ベースイメージとして base , runtime , devel のどれを選ぶか?(imageの容 量は base < runtime < devel の順に大きくなります) どのOSを選ぶか?(こだわりがなければ,ubuntu22.04で良いと思います) Nvida Cudaの公式のベースイメージは以下のDocker Hubから探せます. Docker Hub: nvida/cuda 設定例: FROM nvidia/cuda:12.8.1-cudnn-runtime-ubuntu22.04 43

44.

参考資料 森下篤,改訂新版 Visual Studio Code実践ガイド,技術評論社,2024 この本はVS Codeを使い倒すテクニックがたくさん載っていて読んでいて楽しい です.本講義資料もこの本を参考にして作っています.VS Codeを使い倒したい人 はぜひ買って読んでみてください. 44

45.

課題 課題内容 第3回と第4回で学んだ環境構築の方法についての感想・質問を書いて提出してく ださい.最低でも200文字以上書いてください.ファイル名は 学籍番号_名前 _devcontainer としてください.ファイル形式は pdf にしてください. 注意事項 ファイル名と拡張子が正しいか確認すること. 締め切り 日本標準時で次回講義の前日の23:59まで 45

46.

ここまで資料をご覧になっていただきありがとうございます. 資料に間違いがあったり,より良いベストプラクティスがある 場合はご連絡ください.次回以降の講義にフィードバックを活 かします. Twitter: @KokiYamada6 本講義は,学習コストと得られる恩恵のバランスをとっています.より良いベス トプラクティスがあったとしても,学習コストの理由により採用しない場合があ ります.その点についてご了承ください. 46