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

#16_マルチアーキテクチャ対応のコンテナイメージの作成

nakaji1106
September 02, 2022
260

 #16_マルチアーキテクチャ対応のコンテナイメージの作成

コンテナ共創センター勉強会#16 での「マルチアーキテクチャ対応のコンテナイメージの作成」セッション資料となります。

nakaji1106

September 02, 2022
Tweet

More Decks by nakaji1106

Transcript

  1. © 2022 IBM Corporation 2 コンテナのアーキテクチャー依存性 § コンテナはポータビリティのあるアプリケーション開発⼿法ですが コンテナイメージはCPUアーキテクチャーごとに作成する必要があります オンプレ

    クラウド コンテナイメージ デプロイ デプロイ コンテナのメリット: 様々な環境にデプロイできるポータビリティ マルチアーキテクチャー環境: アーキテクチャーごとにコンテナイメージが必要 x86 IBM Power ARM x86⽤ コンテナイメージ IBM Power⽤ コンテナイメージ ARM⽤ コンテナイメージ アーキテクチャーごとにコンテナ イメージを作成するのは⼤変? アーキテクチャーごとにコンテナ 開発環境が必要?
  2. © 2022 IBM Corporation 3 マルチアーキテクチャー対応のコンテナイメージ作成 § マルチアーキテクチャー対応のコンテナイメージ作成は簡単です ⼀般的な開発環境である x86環境で作成可能

    必要なパッケージは qemu-user-staticのみ Dockerfileは(ほぼ) アーキテクチャー依存なし 本⽇はFedoraとRHELでのマルチアーキテクチャー対応 コンテナイメージの作成⽅法をご紹介します※ Fedora Red Hat Enterprise Linux Dockerfileは全アーキテクチャーで共通 Dockerfileは少しだけ アーキテクチャー依存部分を持つ ※Fedora, RHELでなくてもマルチアーキテクチャー対応コンテナイメージは作成できます
  3. © 2022 IBM Corporation 4 マルチアーキテクチャー対応コンテナイメージ作成の概要 § qemu-user-staticがサポートされるかによって⼿順が違います – Fedora:サポートあり

    – RHEL:サポートなし Fedora Red Hat Enterprise Linux • qemu-user-staticをサポート • Dockerfileは全アーキテクチャーで共通 • ビルド時にアーキテクチャを指定 • qemu-user-staticがサポートされない • Dockerfileは⼀部に各アーキテクチャー 固有の記載が必要 共通Dockerfile コンテナイメージ アーキテクチャー 固有Dockerfile コンテナイメージ 共通Dockerfile アーキテクチャー指定 ビルド ビルド 変換 アーキテクチャー指定なし
  4. © 2022 IBM Corporation 5 マルチアーキテクチャー対応コンテナイメージ作成(Fedora) § qemu-user-staticがサポートされるかによって⼿順が違います – Fedora:サポートあり

    – RHEL:サポートなし Fedora Red Hat Enterprise Linux • qemu-user-staticをサポート • Dockerfileは全アーキテクチャーで共通 • ビルド時にアーキテクチャを指定 • qemu-user-staticがサポートされない • Dockerfileは⼀部に各アーキテクチャー 固有の記載が必要 共通Dockerfile コンテナイメージ アーキテクチャー 固有Dockerfile コンテナイメージ 共通Dockerfile アーキテクチャー指定 ビルド ビルド 変換 アーキテクチャー指定なし
  5. © 2022 IBM Corporation 6 マルチアーキテクチャー対応コンテナイメージ作成(Fedora) § Fedoraでマルチアーキテクチャー対応コンテナイメージを作成(1/2) – 前提パッケージの導⼊

    § Fedoraではqemu-user-staticを導⼊可能 – Dockerfileを作成 § アーキテクチャー固有の記載はないDockerfileを準備 – コンテナイメージを作成 § platformオプションにてアーキテクチャーを指定 – 作成したコンテナイメージのアーキテクチャーを確認 § アーキテクチャーがppc64leと表⽰される # dnf install -y podman buildah qemu-user-static # cat Dockerfile FROM ubuntu:20.04 RUN apt-get update && apt-get install -y curl # buildah bud --platform=linux/ppc64le -f Dockerfile -t focal-test:p1 # podman run --rm focal-test:p1 uname -m ppc64le Fedora on x86
  6. © 2022 IBM Corporation 7 マルチアーキテクチャー対応コンテナイメージ作成(Fedora) § Fedoraでマルチアーキテクチャー対応コンテナイメージを作成(2/2) – 作成したコンテナイメージをDockerhubにpush

    § XXXXXはアカウント名 – Linux on Powerでコンテナを稼働 § Linux on Power環境にはpodmanが導⼊されていることが前提 § Linux on Power環境でDockerhubからコンテナイメージをpullして実⾏ # podman push focal-test:p1 XXXXX/focal-test:p1 # podman run --rm docker.io/XXXXX/focal-test:p1 uname -m ppc64le Fedora on x86 RHEL on Power
  7. © 2022 IBM Corporation 8 マルチアーキテクチャー対応コンテナイメージ作成(RHEL) § qemu-user-staticがサポートされるかによって⼿順が違います – Fedora:サポートあり

    – RHEL:サポートなし Fedora Red Hat Enterprise Linux • qemu-user-staticをサポート • Dockerfileは全アーキテクチャーで共通 • ビルド時にアーキテクチャを指定 • qemu-user-staticがサポートされない • Dockerfileは⼀部に各アーキテクチャー 固有の記載が必要 共通Dockerfile コンテナイメージ アーキテクチャー 固有Dockerfile コンテナイメージ 共通Dockerfile アーキテクチャー指定 ビルド ビルド 変換 アーキテクチャー指定なし
  8. © 2022 IBM Corporation 9 マルチアーキテクチャー対応コンテナイメージ作成(RHEL) § RHELでマルチアーキテクチャー対応コンテナイメージを作成(1/2) – 前提パッケージの導⼊

    § Podmanとbuildahのみが前提条件 – Dockerfileを作成 § アーキテクチャー固有の記載はないDockerfileをベースにqemu-user-static対応に修正 – コンテナイメージを作成 § platformオプションは使⽤せずにビルドを実⾏ – ここでは作成したコンテナイメージのアーキテクチャーを確認できません § qemu-user-staticがホストOSに導⼊されていないのでエラーになります # dnf install –y podman buildah FROM multiarch/qemu-user-static:x86_64-ppc64le as qemu FROM ppc64le/ubuntu:20.04 COPY --from=qemu /usr/bin/qemu-ppc64le-static /usr/bin RUN apt-get update && apt-get install -y curl RUN rm /usr/bin/qemu-ppc64le-static # buildah bud -f containerfile_ppc64le -t test-multiarch:p1 RHEL on x86 アーキテクチャ固有の記述 アーキテクチャ固有の記述 アーキテクチャ固有の記述 アーキテクチャ固有の記述
  9. © 2022 IBM Corporation 10 マルチアーキテクチャー対応コンテナイメージ作成(RHEL) § RHEL8.4でマルチアーキテクチャー対応コンテナイメージを作成(2/2) – 作成したコンテナイメージをDockerhubにpush

    § XXXXXはアカウント名 – Linux on Powerでコンテナを稼働 § Linux on Power環境にはpodmanが導⼊されていることが前提 § Linux on Power環境でDockerhubからコンテナイメージをpullして実⾏ # podman push test-multiarch:p1.1 XXXXX/test-multiarch:p1 # podman run -it --rm docker.io/XXXXX/test-multiarch:p1 ppc64le RHEL on x86 RHEL on Power
  10. © 2022 IBM Corporation 11 RHEL環境でのDockerfileの⾃動変換 § RHEL環境でアーキテクチャ⾮依存のDockerfileをビルド可能な形式に変換 – スクリプトを準備することでアーキテクチャ⾮依存のDockerfileをRHEL環境でビルド可能な

    形式に変換できます § サンプルスクリプト # cat convert_containerfile.sh #!/bin/bash FILENAME=$1 ARCH=$2 CONV_FILE="${FILENAME}_${ARCH}" TMP_FILE="${FILENAME}_tmp" grep CMD ${FILENAME} > /dev/null FLG_CMD=$? grep ENTRYPOINT ${FILENAME} > /dev/null FLG_ENT=$? cat ${FILENAME} | sed -e "s/FROM /FROM ${ARCH}¥//g" | ¥ sed -e "/FROM/a COPY --from=qemu /usr/bin/qemu-${ARCH}-static /usr/bin" | ¥ sed -e "1i FROM multiarch/qemu-user-static:x86_64-${ARCH} as qemu" > ${TMP_FILE} if [[ ${FLG_CMD} -eq 0 ]]; then cat ${TMP_FILE} | sed -e "/CMD/i RUN rm /usr/bin/qemu-${ARCH}-static" > ${CONV_FILE} elif [[ ${FLG_ENT} -eq 0 ]]; then cat ${TMP_FILE} | sed -e "/ENTRYPOINT/i RUN rm /usr/bin/qemu-${ARCH}-static" > ${CONV_FILE} else cat ${TMP_FILE} | sed -e "¥$a RUN rm /usr/bin/qemu-${ARCH}-static" > ${CONV_FILE} fi rm ${TMP_FILE}
  11. © 2022 IBM Corporation 12 RHEL環境でのDockerfileの⾃動変換 § RHEL環境でアーキテクチャー⾮依存のDockerfileをビルド可能な形式に変換 – スクリプトの実⾏例

    § オリジナルのDockerfileを確認 § ⾃動変換スクリプトを実⾏ § 変換後のDockerfileを確認 # cat containerfile_ppc64le FROM multiarch/qemu-user-static:x86_64-ppc64le as qemu FROM ppc64le/ubuntu:20.04 COPY --from=qemu /usr/bin/qemu-ppc64le-static /usr/bin RUN apt-get update && apt-get install -y curl RUN rm /usr/bin/qemu-ppc64le-static CMD ["/bin/bash"] # cat containerfile FROM ubuntu:20.04 RUN apt-get update && apt-get install -y curl CMD ["/bin/bash"] # ./convert_containerfile.sh containerfile ppc64le
  12. © 2022 IBM Corporation 13 CI/CDパイプラインでのマルチアーキテクチャー対応 § マルチアーキテクチャー対応コンテナイメージ作成の⾃動化 – CI/CDパイプラインに組み込むことで⾃動化可能です

    § 各アーキテクチャーごとに前項で紹介した処理を実⾏するパイプラインを作成 アプリ開発者 ソースコード・リポジトリ (Git) アプリ・コード 開発環境 Dockerレジストリ コンテナイメージ CIパイプライン Clone SAST Build Scan Push x86イメージをビルド 各アーキテクチャーの コンテナイメージが登録される マニフェスト・リポジトリ (Git) アプリ・マニフェスト IBM Power環境 CDパイプライン Fetch Apply Build Scan Push x86環境 CDパイプライン Fetch Apply アプリ利⽤者 ①コードを コミット ②リポジトリ更新を検知 ③コンテナイメージ を登録 ④コンテナイメージ 更新を検知 IBM Powerイメージをビルド マルチアーキテクチャー対応コンテナイメージ作成の⾃動化例