$30 off During Our Annual Pro Sale. View Details »

最強のDev Containerを考える

最強のDev Containerを考える

昨今のアプリケーションはDockerコンテナで運用されることが多いです。
VS Codeのリモートコンテナ機能は、開発環境をもDev Containerと呼ばれるDockerコンテナの中に収めて、ローカルと同様の操作性で開発が進められるようにする先進的な機能です。
発表者は、VS Codeに留まらずDev Containerを使った開発方法が近い未来の当たり前の開発環境になるのではないかと考えています。
そんなDev Containerの構築方法に絞って、以下の様なトピックをお話します。
- Dev Containerを今すぐ作って開発を始める方法
リモートコンテナ機能を使うことの利点はなにか
- Dev Containerにはどんなことが設定できるか
- Dev Containerの中には何を入れるべきか
- 本番アプリコンテナに近いDev Containerを作るにはどのような方法があるか

74th(Atsushi Morimoto)

November 21, 2020
Tweet

More Decks by 74th(Atsushi Morimoto)

Other Decks in Technology

Transcript

  1. 最強の Dev Container を考える Atsushi Morimoto @74th

  2. Atsushi Morimoto (@74th) 株式会社Mobility Technologies AI技術開発部プロダクトグループ AI技術をタクシー事業者向けのプロダクトにして 最後ドライバーさんに提供するデータの表現や データのインフラに責任を持つサーバサイドエンジニア

  3. VS Code関連の活動 https://techbookfest.org/organization/6283189395914752 VS Codeの機能や3つの言語での実践的な開発方法を解説した 「Visual Studio Code実践ガイド」や 技術書典で VS

    Code関連同人誌を作っています。
  4. VS Code関連の活動 - Visual Studio Code Debug Specs 様々な言語・環境のVS Codeでのデバッグ手法を集めたリポジトリ

    - Vim Style(メンテ終了) 世界最速リリースのVimキーバインド拡張機能 - Editing Snippets with YAML YAMLでスニペットを編集する拡張機能 - Monokai Charcoral High Contrast Theme - High Contrast Icons
  5. AGENDA 1. Remote Developmentで手に入れたもの 2. Dev Containerはどうあるべきか 3. Multi Stage

    Buildを使ったDev Containerを極める 4. Dev Containerの将来
  6. 詳しい内容は…… https://techbookfest.org/product/ 4696850535809024

  7. AGENDA 1. Remote Developmentで手に入れたもの 2. Dev Containerはどうあるべきか 3. Multi Stage

    Buildを使ったDev Containerを極める 4. Dev Containerの将来
  8. 一般的な開発環境 一つのマシンに全てのツールをインストールして使うのが、 一般的な開発環境です

  9. Remote Development (SSH) Computing Resourceの外部化 VS CodeのRemote Development機能によって クラウドなどの外部に開発環境を持つことができます 開発環境のComputing

    Resourceの外部化と言えます
  10. Dev Container Remote Container機能では 同一マシン内の Dockerに開発環境を構築できます

  11. Github Codespaces Github Codespacesは クラウドのDockerコンテナサービスということができ、 Dockerコンテナ化した開発環境を オンデマンドに得ることができます

  12. Dev Containerの功績 環境構築手順のコード化を強制する(Dockerfile) • 環境構築にコード化されていない手順がないことを証明している • 本番環境と同一であることを証明できる 環境を運搬可能にする(Dockerコンテナ)

  13. .devcontainer/devcontainer.jsonの功績 開発環境のコンテナ化を"定義"した • コンテナ定義 Dockerfile / docker-compose.yaml / image •

    ユーザ名 vscode • ワークスペースマウント /workspace • コンテナ起動後コマンド postCommand ローカル環境に依存する要素(ワークスペース、UID)をまとめた
  14. AGENDA 1. Remote Developmentで手に入れたもの 2. Dev Containerはどうあるべきか 3. Multi Stage

    Buildを使ったDev Containerを極める 4. Dev Containerの将来
  15. 実行時に使うもの アプリケーション実行時にはそのアプリケーションだけで動作することは少なく、 依存するライブラリや、そのアプリケーションのランタイムが必要になります

  16. 今までDockerコンテナが担ってきたこと 今までのDockerコンテナは、 ランタイムと依存するライブラリを収めることだけを責務に持つことが多かったと思います

  17. 開発時に使うもの 一方開発環境には、ライブラリとランタイム以外にも LinterやTest Runnerなどが必要になります

  18. リモートコンテナでDev Containerの中にあるもの では開発時にコンテナには何を収めるべきか考えると これら全てをコンテナの中で実行する必要があります

  19. Dev Containerを作るときに必要なもの Application CodeやTest Codeはリポジトリから与えられるため 実際にDev Containerの中に収めるべきものはこれだけになります なかなか大変ですが、これらが Dev Containerに収めるべきものと考えられます

  20. 雑に考える 複雑そうなDev Containerについて考えましたが、 一旦それらを捨てて簡単な Dev Contaienrの責務を考えます

  21. PackageManagerを後から実行する 昨今は言語に応じた様々な Package Managerがあり 多くのライブラリや開発時に使うプログラムは Package Managerに定義であるManifestを与えることで インストールできます ManifestはApplication Codeの一部であることが多いです

    つまり、Package ManagerさえあればDev Containerの機能を満 たすとも言えます
  22. AGENDA 1. Remote Developmentで手に入れたもの 2. Dev Containerはどうあるべきか 3. Multi Stage

    Buildを使ったDev Containerを極める 4. Dev Containerの将来 ここからは先程考えた Dev Containerの責務をよりよく満たすために、 Multi Stage Buildを使ったDev Containerの構築方法を紹介します
  23. Multi Stage Build FROM golang:1.13 AS build-env WORKDIR /work RUN

    ... FROM build-env AS production RUN ... CMD [...] Multi Stage BuildはDockerコンテナのbuildを段階に分けることができる機能です build-envというコンテナから productionコンテナを作る例です
  24. 成し遂げたいこと • Production Container、もしくはコンパイル時に、 Dev Containerで同じライブラリを使う • Production Containerには開発ツールを入れないこと よりよいDev

    Containerにするために このようなことを成し遂げたいと考えます
  25. Go Goのビルドについてまず解説します Goのビルドでは、go.mod、go.sumという依存ライブラリの定義 manifestファイルがあります これを使うと依存するライブラリの指定したバージョンをインストールできます コードとこのライブラリを用いて、 Application Binaryをビルドします

  26. Goの Multi Stage Build Goで一般的に行われる Multi Stage Buildの場合 Goのコンパイラの入ったコンテナでビルドを行い、 Application

    Binaryだけを別のコンテナにコピーすることが よく行われます
  27. Build Containerと同じライブラリを持つために、 依存ライブラリだけを収めた baseコンテナを作ります このコンテナから、 Dev Containerとbuild Containerを 作ることで要件を満たすことができます

  28. Dockerfile • 動作するものを公開中 https://github.com/74th/devcontainer-book-go/blob/master/Dockerfile • VS Code公式が公開するDebian用スクリプトを実行して Dev Container環境を作る https://github.com/microsoft/vscode-dev-containers/blob/master/script-library/common-debian.sh

    • Go用のDev Container構築スクリプトもある、こちらも実行する https://github.com/microsoft/vscode-dev-containers/blob/master/script-library/go-debian.sh • 最近、ビルド及びリント(CI)用コンテナは Dev Containerのイメージで良い気がしてきている 今回のDockerfileはgithubで公開しています また、Dev Containerを作るにはMicrosoftの公開するスクリプトを使うと、 さっとDev Contanerのための環境を作ることができます Goの開発ツール郡をインストールをするスクリプトもあります。 そして、私は最近 CI環境のコンテナは Dev Containerを流用するのが良いように思えてきました
  29. PythonでPoetryを使ったDev Cotainerを考えると このようになるでしょう

  30. AGENDA 1. Remote Developmentで手に入れたもの 2. Dev Containerはどうあるべきか 3. Multi Stage

    Buildを使ったDev Containerを極める 4. Dev Containerの将来
  31. Dev Containerの将来 MS公式見解などではなく、@74th の頭の中の考えです • リモートコンテナ機能は VS Code のオープンソースではない VS

    Codeに閉じた機能である • Dev Containerの発想(開発環境コンテナ)自体は VS Codeに閉じた発想ではない • Dev Containerで実現するプログラミング支援の機能自体は LSP によってVS Codeに閉じたことではない • LSP と結びつくことで、Dev Containerの概念が一般化するのではないか • Build/CI環境 = Dev Container が一般化するのでは • CI環境で動かす LSP という概念が一般化するのでは
  32. Conclusion • devcontainer.jsonで開発環境のコンテナ化を"定義"したと解説しました • Dev Containerの中にあるべきものを解説しました • Multi Stage Buildを使った実践例を解説しました

    • Dev Containerの将来をちょっと考えてみました 我こそは最強のDev Containerを作った!という方はぜひ紹介ください!