2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
リンクをコピー
記事をブックマーク
伊藤裕一氏(以下、伊藤):「脱 Dockerfile! Cloud Native Buildpacksとkpackを使った簡単で安全なイメージ」という内容について、伊藤がお話しします。
目次です。最初にDockerfileのおさらいと、問題点を話します。そして、Dockerfileを使わずにビルドを実施するCloud Native Buildpacks(CNB)の概要とデモについて話し、その次にKubernetes上でCNBを実施するkpackの概要とデモを実施します。
最後に、CNBとkpackを使ってCIパイプラインを構築する例を説明し、最終的にkpackの製品版であるVMware Tanzu Build Serviceの紹介を実施します。
最初にDockerfileのおさらいです。Dockerfileについては多くの方が知っているかと思いますが、コンテナのイメージをビルドするための定義ファイルです。左下に例が書いてあります。イメージを構築するためのベースイメージがこのOSだと思ってもらうと、簡単に言えば、このOSの上にどういったパッケージを入れるのか。
YAMLやaptを入れたり。あとはアプリケーションのソースコードを取り込んで、それでライブラリをインストールしてコードをビルドして、実行可能ファイルが内部的にできたら、実行可能ファイルを実行するための実行コードを定義する。このようなかたちでコンテナのイメージを作成します。
このDockerfileですが、その中身に1、2、3、4、5、6とあります。各手順を順番に羅列するようなかたちのため、Bashのスクリプトに近く、AnsibleやKubernetesなどで使うYAMLのように定義しているようなものとは、ちょっと異なります。導入する敷居が非常に低く、多くのユーザーがいるツールです。
このDockerfileですが、少し問題点があります。まず、Dockerfileを多くの方が実際に使った際に、どういう感じで使い始めたかを考えます。私もそうだと思いますが、例えば自分がJavaのアプリケーションで「このフレームワークを使いたい」と思った際に、その名前でインターネット検索をして、作りたいものに近いDockerfileを探してくる。
その見つけてきたDockerfileを、自分のアプリケーションで動くように、修正を何回も何回も繰り返しながら、ちゃんと動くものを作る。そういったかたちで実行する方が多いと思います。そうやって作ったDockerfileですが、実際にアプリケーションを動かせるものの、本当にそれがプロダクションレディなのかは疑わしい場面が多いです。
最初に使っているイメージや、利用しているライブラリ。これは脆弱性が報告されているものを利用してしまっている可能性があります。仮に今はちゃんと問題がないと把握した上で使っていたとしても、そのDockerfileを2年後に使った際に、2年前の状態のまま使ってしまう。そうすると、今はないトラブルが、将来的に発生する可能性はありえます。
他にも、例えばビルドする際のパラメーターがちゃんと適切になっているか。そういったことを保証できないので、Dockerfileで作られているイメージは問題がある場合が多いです。
例にあるJavaの場合でも、非常に詳しい方がDockerfileを書けば、そのDockerfileは信頼性が高いものが作れると思います。ただ、開発者が50人いて、それぞれの開発者が10個のDockerfileを書くシナリオだと、合計500のDockerfileを更新しながらずっと使い続けていく。このようなことを想定すると、本当に全部のDockerfileが正しく作られているのかは、非常に怪しいのではと私は思います。
このようなDockerfileの問題ですが、基本的に問題の根っこにはDockerfileを属人的に運用して、それを陳腐化しないためには、ちゃんと更新し続けないといけない問題があります。それを解決するためには、Dockerfileのように自分たちで細かいステップを管理するのではなく、例えばJavaのアプリケーションやPythonなどが、ソースコードの中身に応じてベストプラクティスに沿った自動ビルドの仕組みを実施する。
そうすると、属人的な問題が入り込む余地がなくなります。ビルドを行う際にも、例えば今ビルドするものと2年後にビルドするものは、同じものでビルドすれば同じ動きをします。しかし、脆弱性の観点を考えると、2年後にちゃんと更新していないといけないシナリオが多いと思います。
そういった際に、Dockerfileを自分でいじって更新するのではなく、先ほどお話したベストプラクティスに沿って自動ビルドをする仕組みのビルドの定義。これさえ新しくすれば、必要なイメージを使うベースOSやライブラリを、新しいバージョンでビルドし直せる。こういった方法で解決が図れます。
この解決を図る1つの手法として挙げられるものが、CNBです。CNBは簡単に言うと、Dockerfileで実現していたビルドなどをどうビルドを定義するのかを定義されているスクリプトファイルです。
それを使うことによって、自動でコードから、例えば「これはJava」「これはPython」と判定して、その判定に沿ってJava用のベストプラクティスに沿ったビルドをする、Python用のベストプラクティスに沿ったビルドをする、といったかたちでイメージを作成するためのツールになります。
これを採用すると、Dockerfileを書く手間がまずかからなくなる。当然Buildpacksのバージョンやビルド定義が古ければ脆弱性が入ってしまう可能性がありますが、きちんと更新して、ちゃんと管理されているものを使う限りは、そのリスクが大幅に減ります。
あとは、Dockerfileに比べてキャッシュを利用する仕組みが優秀なので、何回も何回もいろいろな場所でビルドするシナリオでは、より高速にビルドできる可能性が高くなります。
このCNBですが、どう使うのかをデモで見せたいと思います。
今、/javaのディレクトリにいて、フォルダの中身一覧を出しています。これがpom.xmlといって、どういったライブラリを使うかを定義しているものです。今回だとSpring Bootを使っています。
pack build java-app --builder gcr.ioとありますが、これはCNBでビルドをするときのコマンドで、このpack buildでビルドする。java-appがイメージ名で、--builderがそのビルドに使う定義ファイル。これはコンテナですが、Google上のBuildpacksのbuilderです。
ビルドが終わったあと、すぐdockerコマンドでイメージを起動するように指定しています。このコマンドを発行すると、このようにビルドが開始されます。これは事前に1回ビルドしておいたので一瞬で終わりましたが、最終的にはEXPORTINGでイメージを出力して、そのイメージをdockerコマンドで起動して、Spring Bootが起動しているかたちになっています。
その起動したアプリケーションに対して、ターミナルのブラウザのlinksでアクセスすると、ちゃんと先ほどのようにレスポンスが返ってきて、アプリが動いていることがわかりました。同じようにディレクトリを/goに変更して、Goのソースコードと使うパッケージを定義したgo.modがある状態でgo-appをビルドする。
ビルドコマンドはさっきと同じです。それでビルドしたあと、dockerコマンドをすぐ動かす。指定してビルドすると、イメージを出力してイメージが走り始めました。
出力したいGoのアプリに対してまたlinksでアクセスすると、このようにGinというフレームワークを使っているGoのWebサーバーが動いていることが確認できました。
その次にPythonでアプリのディレクトリの構成。これはFlaskを使っているので、Flaskを使う宣言はrequirements.txtに書いています。Pythonでもまったく同じコマンドです。ビルドコマンドを発行してビルドして、今Flaskのライブラリをダウンロードしています。
イメージがビルドできたので、dockerコマンドで起動。そしてまたlinksでアクセス。
そうするとFlaskが動いています。レスポンスが返ってきたので、Dockerのイメージがちゃんとビルドできて起動できていることがわかりました。他に.NETのアプリや、Ruby、PHPもビルドできます。
(次回につづく)
関連タグ:
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05