Slide 1

Slide 1 text

Dev ContainersとGitHub Codespacesの素敵な関係 1 .NETラボ勉強会 10月

Slide 2

Slide 2 text

宣伝:2024年11月6日 Microsoft Developer Day 2 11:40~13:00 .NETラボ勉強会として参戦

Slide 3

Slide 3 text

山田顕人 == Kento.Yamada 自己紹介 3 ● .NETラボ運営、Azure PoC部、Multi Cloud (MSP) Developer ● MSP向け運用分析プラットフォームの開発・次世代監視基盤の開発 ● 新しいサービスの検証 ● 受賞歴(他) ○ Google Cloud Partner Tech Blog Challenge 2023 Cloud AI/ML 部門受賞 ○ LAPRAS OUTPUT AWARD 2024 01 ● 最近のやらかし ○ LINEヤフーさんのフロアに行こうとしたらデジタル庁のフロアに行ってしまった

Slide 4

Slide 4 text

今日話すこと ● 開発環境どうしてる? ● 複数人で開発するときに起きる問題 ● Dev Containersとは ● 開発環境の構成をコンテナとして共有 するメリット ● コンテナイメージは自分で作る必要が あるか ● Dev Containersを最大限に活用する 4 ● GitHub Codespacesとは ● Dev Containersとの関係性 ● GitHub Codespaces でできること ● まとめ ● コンテナを使った開発でよく出る話題

Slide 5

Slide 5 text

Dev Containersを使っていますか 5

Slide 6

Slide 6 text

開発環境どうしてる? 6 ローカル 仮想環境 クラウド

Slide 7

Slide 7 text

複数人で開発するときに起きる問題 7 ローカル 仮想環境 クラウド ● 開発者の数だけ開発環境があるような状態 ● しかし、VMあるいはdockerを使っても環境差異が出る ○ 理由:異なるCPUアーキテクチャの環境

Slide 8

Slide 8 text

開発者の数だけ開発環境があるような状態というと? 8 .NET8を使ってる。プレビューのやつ Code Serverで.NET8を使ってる .NET8を使ってる。rc1のやつ Cursor最高! ローカルVMで作業してる Visual Studio Codeと/NET CLIを使って開発! 異論は認めない! .NET8の最新版を使ってる Visual Studioで.NET8を使っている .NET8を使ってる。rc2のやつ おのおのがやりやすい方法で開発環境を構築している。 個人の生産性は高い反面、設定が標準化されていないために環境差異によって アプリケーションが動かない。

Slide 9

Slide 9 text

複数人で開発するときに起きる問題 9 ローカル 仮想環境 クラウド ● これも開発者の数だけ開発環境があるような状態 ● インストールされているパッケージが統一される ● しかし、これでもCPUアーキテクチャの問題が残る

Slide 10

Slide 10 text

複数人で開発するときに起きる問題 10 ローカル 仮想環境 クラウド ● 動作環境とインストールされているパッケージが統一される ● 環境構築に失敗してもスクラップアンドビルドが簡単 ● しかし、料金がかかることとクラウド環境でのみ開発できるというデメリット

Slide 11

Slide 11 text

Dev Containersとは 11 ローカル 仮想環境 クラウド ● コンテナベースで起動する開発環境(コンテナ上に開発環境を構築) ● VMより起動のオーバーヘッドが小さいため、(比較的に)高速に動作する ● 開発環境の構成をコードで管理できる ローカル環境に仮想環境(コンテナ)を起動して開発ができる仕組み

Slide 12

Slide 12 text

開発環境の構成をコンテナとして共有するメリット 12 再現性 可搬性 変更容易性

Slide 13

Slide 13 text

再現性 13 複数人で開発する時/異なるデバイスを利用している時 以前と同じ開発環境を構築して利用できるかどうか コンテナイメージという単位で管理できているため、同一の環境を起動できる。 ※ただし、前述のとおり、CPUアーキテクチャの違いに注意

Slide 14

Slide 14 text

可搬性 14 開発環境で利用するパッケージなどをどのような環境でも利用できるか ex) コンテナイメージをレジストリにプッシュしてプッシュしたイメージを異なるデ バイスや環境で利用する。

