本番環境(x86)との互換性を保ちながらM1 Mac上で開発できる機械学習環境のDockerセットアップです。Rosetta 2エミュレーションを活用したx86 Dockerコンテナを使用しています。iPadからのリモート開発も可能です。
- x86互換性: 本番環境と同じx86アーキテクチャで動作
- PyTorch対応: x86版PyTorch 2.5.1がプリインストール済み
- Jupyter Lab統合: データ分析作業用のJupyter Lab環境
- VS Code統合: iPadのブラウザからコーディングできるCode-Server環境
- Git/SSH対応: GitHubなどからのリポジトリクローンが可能
- 簡単セットアップ: スクリプト一発で環境構築
- 自動管理: ファイル変更検知による自動リビルド機能
- 永続データ: 再起動時も拡張機能やライブラリを保持
- 完全バックアップ: システムパッケージ、Pythonライブラリ、VS Code拡張機能、設定ファイルすべてをバックアップ
- 自動バックアップ: 定期的なバックアップによるデータ保護
- 環境復元: 再起動時に前回のバックアップから自動復元
- 手動管理: コンテナの自動再起動を無効化し、スクリプトによる制御を実現
Tip
いろいろファイルがありますが、とりあえずこれをやれば使えるようになるので大丈夫です。
# リポジトリをクローン
git clone https://github.com/あなたのユーザー名/リポジトリ名.git
cd リポジトリ名
# 実行権限を付与
chmod +x *.sh
# code-server設定ファイルをサンプルからコピー(推奨)
cp code-server-config.yaml.sample code-server-config.yaml
# code-server設定ファイルのパスワードを変更(重要)
vi code-server-config.yaml
# passwordの値を任意のパスワードに変更
# コンテナを起動(必要なディレクトリは自動作成されます)
./start-container.sh-
ポートの空き状況
# 8080番(Code-Server)と8888番(JupyterLab)が空いているか確認 lsof -i:8080 lsof -i:8888 -
Docker Desktopの設定
- Rosetta 2エミュレーションが有効になっているか確認
- メモリ割り当てが十分か確認(最低4GB推奨)
-
セキュリティ設定
code-server-config.yamlのパスワードを変更したか確認- 外部からアクセスする場合はファイアウォール設定を確認
対話的な入力をスキップしてデフォルト設定で起動する場合、-autoまたは--autoオプションを使用できます:
./start-container.sh --auto自動モードでは以下のデフォルト設定が適用されます:
- 24時間ごとの自動バックアップ(30日間保持)
- JupyterLabとCode-Serverの両方が自動起動
- 前回のバックアップからの自動復元
- すべてのユーザー入力をスキップ
これは、Launch Agent経由での自動起動や、スクリプトでの呼び出しに最適です。例えば、Mac起動時に自動的に環境を立ち上げる場合は以下のようにLaunch Agentを設定できます:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.yourname.ml-env</string>
<key>RunAtLoad</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>cd /path/to/repo && ./start-container.sh --auto</string>
</array>
</dict>
</plist>| ファイル名 | 役割 | 実行方法 |
|---|---|---|
docker-compose.yml |
Docker環境の定義ファイル | - |
Dockerfile |
コンテナのビルド定義 | - |
code-server-config.yaml |
Code-Serverの設定ファイル | - |
code-server-config.yaml.sample |
Code-Server設定ファイルのサンプル | - |
.gitignore |
Gitから除外するファイルの設定 | - |
start-container.sh |
メインの起動スクリプト | ./start-container.sh |
start-jupyter.sh |
Jupyter Lab起動スクリプト | ./start-jupyter.sh |
start-code-server.sh |
Code-Server起動スクリプト | ./start-code-server.sh |
debug-code-server.sh |
Code-Serverのデバッグスクリプト | ./debug-code-server.sh |
quick-test-code-server.sh |
Code-Serverの簡易テストスクリプト | ./quick-test-code-server.sh |
backup-restore.sh |
バックアップと復元用スクリプト | `./backup-restore.sh [backup |
schedule-backup.sh |
定期バックアップのスケジューラ | ./schedule-backup.sh [hours] [days] |
cleanup-old-backups.sh |
古いバックアップを削除するスクリプト | ./cleanup-old-backups.sh [days] |
- MacとiPadが同じWiFiネットワークに接続されていることを確認
- Macのプライベートネットワークアドレスを確認(システム環境設定→ネットワーク)
- iPadのSafari/Chromeブラウザで以下のURLにアクセス:
- JupyterLab:
http://[Macのアドレス]:8888 - Code-Server:
http://[Macのアドレス]:8080 - パスワード:
code-server-config.yamlで設定した値
- JupyterLab:
重要: code-server-config.yamlのパスワードは必ず変更してください。
突然のシャットダウンや電源喪失からデータを保護するため、自動バックアップ機能があります:
- スケジュール設定: コンテナ起動時に自動バックアップの間隔を設定できます
- デフォルト設定: 24時間ごとのバックアップ、30日間保持
- 自動復元: コンテナ再起動時に最新のバックアップから環境を復元
- バックアップ内容:
- インストール済みのPythonパッケージ
- インストール済みのシステムパッケージ(aptでインストールしたもの)
- VS Code拡張機能
- code-serverの設定
- bashヒストリー
- 手動での調整:
# カスタム間隔と保持期間の設定(例:12時間ごと、7日間保持)
./schedule-backup.sh 12 7
# 自動バックアップを無効化
./schedule-backup.sh 0必要に応じて手動でバックアップと復元を行うことも可能です:
# 現在の環境をバックアップ
./backup-restore.sh backup
# バックアップから環境を復元
./backup-restore.sh restore ./backups/ml_env_backup_20250410_120000.tar.gz以下のデータは永続化されます:
ホストディレクトリにマウント(./docker-data/):
- ホームディレクトリのファイル全般
- SSH鍵と設定(~/.ssh)
- bashヒストリーなど
Docker ボリュームに保存:
- code-server 拡張機能と設定
- VSCode ユーザー設定
- pip キャッシュ
- Python ライブラリ
- apt キャッシュ
これにより、コンテナを再起動または再作成しても、インストールした拡張機能やライブラリ、SSH鍵が保持されます。また、バックアップと復元機能により、万が一データが破損した場合でも前の状態に戻すことができます。
# 環境を起動/再起動(最新バックアップから復元するか確認)
./start-container.sh
# 環境を起動/再起動(自動的に最新バックアップから復元)
./start-container.sh --auto./start-jupyter.sh./start-code-server.sh# 詳細なデバッグ情報を表示
./debug-code-server.sh
# 最小設定で動作確認(認証なし)
./quick-test-code-server.sh# 14日より古いバックアップを削除
./cleanup-old-backups.sh 14- M1/M2/M3 Mac(Apple Silicon)
- Docker Desktop for Mac
- Docker DesktopでRosetta 2エミュレーションが有効化されていること
プロジェクトには2つの.gitignoreファイルが含まれています:
- プロジェクトルートの
.gitignore:docker-data/とバックアップファイルをGitから除外code-server-config.yaml(パスワード含む)を除外
docker-data/.gitignore: SSH鍵などの機密情報を除外(自動生成)
これにより、機密情報が誤ってGitにコミットされることを防ぎます。
注意: code-server-config.yamlはGitで管理されません。サンプルファイル(code-server-config.yaml.sample)をコピーして使用してください。
.
├── Dockerfile # x86環境の定義
├── code-server-config.yaml # Code-Serverの設定ファイル(Gitで管理されない)
├── code-server-config.yaml.sample # Code-Server設定ファイルのサンプル
├── .docker_files_hash # Dockerfile差分検査用のハッシュファイル
├── .gitignore # Git除外設定
├── docker-compose.yml # Docker Compose設定
├── start-container.sh # 環境起動スクリプト
├── start-jupyter.sh # Jupyter Lab起動スクリプト
├── start-code-server.sh # Code-Server起動スクリプト
├── debug-code-server.sh # Code-Serverデバッグスクリプト
├── quick-test-code-server.sh # Code-Server簡易テストスクリプト
├── backup-restore.sh # 環境バックアップ/復元スクリプト
├── schedule-backup.sh # 自動バックアップスケジュール設定
├── cleanup-old-backups.sh # 古いバックアップの削除
├── backups/ # バックアップファイル保存ディレクトリ
└── docker-data/ # ホームディレクトリのデータ(~/にマウント)
└── .gitignore # docker-data内の除外設定(自動生成)
コンテナにはSSHクライアントがインストールされており、GitHubなどからSSH経由でリポジトリをクローンできます。
# コンテナ内で実行
ssh-keygen -t ed25519 -C "[email protected]"
# 公開鍵を表示してGitHubに登録
cat ~/.ssh/id_ed25519.pub生成した公開鍵をGitHubの Settings > SSH and GPG keys > New SSH key に追加してください。
SSH鍵は./docker-data/.ssh/に保存されるため、ホスト側からも以下のように確認できます:
# ホスト側から確認
cat ./docker-data/.ssh/id_ed25519.pubホストのSSH鍵を使用したい場合は、コピーすることができます:
# ホスト側で実行(秘密鍵のパーミッションに注意)
cp ~/.ssh/id_ed25519 ./docker-data/.ssh/
cp ~/.ssh/id_ed25519.pub ./docker-data/.ssh/
chmod 600 ./docker-data/.ssh/id_ed25519
chmod 644 ./docker-data/.ssh/id_ed25519.pubSSH鍵の設定後、以下のようにリポジトリをクローンできます:
# 初回接続時はGitHubのホスト鍵を承認
ssh -T [email protected]
# リポジトリをクローン
git clone [email protected]:username/repository.git# ユーザー名とメールアドレスを設定
git config --global user.name "Your Name"
git config --global user.email "[email protected]"注意: SSH鍵は./docker-data/.ssh/に保存されるため、コンテナを再起動しても保持されます。このディレクトリはホスト側からも確認できますが、セキュリティのため適切なパーミッション(700)が設定されています。
Code-Serverのパスワードを変更するには、code-server-config.yamlファイルを編集してください:
bind-addr: 0.0.0.0:8080
auth: password
password: 新しいパスワード
cert: false注意: 現在の設定ファイルにはサンプルパスワードが設定されています。セキュリティのため、必ず変更してください。
変更後の手順:
- コンテナを再ビルド:
docker-compose build - コンテナを再起動:
./start-container.sh
または、コンテナ内で直接編集:
# コンテナ内で実行
vi ~/.config/code-server/config.yaml
# code-serverを再起動
pkill code-server
code-server --config ~/.config/code-server/config.yaml ~# Dockerログを確認
/usr/local/bin/docker-compose logs
# コンテナを強制的に再ビルド
/usr/local/bin/docker-compose down
/usr/local/bin/docker-compose build --no-cache
/usr/local/bin/docker-compose up -d# Code-Serverの状態を詳しく確認
./debug-code-server.sh
# 最小設定でのテスト(認証なし)
./quick-test-code-server.sh
# Code-Serverのプロセスを確認
/usr/local/bin/docker-compose exec ml_env ps aux | grep code-server
# 手動で再起動
/usr/local/bin/docker-compose exec ml_env pkill code-server || true
./start-code-server.sh
# ログを確認しながら起動
/usr/local/bin/docker-compose exec ml_env code-server --config ~/.config/code-server/config.yaml --bind-addr 0.0.0.0:8080 ~よくある原因と解決方法:
-
ポート8080が既に使用されている
# ホスト側で確認 lsof -i:8080 # 別のポートに変更する場合はdocker-compose.ymlを編集
-
設定ファイルの形式エラー
# YAMLの検証 /usr/local/bin/docker-compose exec ml_env cat ~/.config/code-server/config.yaml
-
パスワードの問題
- 特殊文字が含まれている場合は引用符で囲む
- デフォルトパスワードから変更していない
-
Dockerの再ビルドが必要
/usr/local/bin/docker-compose down /usr/local/bin/docker-compose build --no-cache ./start-container.sh
スクリプト内では/usr/local/bin/docker-composeのパスを使用しています。異なるパスにインストールされている場合は、各スクリプト内のDOCKER_COMPOSE変数を修正してください:
# docker-composeの絶対パスを確認
which docker-compose
# 各スクリプトの先頭部分を編集
DOCKER_COMPOSE="/正しいパス/docker-compose"# バックアップファイルの内容を確認
tar -tvf ./backups/ml_env_backup_YYYYMMDD_HHMMSS.tar.gz
# 手動で復元を試みる
./backup-restore.sh restore ./backups/ml_env_backup_YYYYMMDD_HHMMSS.tar.gzコンテナ内の作業ディレクトリは/root(ホームディレクトリ)です。docker-dataディレクトリの内容がここにマウントされるため、ホスト側のdocker-data内のファイルがコンテナ内の/rootで利用できます。
MITライセンス
問題報告や機能リクエストは、GitHubのIssuesで受け付けています。Pull Requestも歓迎します。