1.3K Views
August 28, 24
スライド概要
8/28にビヨンド勉強会に登壇した際の資料です。
マルチステージビルドでDockerイメージを最適化する方法
日本・中国・カナダを拠点に、AWS や GCP・Azure などのマルチクラウドに対応した、クラウド / サーバーの構築・移行、24時間365日の運用保守 / 監視、負荷テスト、Webシステム開発、サーバーサイド / API 開発 など、クラウド / サーバーに特化したサービスをご提供いたします。 ● コーポレートサイト https://beyondjapan.com ● YouTube https://www.youtube.com/c/beyomaruch ● X(Twitter) https://twitter.com/beyondjapaninfo ● Instagram https://www.instagram.com/beyondjapan_24365
マルチステージビルドでDockerイメージを 最適化する方法 2024/08/28 ビヨンド勉強会 #42 小出 将伍
はじめに コンテナを使用したデプロイを効率化したい方 マルチステージビルド初心者の方
1.Dockerとマルチステージビルドの基本 1.1 Docker とは 1.2 マルチステージビルドとは 2.Docker の基礎知識 2.1 Dockerfile の基本構造 2.2 単一ステージビルドとその問題点 3.マルチステージビルドの概要 3.1 マルチステージビルドの仕組み 3.2 Dockerfile 例 4.マルチステージビルドのメリット 4.1 イメージサイズの削減 4.2 セキュリティの向上 4.3 ビルドの効率の向上 5.まとめ
Profile Name Shogo Koide / 小出 将伍 Company 株式会社 ビヨンド Role Server Side Engineer X @shogohelloshogo
Docker とは?
Docker とは アプリケーションやOSの開発、配備を行うための「コンテナ」を 利用した基盤ソフトウェア。 OSの基本コマンドやアプリケーションの実行バイナリ、ライブラ リなどを一つのパッケージ(コンテナ)にまとめ、そのコンテナを ホストOSから分離された環境で実行が可能。このため、異なる環 境でも一貫した動作が保証され、効率の良いデリバリーやデプロイ が可能。
仮想マシンとの違い 仮想化技術 アプリケーション アプリケーション ゲスト OS カーネル1 ゲスト OS カーネル2 コンテナ アプリケーション アプリケーション ハイパーバイザー コンテナエンジン ホスト OS ホスト OS カーネル / ドライバ カーネル / ドライバ ハードウェア ハードウェア
マルチステージビルドとは?
マルチステージビルドとは? 一つの Dockerfile 内で複数のステージ(複数の FROM)を使用して、異なるビルド環境を構築し、 最終的に不要な依存関係を含まない軽量なコンテン イメージを作成する手法。
Dockerfile の基本構造
Dockerfile の基本構造 Dockerfile の例 # ベースイメージに Ubuntu の 22.04 を使用 FROM ubuntu:22.04 # figlet(アスキーアート) パッケージをインストールする RUN apt-get update && apt-get install -y figlet # コンテキストから hello.sh をコピーする COPY ./hello.sh /hello.sh # コンテナ起動時に hello.sh を実行する ENTRYPOINT ["/hello.sh"]
s p ti 動作 コマンド(旧) コマンド(新) イメージの作成 docker build docker image build イメージ情報の表示 docker images docker image ls イメージの削除 docker rmi docker image rm イメージタグの追加 docker tag docker image レジストリへのイメージ保存 docker push docker image push レジストリからのイメージ取得 docker pull docker image pull コンテナの実行 docker run docker container run ログの確認 docker logs docker container logs 実行中のコンテナに対するコマンド実行 docker exec docker container exec
単一ステージビルドとその問題点
単一ステージビルドとは? Dockerfile 内で1つのステージ(FROM 命令が一つのみ)を使用して ソフトウェアのビルドと実行環境の両方を同じコンテナイメージ内で 行う手法。 ビルドツールや開発に必要な依存関係が、そのまま最終的な実行環境 として残る。
# ベースイメージに Ubuntu の 22.04 を使用 FROM ubuntu:22.04 # figlet(アスキーアート) パッケージをインストールする RUN apt-get update && apt-get install -y figlet # コンテキストから hello.sh をコピーする COPY ./hello.sh /hello.sh # コンテナ起動時に hello.sh を実行する ENTRYPOINT ["/hello.sh"]
単一ステージビルドの問題点 1. イメージサイズの肥大化 2. セキュリテイリスクが増大する
イメージサイズの肥大化 1.不要なファイルや依存関係が含まれる 2. 不要な OS パッケージが含まれる
デバッガ パッケージ管理ツール テストフレームワーク OS パッケージ ドキュメント
セキュリテイリスクが増大する 1. 開発ツールやライブラリが含まれることによる 攻撃対象の増加 2. 不要なOSパッケージによる脆弱性の増加
マルチステージビルドを使いましょう
マルチステージビルドの概要
マルチステージビルドの仕組み 1.複数のステージを定義 2.ステージ間のデータ共有 3.不要なファイルの除去
複数のステージを定義 ビルドステージ アプリケーションをビルドするためのステージ ソースコードをコンパイルしたり、パッケージをインストールしたりする作業を行う ランタイムステージ アプリケーションの本番環境での実行に特化したイメージを作成するためのステージ アプリケーションの実行に必要な最低限のものだけを含める
ステージ間のデータの共有 前のステージで生成されたファイルを後続の ステージにコピーすることが可能 ビルドの一部を前のステージで行い、 最終的なステージで必要なファイルだけを持ち込 むことが可能
マルチステージビルド https://www.slideshare.net/slideshow/dockercon-2017-general-session-day-1-solomon-hykes-75362520/75362520
Dockerfileの例(単一ステージビルド)
Dockerfileの例(マルチステージビルド)
Dockerfileの例
マルチステージビルドのメリット
マルチステージビルドのメリット 1. イメージサイズの削減 2. デプロイの効率化 3. セキュリティの向上
単一ステージビルド マルチステージビルド 1.73 GB 1.15 GB
単一ステージビルド マルチステージビルド 1.73 GB 1.15 GB
まとめ
マルチステージビルドを利用することで 軽量なイメージが生成でき、 セキュリティリスクの低減、 ビルドの効率向上を実現することが可能
ご清聴ありがとうございました