Slide 15

Slide 15 text

変更容易性 15 開発環境で利用するパッケージの追加・削除・変更のしやすさ ex) 新しいバージョンのパッケージがレジストリに降りてきた時にすぐに利用できる

Slide 16

Slide 16 text

コンテナイメージは自分で作る必要があるか 16 結論:ない。用意されているイメージを使ったほうが良い。以下を活用 公式イメージ features ライフサイクル スクリプト マウント

Slide 17

Slide 17 text

Dev Containers用の公式イメージを活用する 17 Microsoft Artifact RegistryにはDev Containersのためのイメージがある。 引用:https://mcr.microsoft.com/en-us/artifact/mar/devcontainers/typescript-node/about

Slide 18

Slide 18 text

features(プラグイン機能)を活用する 18 引用:https://github.com/devcontainers/features Dev Containersに特定の機能(CLI/言語)を追加できる仕組み

Slide 19

Slide 19 text

features(プラグイン機能)を活用する 19 Dev Containersに特定の機能(CLI/言語)を追加できる仕組み

Slide 20

Slide 20 text

セットアップはライフサイクルスクリプトを活用する 20 updateContentCommand initializeCommand onCreateCommand postCreateCommand postStartCommand postAttachCommand コンテナ作成 3Step ホストマシンで実行 コンテナ作成後の アクション ※onCreateCommandはコンテナ作成時のみ1度だけ実行

Slide 21

Slide 21 text

マウント 21 Point: ディスクをマウントするときはマウントタイプに気をつける ● bindマウント ● volumeマウント 引用:https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/

Slide 22

Slide 22 text

補足:Docker Composeでもディスクマウントできるけど何が違う? 22 結論: ボリューム設定をDocker Composeかdevcontainer.jsonに書くかの違いしかない。

Slide 23

Slide 23 text

その他の機能(Dev Containerで設定できること) 23 ほかにも重要な機能があります。 ● containerEnv ● customizations:拡張機能の追加はコレを使う。(よくお世話になる) 他:Dev Container metadata reference

Slide 24

Slide 24 text

複数のDev Containersを使う 結論:独自のサブディレクトリを.devcontainerに作成する 例:ディレクトリツリー ● /.devcontainer ○ /.NET7 ■ devcontainer.json ○ /.NET8 ■ devcontainer.json ○ /.NET9 ■ devcontainer.json 24

Slide 25

Slide 25 text

Dev Containersでコンテナイメージを自分で作る場合 25 結論:制限事項に気をつけておけば良い ※公式のイメージをつかえば、たいていの用途で対応できるのでイラんのだけど 具体例 ● 公式イメージ以外で起動したDev Containersは動作が担保されていない ○ Ubuntuイメージでdockerをインストールして起動するなど

Slide 26

Slide 26 text

Dev Containersはすばらしい! 26

Slide 27

Slide 27 text

え?時代はクラウドIDEだって? 27

Slide 28

Slide 28 text

クラウドIDEをいくつか抜粋 28 クラウドサービスが提供しているものを使うか外部のサービスを使うか ● GitHub Codespaces ● Azure ○ Microsoft Dev Box ● AWS ○ Amazon CodeCatalyst、AWS Cloud9(新規の提供は終了) ● Google Cloud ○ Cloud Workstations ● Google ○ Project IDX

Slide 29

Slide 29 text

GitHub Codespacesとは 29 GitHubが提供する超高速で構築できるクラウド開発環境 引用:https://github.co.jp/features/codespaces

Slide 30

Slide 30 text

GitHub Codespacesの立ち位置 30 ローカル 仮想環境 クラウド ● Dev Containersからシームレスに移行できる ● ローカルと違ってスペックを自由に選択できる(可能な範囲で) ● GitHub/GitHub CLIから起動できる ● 開発環境の標準化 クラウド上で仮想環境を起動する

Slide 31

Slide 31 text

