Slide 1

Slide 1 text

10分でDeep Dive: コンテナイメージのアノ問題を 理解する 田中司恩(@tnk4on) [email protected] 2025/1/31

Slide 2

Slide 2 text

● 田中 司恩(タナカ シオン) / @tnk4on ○ https://tnk4on.github.io/ ● Red Hatのソリューションアーキテクト。Red Hatへの転職と同時に福岡に移 住。 ● 大阪芸術大学音楽工学コース卒。在学中よりメディア・アート、サウンド・アー ト作品の制作を行う。 ● コンテナに興味を持ち、OpenShiftやPodmanに関する情報をブログ、雑誌/ 書籍に多数投稿。「Podmanイン・アクション」の著者の1人。 ● 2020年頃よりPodmanコミュニティに参加、PR/Issue/翻訳などを行い、 Podmanの日本語情報発信を積極的に展開中。 ● 最近はPodmanを推す人 ● 音とテクノロジーが重なる領域が好物のデジタルクリエイター。 自己紹介

Slide 3

Slide 3 text

Rosetta Support_Podman Community Meeting https://docs.google.com/presentation/d/1_GdU3Hr9Ao5phAfV7LkH2I69WmFPTXmYzyzYlTKjc1Y/edit?usp=sharing https://github.com/containers/podman/pull/21670 https://github.com/containers/podman/releases/tag/v5.1.0

Slide 4

Slide 4 text

podmanjp Podman’s unofficial Japanese account

Slide 5

Slide 5 text

今日のお題。 「コンテナイメージのアノ問題を理解する」

Slide 6

Slide 6 text

よくあるコンテナの説明図 ハードウェア OS ハイパーバイザー ハードウェア OS コンテナランタイム 仮想マシン OS Bin/Library App App 仮想マシン OS Bin/Library App App コンテナ Bin/ Library App コンテナ Bin/ Library App コンテナ Bin/ Library App コンテナ 仮想マシン

Slide 7

Slide 7 text

よくあるコンテナの説明図 ハードウェア OS ハイパーバイザー ハードウェア OS コンテナランタイム 仮想マシン OS Bin/Library App App 仮想マシン OS Bin/Library App App コンテナ Bin/ Library App コンテナ Bin/ Library App コンテナ Bin/ Library App コンテナ 仮想マシン コンテナには OSがない

Slide 8

Slide 8 text

https://hub.docker.com/_/ubuntu

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

コンテナイメージ(ubi9)を実行してOS情報を参照してみる UBIイメージはRHELコンテンツのサブセット $ podman run ubi9 cat /etc/redhat-release Red Hat Enterprise Linux release 9.5 (Plow) ubi9イメージを実行し、/etc/redhat-releaseを参照する RHELが動いている?

Slide 11

Slide 11 text

Linuxカーネル パッケージマネージャー ● Fedora/CentOS(Stream)/RHEL: dnf, yum ● Debian/Ubuntu: apt など Linuxディストリビューションとは

Slide 12

Slide 12 text

Linuxカーネル ファイルシステム Linuxディストリビューションとは 構成する主要な要素のみピックアップ パッケージマネージャー ● Fedora/CentOS(Stream)/RHEL: dnf, yum ● Debian/Ubuntu: apt など

Slide 13

Slide 13 text

コンテナ Linuxカーネル コンテナランタイム Linux上のコンテナとは 一般的なコンテナイメージ( UBI、Ubuntu、など) ファイルシステム パッケージマネージャー ● Fedora/CentOS(Stream)/RHEL: dnf, yum ● Debian/Ubuntu: apt など

Slide 14

Slide 14 text

コンテナ Why distroless containers aren't the security solution you think they are https://www.redhat.com/ja/blog/why-distroless-containers-arent-security-solution-you-think-they-are Linuxカーネル コンテナランタイム パッケージマネージャーの入っていないコンテナイメージ ファイルシステム いわゆるディストロレス コンテナイメージ

Slide 15

Slide 15 text

scratchコンテナイメージ 最小限のコンテナイメージ FROM scratch scratchイメージのContainerfile ▸ ベースイメージの中で最も小さく、何も含まれていない。 ▸ ゼロからカスタムイメージを作成するための空のベースイメージ。 ▸ 追加のライブラリやツールが一切含まれていないため、非常に軽量。 ▸ 必要なものだけを追加することで、非常にカスタマイズされたコンテナイメージ を作成できる。

Slide 16

Slide 16 text

通常のコンテナイメージとscratchイメージを比較する podman image treeコマンドを使用 $ podman pull registry.access.redhat.com/ubi9 $ podman image tree ubi9 Image ID: 3955a6e8054b Tags: [registry.access.redhat.com/ubi9:latest] Size: 251.5MB Image Layers ├── ID: 202739b2c1be Size: 251.5MB └── ID: a52bb7de32eb Size: 3.584kB Top Layer of: [registry.access.redhat.com/ubi9:latest] UBI9のコンテナイメージのレイヤー情報 $ podman build -t scratch . $ podman image tree scratch Image ID: c6d5a9a34a65 Tags: [localhost/scratch:latest] Size: 1.04kB No Image Layers scratchのコンテナイメージのレイヤー情報

Slide 17

Slide 17 text

scratchイメージを実行する $ podman run -it scratch Error: preparing container fd0ec2d594d4ba20d0cc3150cab99499a34d7be2c4bf1f3c5d4bf6c407d1691e for attach: crun: executable file `` not found in $PATH: No such file or directory: OCI runtime attempted to invoke a command that was not found scratchイメージを実行してもエラーになる(シェルにすら入れない)

Slide 18

