📡

辿り着いた最高の開発環境はRemoteなDev Containersです

2024/11/27に公開

はじめに

ある程度最高な開発環境は、ポータブルなDev Containersで実現できます。これは前回の記事で紹介しました。

https://zenn.dev/kenfdev/articles/d75f4e59c5763e

ただし、これでも欲が出てきて「より快適な開発環境」を追い求めてしまうのです。その結果、現在私が辿り着いた環境を共有できたらと思います。

文字よりも実践しているところを見たい人は以下動画を参照いただけたらと思います!
https://www.youtube.com/watch?v=6U9GfJ7-qkg

何が不満だったか

「Dev Containers最高!」と言っていたのに、何がまだ不満だったのか。大きくは1点だけです。

それは、 開発環境と本番環境でOSが違っている ことです。

ここで言っているOSは、Mac, Windows, Linuxみたいなレベルの話です(Distributionなどのもうちょっと細かい話は無視してます)。

世の中の多くのサービスはLinux上で動いているのに、開発のときはMacだったりWindows上で行っていることが多いです。最近ではクロスプラットフォーム云々が優秀なので、ほとんど問題になることが無いのですが、たまに地雷を踏むことがあります。

例えば ファイルの大文字・小文字の扱い方の違い です。MacやWindowsは標準では大文字・小文字の区別をしないので、typoとかでミスっていたとしても、以下のようなコードは動きます。

// 本当は `hoge.json` だったとしてもMac/Windowsでは動く
import Hoge from './hoGe.json'

ただし、Linuxは大文字と小文字を区別する ので、上記のコードは意図した動きになりません。今でもたまにこの地雷を踏んでいる人を見かけます。

他にも、OSに依存したネイティブライブラリが関わるときに要注意です。筆者自身この問題にはほぼほぼ当たったことが無いのですが、片方のライブラリがバグっていたりすると悲惨です。こういうときにLinux環境が無かったりすると原因の切り分けに手間どったりします。

Linux で開発した方が良いのでは?

ということで

っていう考えが生まれてくるのです。元からLinuxでメイン機を使っている人は何も気にしなくて良いのですが、そうでは無い人が多数いるはずです。

「Linuxで開発すれば良い」

は、一見シンプルそうなのですが、問題があります。

  • メイン機で使い慣れたツールを手放したくない(Officeとかちょっとしたツールとか)
  • 今からメイン機をLinuxにすると開発体験以外の体験が最初はつらそう...(慣れないといけないので)
  • かと言って2台使いにはなりたくない

「開発だけLinuxにできないものだろうか」

そんな気持ちになってくるはずです!

できます!

メイン機は今まで通り使いつつ、開発だけLinux上でやるという「いいとこ取り」な戦法が使えるのがRemote Dev Containersなのです。

例えば、VS CodeでRemote Dev Containersを設定し、自宅のLinuxサーバーに接続して開発を行います。このようにすることで、普段の作業環境を維持しながらも、Linuxの利便性を享受できます。これにより、開発環境の違いによる問題を大幅に減らしつつ、スムーズな開発が可能になるのです。

新たな問題が浮上

Remote Dev Containersを使えばもう怖いものなし!と思いきや新たな問題が浮上します。Linux機が自宅にあり、自宅でしか開発をしない人はこれで良いかもしれません。ただし、おそらくノートPCなどを持ち運んで、普段とは違う場所でも開発をすることがあるはずです。その場合、

どうやってLinux機に接続するのでしょうか?

ポートフォワードを駆使したり、ポート22だったりを外に公開したりしてどうにかできることにはできますが、セキュアではない です。

もっと楽に、セキュアに接続する手段が無いだろうか?

あります!

そこで登場するのがTailscaleです。

https://tailscale.com/

Tailscaleでどこからでもアクセス

Tailscale を使えば、外出先からでも簡単に自宅のLinuxマシンにアクセスできます。TailscaleはVPNを簡単に構築できるサービスで、Magic DNSなどの機能により、固定IPがなくても安全にネットワーク内の機器にアクセスできます。これにより、出先でも常に最適なLinux環境での開発が可能となり、どこにいても一貫した開発体験を得ることができます。

例えば、出張中でもTailscaleを使って自宅のLinuxマシンに接続することで、自宅と同じ開発環境を利用できます。これにより、ネットワークの違いを気にすることなく、安心して作業を続けることができます。

実際に構築してみる

全部の手順を書くと文量が大変なことになるので、概要だけ記載します。

  1. Linux機を準備する
  2. Linux機にdockerをインストールする
  3. メイン機からLinux機にSSH接続できるようにする
  4. VSCodeで Remote SSH 拡張機能 をインストールする
  5. Remote SSHを使って VSCode からLinux機に接続する
  6. 接続した先で .devcontainer/devcontainer.json ファイルがあれば通常通りdevcontainerが起動できる

という流れです。1-6が満たせたら、メイン機での今までの体験は変わっていないのに、実は開発自体はLinuxで行っているという最高の開発体験が得られます!

公式の手順は↓になります。
https://code.visualstudio.com/docs/remote/ssh

動画で見たい場合は ここから 追っていけば構築できます!

本当に良いことしか無いのか?

筆者はこの環境でWebエンジニアとして何年も開発しているので、大きな問題にはぶつかっていないのですが、デメリットはやっぱりあります。

モバイル開発には向かない

筆者はやったことが無いのですが、Linux環境で開発するからにはiOSの開発は厳しいはずです。現に、Flutterの開発は普通にDev Containers無しでMacbookで開発しました。

GUIが必要になるとつらい

これは最近気付いたのですが、開発機でGUIが必要なるケースがあります。Web開発者であれば例えばPlaywrightのUIを使ったテスト生成などです。これはメイン機でいい感じにGUIだけ動かす、というのが厳しいです。

仕組み的にはLinux側でX11まわりの情報をマウントしつつ、MacでXserverを立ち上げてGUIを転送する、みたいなことができるのですが、パフォーマンスが信じられないほど遅いです。たぶんこれはどうにもできません(どうにかできている人教えて下さい)

現状、どうしてもこれが必要なときはVNCでLinuxにつないでDev Containerで開発しています。SSHを通すとX11が超絶に遅くなるみたいです...。

まとめ: 快適なLinux開発体験を手に入れよう

Remote Dev ContainersとTailscaleを使うことで、Linuxの強力な開発環境と普段使いのMacやWindowsの便利さを両立することができます。これにより、開発体験を最大限に引き上げることができ、Dockerのコンテナ技術やTailscaleを活用したリモート接続により、どこにいても快適に開発を行うことが可能です。

筆者自身、これを実践して数年間開発を行ってきましたが、「もう手放せない」と思えるくらいにはがっつり使えています。特に、異なる環境間での不具合を避け、リモートでも快適に作業できるこの方法は、多くの開発者にとって有益だと思います。

Discussion