📑

VS Code+DevContainer+Dockerで最強Python開発環境(Remote編)

2024/11/28に公開

概要

本書の内容

前回の続きで、VS CodeとDockerを利用したPython用開発環境(リモート接続編)の設定/利用方法を説明します。前回の利便性をそのままに、機械学習を目的としたGPUサーバーでの開発等が可能になります。
本書で実現する開発環境の概略図は以下です。

前提

  • 下記のソフトウェアがインストール済みであること
    • LocalMachine
      • SSHクライアント(macOSや、Windowに、デフォルトでインストールされています)
      • VS Code と VSCode拡張(Remote Development)
    • RemoteMachine
      • SSHサーバー
      • Docker
      • DockerCompose
  • Remoteマシンにアカウントがあり、SSHコマンドでIDとパスワードでログインできること

手順

Step1 SSH公開鍵認証の設定

LocalMachineからRemoteMachineへのSSH接続をするための設定を行います。

  1. 鍵ペア(秘密鍵・公開鍵)の作成
    macOS上で、以下のコマンドで鍵ペアを作成する。以下は実行例。

    % ssh-keygen
    Generating public/private ed25519 key pair.
    Enter file in which to save the key (/Users/XXX/.ssh/id_ed25519):   # ファイル名に拘りなければ入力不要
    Enter passphrase (empty for no passphrase):                         # パスフレーズは入力不要
    Enter same passphrase again:                                        # パスフレーズは入力不要
    Your identification has been saved in /Users/XXX/.ssh/id_ed25519
    Your public key has been saved in /Users/XXX/.ssh/id_ed25519.pub
    The key fingerprint is:
    SHA256:IwXngB9bBNn5681nGKizvpNSs5nc/bkUQd2CXsUeel4 XXX@PXXXnoMacBook-Pro.local
    The key's randomart image is:
    +--[ED25519 256]--+
    |     .+=o.   ..+o|
    |    . o=+   ..o.+|
    (省略)
    |      o.  . .. oE|
    |      . S  o  + .|
    +----[SHA256]-----+
    

    ${HOME}/.ssh/の下に、id_ed25519id_ed25519.pubが作成される

  2. 公開鍵情報を控える
    macOS上で、以下のように公開鍵の内容を控える(クリップボードにコピーする)

    % cat ~/.ssh/id_ed25519.pub
    ssh-ed25519 AAAAC3Nz(省略)S0OnA XXX@XXXnoMacBook-Pro.local
    
  3. RemoteMachineに公開鍵を設定する
    SSHでRemoteMachineにログインし、公開鍵を設定する。以下はUbuntu上での実行例

    $ cd # HOMEディレクトリに移動
    $ mkdir -p ~/.ssh # .sshフォルダがなければ作成
    $ echo "コピーした公開鍵のテキスト" >> ~/.ssh/authorized_keys # 鍵情報の追加書き込み
    $ chmod 600 ~/.ssh/authorized_keys # パーミッション設定
    
  4. SSHクライアントの接続先設定
    macOS上で、~/.ssh/configをなければ作成し、下記のテキストを記載する。

    Host HOGEHOGE                      # 任意のID
        User xxx                       # RemoteMachineにログインするID
        HostName 192.168.0.xx          # RemoteMachineのホスト名 or IPアドレス
        IdentityFile ~/.ssh/id_ed25519 # 秘密鍵のパス
    
  5. RemoteMachineにSSHログインできるか確認
    macOSのターミなるでSSHログインをパスワードなしで行えることを確認する

    % ssh HOGEHOGE
    

Step2 VS-CodeでRemote-SSH接続

LocalHostのVS-Codeから、RemoteMachineに接続します。

  1. VSCodenのコマンドパレットからConnect Current Window to Host...を実行

    コマンドパレットは、Macならば、+Shift+P、それ以外はCtrl+Shift+P で開くことができます。
    Connect Current Window to Host...がドロップダウンリストに現れない場合は、コマンドパレットにsshとタイプしてみてください。

  2. 目的の接続先を選択

    ~/.ssh/configの Host として記載したIDが表示されます。
    今回はHOGEHOGEを選択します。

  3. 接続確認

    上記はSSH接続後のVS-Code画面です。
    画面左下に注目すると、>< SSH: HOGEHOGE のように、SSHで接続されている状態であることが確認できます。
    この状態のVS-Codeは、リモートマシンでVS-Codeを起動している状態と同じなので、TERMINALでは、リモートマシンのコマンドが実行できます。

Step3 RemoteMachineでのコンテナ開発

残りは、前回と同様です。
リモートマシン上に、コンテナ開発一式をセットアップします
(SSH接続されたVS-Codeで作業します)。

  • コンテナ開発用のファイル一式を配置(前回のStep1)
  • VSCodeコマンドパレットから ReopenContainer を実行(前回のStep2)

ポイントはWorkspaceRootに.devcontainerフォルダがあり、その中にコンテナ関連ファイルが3点あることです。

(VScode Workspace root)
|-- .devcontainer/
|   |-- Dockerfile
|   |-- devcontainer.json
|   `-- docker-compose.yml
`-- sample.py

各ファイルの中身は以下の通りです。

.devcontainer/Dockerfile
.devcontainer/Dockerfile
FROM python:3.10
USER root

RUN apt-get update && \
    apt-get -y install --reinstall ca-certificates && \
    apt-get -y install software-properties-common && \
    pip install --upgrade pip

# Install Basic Packages
RUN pip install ipykernel jupyter
.devcontainer/devcontainer.json
.devcontainer/devcontainer.json
{
    "name": "python",
    "dockerComposeFile": "docker-compose.yml",
    "service": "workspace",
    "workspaceFolder": "/workspace",
    "customizations": {
        "vscode": {
            "extensions": [
                "ms-python.python",
                "ms-toolsai.jupyter"
            ],
            "settings": {
                "workbench.colorCustomizations": {
                    "titleBar.activeBackground": "#19549C",
                    "titleBar.activeForeground": "#ffffff",
                    "activityBar.background": "#02A7E3",
                    "activityBar.foreground": "#ffffff"
                }
            }
        }
    }
}
.devcontainer/docker-compose.yml
.devcontainer/docker-compose.yml
version: '3'

services:
workspace:
    build:
    context: ..
    dockerfile: .devcontainer/Dockerfile
    environment:
    PYTHONPATH: /workspace
    volumes:
    - ..:/workspace
    command: sleep infinity
sample.py
sample.py
# %%
import sys
print(f"Python version {sys.version}")

最後に

今回紹介した内容により、手元のPC(macOS, Windows)のVS-Codeから、GPUサーバーやクラウドのVMからRaspberryPiまで、さまざまなリモートマシンにアクセスして開発を行うことができます。
ご活用いただけますと幸いです。

参考

Aidemy Tech Blog

Discussion