Slide 18 text

scratchイメージにシェル(sh)を追加する シェルにbusyboxを使用 FROM scratch # Copy busybox static binary from busybox image COPY --from=busybox:1.31.0-uclibc /bin/busybox /bin/busybox # Install busybox RUN ["/bin/busybox", "--install", "/bin"] # Set the entrypoint to sh ENTRYPOINT ["/bin/sh"] busyboxを追加するようにカスタマイズしたContainerfile

Slide 19

Slide 19 text

scratchイメージにシェル(sh)を追加する シェルにbusyboxを使用 $ podman build -t scratch . STEP 1/4: FROM scratch STEP 2/4: COPY --from=busybox:1.31.0-uclibc /bin/busybox /bin/busybox -→ 42078f70895a STEP 3/4: RUN ["/bin/busybox", "--install", "/bin"] -→ 9a721967bba7 STEP 4/4: ENTRYPOINT ["/bin/sh"] COMMIT scratch -→ 3a2d1dd912a3 Successfully tagged localhost/scratch:latest 3a2d1dd912a34d3ad4d000df73bc9f8352b0e9a05850002dde606ccdf324033d $ $ podman run -it scratch / # ls bin dev etc proc run sys カスタマイズしたContainerfileをビルドし、コンテナを実行する

Slide 20

Slide 20 text

scratchイメージにシェル(sh)を追加する シェルにbusyboxを使用 $ podman image tree scratch:latest Image ID: 3a2d1dd912a3 Tags: [localhost/scratch:latest] Size: 2.635MB Image Layers ├── ID: 5d9f8cd70000 Size: 1.213MB └── ID: a2e55300b051 Size: 1.42MB Top Layer of: シェルを追加したコンテナイメージのレイヤー情報

Slide 21

Slide 21 text

しかし、実際問題、scratchイメージの運用は大変 ▸ 使いたいコマンドやライブラリをビルドの度に外部から追加が必要 →コマンドやライブラリのアップデートの度に用意が必要 ▸ 一般的なミドルウェアやアプリを追加しようとすると、手動で依存するライ ブラリ等を揃える必要がある →依存関係の解決だけで時間が無限に溶ける アプリケーション(およびライブラリ)の 維持運用にはパッケージマネージャーが必要

Slide 22

Slide 22 text

scratchイメージにパッケージマネージャーでアプリを追加する Buildahを使ってコンテナイメージを作成する Buildah とは https://www.redhat.com/ja/topics/containers/what-is-buildah コンテナランタイム scratchコンテナ Bin/ Library dnfコマンド RHEL コンテナイメージの 操作 Buildah Podman は Buildah と同じコードを利用して作成されています。 Podman のpodman build コマンドは Buildah の機能のサブセットを使用しています。 Buildah は単独のビルドツールとして使うことができ、さらに Podman ではできない柔軟なコンテナイメージの作成ができる機能を搭載しています。

Slide 23

Slide 23 text

Buildah を使用したゼロからのイメージの作成 19.6. Buildah を使用したゼロからのイメージの作成 | Red Hat Product Documentation https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/building_running_and_managing_containers/proc_creating-images-from-scratch-with-buildah_ass embly_building-container-images-with-buildah#proc_creating-images-from-scratch-with-buildah_assembly_building-container-images-with-buildah # buildah from scratch working-container # scratchmnt=$(buildah mount working-container) # dnf install -y --releasever=9 --installroot=$scratchmnt redhat-release # dnf install -y --setopt=reposdir=/etc/yum.repos.d \ --installroot=$scratchmnt \ --setopt=cachedir=/var/cache/dnf httpd # mkdir -p $scratchmnt/var/www/html echo "Your httpd container from scratch works!" > $scratchmnt/var/www/html/index.html # buildah config --cmd "/usr/sbin/httpd -DFOREGROUND" working-container # buildah config --port 80/tcp working-container # buildah commit working-container localhost/myhttpd:latest # podman run -it myhttpd cat /etc/redhat-release Red Hat Enterprise Linux release 9.5 (Plow) scratchイメージにhttpdをインストールし、HTMLコンテンツを追加して、自動的にサービス起動するようにする

Slide 24

Slide 24 text

Ubuntuでもゼロからイメージの作成は可能 Ubuntu上でBuildahを実行する # buildah from scratch # scratchmnt=$(buildah mount working-container) # mmdebstrap --variant=apt noble $scratchmnt http://ports.ubuntu.com/ubuntu-ports/ # buildah commit working-container ubuntu-noble # podman run --rm -it ubuntu-noble:latest bash root@e872586bff19:/# cat /etc/os-release PRETTY_NAME="Ubuntu 24.04 LTS" NAME="Ubuntu" VERSION_ID="24.04" VERSION="24.04 LTS (Noble Numbat)" VERSION_CODENAME=noble ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/priv acy-policy" UBUNTU_CODENAME=noble LOGO=ubuntu-logo scratchイメージにubuntu-nobleをインストール

Slide 25

Slide 25 text

まとめ ▸ コンテナはOSを持たないが、コンテナイメージには各ディストリ ビューションのファイルシステムが含まれる場合がある ▸ scratchイメージは軽量で余計なものが含まれないが、汎用的に使 うにはイメージの維持管理の運用が大変 ▸ Buildahと各ディストリビューションのパッケージマネージャーを使う と、scratchイメージにパッケージを追加できる。その際、コンテナイ メージのファイルシステムは OSのものと同等になる。

Slide 26

Slide 26 text

linkedin.com/company/red-hat youtube.com/user/RedHatVideos facebook.com/redhatinc twitter.com/RedHat Thank you