目次
はじめに
2021年現在、Pythonでデータ分析・画像解析等を行う機会が増えていると思います。
pip等のパッケージ管理ソフトを使ってグローバルな環境にモジュールをインストールしまくると開発環境がぐちゃぐちゃになって後で後悔しますよね。。
自分が何をインストールしたのか、1か月後には大体覚えていません。色々なコードをテストしているうちに環境はもうめちゃくちゃです。
ということで、Anacondaやpipを使用して仮想環境を構築するのが一般的ですよね。
ところが、このやり方にも問題があります。
先輩!この前もらったPythonのソースコード動かないんですけど…
え!見せてみて!
…あ、後輩ちゃんのPCにはこのモジュールがインストールされてないね。
あとできればエディタは…を使った方がいいかも。Pythonのバージョンは…で!
あとそれから………
色々前準備があるんですね。
開発環境を揃えるのって面倒ですね…
確かに面倒だよね。
他のPCで1から環境を作るのも大変だから
どこへ行くにもこのPCを手放せないんだよねえ。
と、このように複数のPCで開発を行う必要がある場合、開発環境が統一されていないことでソースコードが動かないことが発生するんですよね。。
このような煩わしさを排除するために最近はDocker + VS Code (Remote Containers)を使用しています。
これが非常に便利なため、今回はこの開発環境を作る方法をご紹介します。
記事の目的
- Docker + VS Code (Remote Containers)を使用したPythonの開発環境の作り方をまとめる。
- 実際に使ってみる
メリット・デメリットの確認
Dockerのメリット・デメリット
- Git Hubでcloneするだけで誰でも全く同じ環境で開発ができる
- Pythonのモジュール環境のみならず、ミドルウェアのインストール状況・設定からプロジェクトのソースコードまで管理できる
- PC1台を丸々1つの開発プロジェクトに使用できる感覚
- コンテナ(仮想環境の単位)は生成も削除もすぐできるので精神的に楽
- どのOSからでも他のOS用アプリケーションを実行できる
- “Dockerfile”(開発環境のメモのようなもの)の管理が必須
- Linux OSのファイル構成に詳しくないととっつきづらい
VSCode Remote Coutainersのメリット・デメリット
- リモート環境(起動したコンテナ)に入り込んで開発ができる!!!
- ローカル環境をほとんど汚さない
- Dockerで作ったコンテナ毎にVS Code内の拡張機能を選択できる
- ローカル環境からリモート環境へのファイル操作がグラフィカルで簡単
- どこのPCでも全く同じ開発環境で、快適なコーディングを行うことができる
- docker-composeにも対応しているので複数コンテナの起動もできる
- “devcontainer.json”の管理が必須
環境作成方法
ここからは実際に開発環境を作成していきます。
Git Hubへの登録・設定
まずはGit Hubのアカウント登録が必要です。以下のURLからアカウントを作成して下さい。
Docker Desktopのインストール
次にDocker Desktopをインストールして下さい。
Windows Homeへのインストール方法は以下の公式URLが最も信頼できると思います。
上記URLからも紹介されていると思いますが、Docker Desktop自体は下記URLからインストールできます。
Windows環境では、Dockerを使用するためにWSL2が必須になります。Windows OSのバージョンが1903以上でインストールできます。
OSのバージョンは[Winキー+R]で表示される[ファイルを指定して実行]に、[winver]と入力することで確認できます。
Mac OSやLinuxであれば特に問題無いので、インストール方法を検索してインストールして下さい。インストール方法は入れる時期によって変更されている場合もあるので、できるだけ新しい情報を頼りにして下さい。
VSCodeのインストール
今は最もメジャーなテキストエディタですので、インストールされている方も多いと思いますがされていない方はこちらもインストールして下さい。
VSCode拡張機能 Remote Development(Remote Containers)のインストール
VS Codeがインストールできましたら、今度はVSコードに拡張機能をインストールします。
VS Codeは初期状態ではただのテキストエディタですが、拡張機能をインストールすることで高機能なエディタにカスタマイズできることが特徴です。
VS Codeを起動し、左側のサイドバーのをクリックしてください。
検索が表示されるので
remote development
と入力してください。
一番上に表示されるのマークをクリックし、インストールして下さい。こちらをインストールすると、Remote ContainersがインストールされDockerのコンテナの中でVS Codeが開けるようになります。
その他VSCode拡張機能のインストール
必要はありませんが、インストールしておいて損は無いのでこちらもインストールしておきましょう。
- Git Lens
- Git History
- Docker
- これは必須だったかも…
実際に使ってみる
ここまでで環境構築は終了です。
ここからは実際に使ってみましょう。
Docker Containerを作成+リモートアクセス
まずは適当なフォルダを作り、そこでVS Codeを開きます。
すると左下にマークが出てくるので、こちらをクリックします。
色々とコマンドが出てきますので、
Reopen in Container
を選択します。
[Python3]を選択します。
[3]を選択します。
オプションで追加インストール等聞かれますが、今回はテストのためチェックを外しておきます。(コンテナ生成時間短縮のため)
コンテナが生成されます。今回のやり方だとフル機能のPython環境のコンテナが生成されるので、1.2GBくらいあります。通信環境によっては5分以上かかる可能性があるので待ちます。
右下の表示が以下のようになれば完了しています。
ここまででコンテナを生成し、その中でVS Codeを開くことできました。
ここまでの説明
何が起きたかを振り返ります。
エクスプローラなどから今回テストで作ったフォルダを見ると、”.devcontainer”というフォルダが生成されていることがわかります。
今開かれているVS Codeから中身が見れるので確認してみましょう。
中を見てみると、”devcontainer.json”と”Dockerfile”が存在することがわかります。
それぞれの説明を簡単にします。
”Dockerfile”は、Dockerを使ってコンテナを作るためのファイルになります。このファイルの中でコンテナのイメージファイルの指定や、コンテナ生成時に実行されるコマンド等を書き込んでいきます。
“devcontainer.json”は、Remote containersがこのコンテナにアクセスし、コンテナ内でVS Codeを開くためのファイルになります。主に
- このリモートコンテナをVS Codeが識別するための名前の指定
- Dockerfileの場所と名前の設定
- リモートコンテナアクセス時の引数
- リモートコンテナ内でのVS Codeの設定
- リモートコンテナ内での拡張機能の設定
を管理しています。
“extensions”を見てみると、今拡張機能としてリモートコンテナ内のVS Codeには”ms-python.python”と”ms-python.vscode-pylance”がインストールされていることがわかります。
実際に見てみましょう。確かにPythonとPylanceがインストールされていますね(JupyterはPython拡張機能と依存関係にあるので”devcontainer.json”には記載ないけどインストールされています)。
試しに他の拡張機能をインストールしてみましょう。今回は[indent-rainbow]をインストールしてみます。
カラフルにインデントが表示されるようになりました。
ここで注目して欲しいのが、新しい拡張機能をインストールしたにもかかわらず”extensions”には追加されていないという所です。
これは、もし今動作しているコンテナを破壊してしまうと、コンテナを再生成した際に今入れた拡張機能は自動でインストールされないという事です。
試しに一度VS Codeを閉じ、Docker Desktopから今使っているコンテナを一度破壊してみましょう。
“.devcontainer”があるフォルダを再度VS Codeで開き、左下のを押します。コンテナは破壊したので無いですが、[Reopen in Container]で良いです。勝手に既存のImageファイルからコンテナを再生成してくれます。
再生成されたコンテナの拡張機能の欄を見てみると、先ほどインストールした[indent-rainbow]が無いことがわかります。
これを回避するために、自分で”extensions”に記述を追加する必要があります。
この記述を怠らないことで、Git Hubやその他リポジトリ管理システムを使用して共同開発する際に全く同じ環境で開発することができるようになります。
同様に、コンテナ自体もDockerfileに追加記述をすることで管理します。
どのように記述すればよいのかについては正解が無いためここでは記述しません。
所感
Dockerもリモート接続もこれまで使用した事が無い方は、この記事がさっぱりわからないかもしれません。
私は下の本一冊でDockerとRemote Containersでのコンテナ生成テンプレートを理解することができました。
Kindle Unlimitedだと無料なのでよかったら読んでみてください。
コメント