Upgrade to Pro — share decks privately, control downloads, hide ads and more …

最強の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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  5. AGENDA
    1. Remote Developmentで手に入れたもの
    2. Dev Containerはどうあるべきか
    3. Multi Stage Buildを使ったDev Containerを極める
    4. Dev Containerの将来

    View Slide

  6. 詳しい内容は……
    https://techbookfest.org/product/
    4696850535809024

    View Slide

  7. AGENDA
    1. Remote Developmentで手に入れたもの
    2. Dev Containerはどうあるべきか
    3. Multi Stage Buildを使ったDev Containerを極める
    4. Dev Containerの将来

    View Slide

  8. 一般的な開発環境
    一つのマシンに全てのツールをインストールして使うのが、
    一般的な開発環境です

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. .devcontainer/devcontainer.jsonの功績
    開発環境のコンテナ化を"定義"した
    ● コンテナ定義 Dockerfile / docker-compose.yaml / image
    ● ユーザ名 vscode
    ● ワークスペースマウント /workspace
    ● コンテナ起動後コマンド postCommand
    ローカル環境に依存する要素(ワークスペース、UID)をまとめた

    View Slide

  14. AGENDA
    1. Remote Developmentで手に入れたもの
    2. Dev Containerはどうあるべきか
    3. Multi Stage Buildを使ったDev Containerを極める
    4. Dev Containerの将来

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  22. AGENDA
    1. Remote Developmentで手に入れたもの
    2. Dev Containerはどうあるべきか
    3. Multi Stage Buildを使ったDev Containerを極める
    4. Dev Containerの将来
    ここからは先程考えた Dev Containerの責務をよりよく満たすために、
    Multi Stage Buildを使ったDev Containerの構築方法を紹介します

    View Slide

  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コンテナを作る例です

    View Slide

  24. 成し遂げたいこと
    ● Production Container、もしくはコンパイル時に、
    Dev Containerで同じライブラリを使う
    ● Production Containerには開発ツールを入れないこと
    よりよいDev Containerにするために
    このようなことを成し遂げたいと考えます

    View Slide

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

    View Slide

  26. Goの Multi Stage Build
    Goで一般的に行われる Multi Stage Buildの場合
    Goのコンパイラの入ったコンテナでビルドを行い、
    Application Binaryだけを別のコンテナにコピーすることが
    よく行われます

    View Slide

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

    View Slide

  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を流用するのが良いように思えてきました

    View Slide

  29. PythonでPoetryを使ったDev Cotainerを考えると
    このようになるでしょう

    View Slide

  30. AGENDA
    1. Remote Developmentで手に入れたもの
    2. Dev Containerはどうあるべきか
    3. Multi Stage Buildを使ったDev Containerを極める
    4. Dev Containerの将来

    View Slide

  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 という概念が一般化するのでは

    View Slide

  32. Conclusion
    ● devcontainer.jsonで開発環境のコンテナ化を"定義"したと解説しました
    ● Dev Containerの中にあるべきものを解説しました
    ● Multi Stage Buildを使った実践例を解説しました
    ● Dev Containerの将来をちょっと考えてみました
    我こそは最強のDev Containerを作った!という方はぜひ紹介ください!

    View Slide