$30 off During Our Annual Pro Sale. View Details »

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

nakaji1106
September 02, 2022
220

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

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

nakaji1106

September 02, 2022
Tweet

More Decks by nakaji1106

Transcript

  1. IBM Technology
    マルチアーキテクチャー対応の
    コンテナイメージの作成
    2022年08⽉31⽇
    ⽇本アイ・ビー・エム システムズ・エンジニアリング株式会社
    テクノロジー・コンピテンシー・センター
    滝澤 直也
    コンテナ共創センター勉強会 #16

    View Slide

  2. © 2022 IBM Corporation 2
    コンテナのアーキテクチャー依存性
    § コンテナはポータビリティのあるアプリケーション開発⼿法ですが
    コンテナイメージはCPUアーキテクチャーごとに作成する必要があります
    オンプレ クラウド
    コンテナイメージ
    デプロイ
    デプロイ
    コンテナのメリット:
    様々な環境にデプロイできるポータビリティ
    マルチアーキテクチャー環境:
    アーキテクチャーごとにコンテナイメージが必要
    x86
    IBM Power
    ARM
    x86⽤
    コンテナイメージ
    IBM Power⽤
    コンテナイメージ
    ARM⽤
    コンテナイメージ
    アーキテクチャーごとにコンテナ
    イメージを作成するのは⼤変?
    アーキテクチャーごとにコンテナ
    開発環境が必要?

    View Slide

  3. © 2022 IBM Corporation 3
    マルチアーキテクチャー対応のコンテナイメージ作成
    § マルチアーキテクチャー対応のコンテナイメージ作成は簡単です
    ⼀般的な開発環境である
    x86環境で作成可能
    必要なパッケージは
    qemu-user-staticのみ
    Dockerfileは(ほぼ)
    アーキテクチャー依存なし
    本⽇はFedoraとRHELでのマルチアーキテクチャー対応
    コンテナイメージの作成⽅法をご紹介します※
    Fedora Red Hat Enterprise Linux
    Dockerfileは全アーキテクチャーで共通 Dockerfileは少しだけ
    アーキテクチャー依存部分を持つ
    ※Fedora, RHELでなくてもマルチアーキテクチャー対応コンテナイメージは作成できます

    View Slide

  4. © 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
    アーキテクチャー指定
    ビルド ビルド
    変換
    アーキテクチャー指定なし

    View Slide

  5. © 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
    アーキテクチャー指定
    ビルド ビルド
    変換
    アーキテクチャー指定なし

    View Slide

  6. © 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

    View Slide

  7. © 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

    View Slide

  8. © 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
    アーキテクチャー指定
    ビルド ビルド
    変換
    アーキテクチャー指定なし

    View Slide

  9. © 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
    アーキテクチャ固有の記述
    アーキテクチャ固有の記述
    アーキテクチャ固有の記述
    アーキテクチャ固有の記述

    View Slide

  10. © 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

    View Slide

  11. © 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}

    View Slide

  12. © 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

    View Slide

  13. © 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イメージをビルド
    マルチアーキテクチャー対応コンテナイメージ作成の⾃動化例

    View Slide