Dev Containersとの関係性 31 Dev Containersの設定ファイル(devcontainer.json)と互換性がある。 ※利用できない設定もある 引用:https://code.visualstudio.com/remote/advancedcontainers/add-local-file-mount つまりはDev ContainersユーザはGitHub Codespacesをすぐに使えるということ!

Slide 32

Slide 32 text

GitHub Codespacesは使い方がよくわからない? 課金がすごそう?主な注意点を見ていくよ 32

Slide 33

Slide 33 text

GitHub Codespacesを使うときの注意点1 33 標準化を意識する。好みを入れない。 引用:開発コンテナーの概要 - GitHub Docs

Slide 34

Slide 34 text

GitHub Codespacesを使うときの注意点2 34 シークレットはGitHubで管理しよう!Environment variables! 引用:リポジトリまたは Organization の開発環境シークレットの管理 - GitHub Enterprise Cloud Docs

Slide 35

Slide 35 text

GitHub Codespacesを使うときの注意点3 35 使用制限を入れておこう。(とくに組織で使う場合は) 引用:GitHub Codespaces の使用制限の管理 - GitHub Enterprise Cloud Docs 個人でも組織でも使用制限を0ドル以上に設定しておくと無料使用を超えた利用を防ぐ ことができる。使用制限に達したあとの使用量には課金されない。

Slide 36

Slide 36 text

GitHub Codespacesを使うときの注意点4 36 codespaceのアイドルタイムアウトと保持期間を設定する 引用:組織での GitHub Codespaces のコストの管理 - GitHub Enterprise Cloud Docs

Slide 37

Slide 37 text

まとめ 37 ● コンテナ使った開発の良いとこ悪いとこを見たYo ● Dev Containersを使うと快適に開発ができるYo ● Dev Containersを使っているならGitHub CodespacesがオススメだYo ● GitHub Codespacesを使ううえで重要なことを振り返ったYo 最後に。。。Dev ContainersとGitHub Codespacesは最後にSがつくYo

Slide 38

Slide 38 text

コンテナを使った開発でよく出る話題など 38

Slide 39

Slide 39 text

開発から本番運用にかけてコンテナイメージのサイズは小さくなる(はず) 39 不要なツールを削除、マルチステージビルドの活用などの過程で アプリケーションを実行するコンテナは小さくなる。

Slide 40

Slide 40 text

Dev Containersに使うコンテナイメージはセルフでホストすべき? 40 結論:ケースバイケースだが、個人的にはセルフホストを推奨 理由:アプリケーションは来歴とSBOMが重要(セキュリティの観点) 来歴:ソフトウェアパッケージをどこからpull(引用)してきたかの歴史、記録 SBOM:ソフトウェアコンポーネントや依存関係の情報も含めたリスト 参考:SLSA- provenance : https://slsa.dev/spec/v0.1/provenance 参考:ソフトウェア管理に向けたSBOM 経済産業省: https://www.meti.go.jp/policy/netsecurity/wg1/sbom_tebiki.pdf

Slide 41

Slide 41 text

distroless imageの利用 41 Googleが提供している必要最小限の依存のみが含まれるコンテナイメージ https://github.com/GoogleContainerTools/distroless コンテナによるアプリケーションで重要なこと ● 脆弱性を可能な限り排除できている ● イメージサイズが必要以上に大きくないこと(小さいことが望ましい) 👉シェルやパッケージマネージャがないため、扱いが難しいが検討の余地はある。 なお、Dev Containersの利用には向いていない。

Slide 42

Slide 42 text

Dev Containers利用時のコンテナ管理ツールは何が良いのか 42 Docker Desktop Rancher Desktop Podman Finch nerdctl crictl Singularity 実際のところ、細かいところに気をつければなんでもOK ※コンテナエンジンのパスやdockerのバージョンなど 引用:Dev Containers Docker options

Slide 43

Slide 43 text

次回予告 43

Slide 44

Slide 44 text

予定 44 ● .NETラボ勉強会 11月 ○ https://dotnetlab.connpass.com/event/334612/ ● .NETラボ勉強会 12月 ○ https://dotnetlab.connpass.com/event/333400/

Slide 45

Slide 45 text

おわり 45 ※余談:GitHub Copilotには少佐という上司がいる説