まくんの音楽ノート

自由気ままに音楽とプログラミング

VSCodeでSSH先サーバのDockerに入ってPython開発するメモ

音楽系ブログとして始めたのにプログラミング系になってきたこのブログ。

VSCodeユーザ向けに、リモートのサーバ上でDockerコンテナを立ち上げて開発するまでのメモを残します。

環境

  • ローカルマシンのOS: macOS
  • ローカルマシンのVSCode: v1.75.0

  • サーバのOS: LinuxMint 19.03

  • サーバにDockerインストール済み
 [user1@server1] ~ % lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 19.3 Tricia
Release:    19.3

 [user1@server1] ~ % docker --version
Docker version 23.0.0, build e92dd87

LinuxMintではありますが、CLIで使うぶんにはUbuntuと同じように使えます。

Linux Mint 19.03でDockerがv23とあまり見ないバージョンの組み合わせになってますが、気にせずに。 説明用に古いマシンをサーバ代わりに使ってみました。

Dockerのバージョンはひとまず19.03以上を想定しています。

ssh接続でサーバに入れるようにする

今回は接続したいサーバをserver1とします。 ここはご自身の接続したいサーバ名と読み替えてください。

ターミナルでssh server1を打てばserver1に入れるように、sshのconfigで設定してください。 このあたりは ssh config 設定 などで検索すればけっこう出てきます。

ssh接続。ここではserver1上のuser1にログインできるとします

これでVSCodeでリモート接続する際に見えるようになります。

ローカルのVSCodeの準備

ローカルマシンのVSCodeに、以下の拡張機能をインストールしてください。 いずれもMicrosoft公式の拡張で、同系統のアイコンのものです。

  • Remote - SSH
  • Remote Exploler
  • Dev Containers (ローカルでDockerを使わない場合、ここでは不要かも。)

確か Remote - SSH をインストールすれば他も入ったような気がします。 どれかがこれらのバンドルになってたような。

ちょっと前まで Remote - Containerとか名前が違った気がしますが、いつの間に変わってました。 もしかしたら今後も変わるかもしれませんね。

VSCodeでサーバにRemote接続

サイドバーのモニターのようなアイコンを選ぶとリモートエクスプローラという機能で、さきほどssh configで設定したssh先が見えます。

ローカルのコンテナが見えている場合は、上部のプルダウンリストをContainers→リモートに変更すれば出ます。

今回はserver1に接続するので、server1の横のかウィンドウマークをクリックします。 は今のウィンドウで直接開き、ウィンドウマークは新しいウィンドウで出ます。

ローカルマシンからSSHでサーバに接続

Dockerfile等の準備

既に作成済みのコンテナに入る場合はスキップしてください。

以下ではサーバに入った後、開いているディレクトリを変えてDockerコンテナの準備をします。

docker-pythonというディレクトリを親フォルダに Dockerfile, docker-compose.yml, pip用のrequirements.txtを用意して、Python3.10を動かすコンテナを作成します。

ここはご自身の用途に合わせて大きく変わるところだと思うので、参考程度にどうぞ。

Dockerfile

from python:3.10

USER root

ENV TZ=Asia/Tokyo
ENV TERM xterm

RUN apt update && apt install -y zsh

WORKDIR /root/tmp
COPY requirements.txt .
RUN pip install --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt

zshは趣味。

docker-compose.yml

version: "3"
services:
  main:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: 'pythonproj'
    tty: true
    working_dir: /root/workdir
    volumes:
      - ./workdir:/root/workdir

requirements.txt

numpy
pandas
matplotlib

イメージのビルド&コンテナ作成

cd docker-python
docker-compose up -d

これで dockerpython-main というイメージから pythonproj というコンテナが作成されます。

この作り方だと、イメージ名が親ディレクトリ(からハイフンを抜いたもの)-main(サービス名)になります。

サーバ上のコンテナにVSCodeで入る

サーバを開いているVSCodeで再びリモートエクスプローラを選び、プルダウンリストをリモート→Containersに変更するとサーバ上のコンテナ一覧が表示されます。

さきほどと同じ要領で、作成したコンテナに入れます。

サーバ上のVSCodeから、サーバ上のコンテナ一覧を見る

初回、信用できるコンテナにだけ入ってねと警告が出ることがあります。Got Itで進めます

これで、サーバ上のコンテナに入って開発できるようになりました。 ターミナルはサーバではなくコンテナのものになっています。

コンテナ内に入れ、作業ディレクトリで適当にPythonを動かしてみました

拡張機能のインストール

ここまでで既にコンテナ内にVSCodeで入って作業できるようになっています。

Pythonのインテリセンスやデバッグなどの拡張はコンテナ内にインストールする必要があるので、コンテナに入った後にVSCodeの拡張を入れましょう。

Pylanceが一緒に入ります。必須。 ひとまずPython周りはこれで整います。

  • Jupyter

Jupyter Notebookを使う場合は入れるといいです。 Jupyter拡張のNotebookはDockerコンテナのポート開けなくても使えるので、このあたりは需要多いのでは。

以前Dockerコンテナ上でJupyter Labを立てて外部からアクセスする方法についての記事を書いたのですが、複数人で共有しているサーバ上の場合はVSCode拡張のほうが楽です。 ポートフォワーディングの設定をしなくても使えるので。

makungoron-music.hatenablog.com

おわりに

個人的にVSCodeでコンテナに入るメリットをまとめておきます。

  • ローカルでやっているVSCodeの操作感とまったく同じように開発できる
    • ここに尽きますね。インテリセンス、デバッガ等をそのまま使えます。ローカルとのファイルの転送が楽なのもGood。D&Dでローカルから転送できます。
  • ポートの設定なしでJupyter Notebookをサーバ上のコンテナ内で動かせる
    • データ分析などで活躍します。先述のようにポートフォワーディングをわざわざ設定しなくてよいので、サーバ上でも割と気軽に使えます。VSCodeのインテリセンスが効くのもいいですね。ただ、Jupyter拡張版のNotebookはちょっとクセがありますね。

注意点も一応。

  • VSCode Serverが入るぶん、ちょっとコストが高い
    • CLIでやるより多くのリソースを取ります。特にメモリが足りてない環境だと不安定になりやすいです。まあこれはコンテナに入らずとも、リモート接続全般に言えますが。カツカツの場合は注意です。
  • 処理を回しっぱなしにして放置したい場合はCLI
    • 機械学習スクリプトを回して数日放置する…といった場合は、コンテナのVSCode上ではなく、サーバにsshで入ってdocker attach <コンテナ名>を使って入って回し、Ctrl+P→Ctrl+Qでデタッチしたほうがいいです。VSCodeを落として(落ちて)処理が止まった…というのは避けたいですね。
  • コンテナを作り直したとき、VSCode serverの設定をし直す必要がある
    • Python拡張を入れ直したり、コンテナ内でのvscode-settingsなどを設定し直す必要があります。docker runするとき--rmをつけて毎回作りかえる使い方に対しては、その度の設定が増えるので不便かもしれません。

この記事が皆さんのお役に立てば幸いです。