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

DockerユーザのためのPodman/Buildah with Red Hat Enterprise Linuxを利用したコンテナアプリケーション開発

DockerユーザのためのPodman/Buildah with Red Hat Enterprise Linuxを利用したコンテナアプリケーション開発

普段Dockerを使っている方向けに、RHEL8から導入された新しいコンテナ技術Podman/Buildahを使ったコンテナアプリケーション開発の基礎を紹介している資料です。

Hirofumi Kojima

November 26, 2020
Tweet

More Decks by Hirofumi Kojima

Other Decks in Technology

Transcript

  1. Copyright 2020 Red Hat K.K. 最新のRed Hat Enterprise Linux情報 2

    ▸ 最新のメジャーリリース: Red Hat Enterprise Linux 8 ・ Red Hat Enterprise Linux(RHEL, 通称「れる」)の7番目のリリース ・ Fedora 28をベースとして開発された企業むけ OS ・ 認定ハードウェア、認定仮想化環境、および認定クラウド環境での動作をサポート ・ 2019年5月7日にイニシャルリリース、 2029年5月まで10年間サポート ・ 一部のパッケージについて、開発者を想定した高い頻度での更新を実施 ・ Docker技術を削除し、新たなコンテナ技術として Podman/Buildah/Skopeoを採用
  2. Copyright 2020 Red Hat K.K. コンテナ関連プロジェクトの発足とRHELへの導入 (参考) コンテナの歴史: https://www.redhat.com/en/blog/history-containers 3

    LXC Initial release Aug ‘08 OpenShift online May ‘11 Docker initial Mar ‘13 OpenShift Enterprise 3.0 Jun ‘15 Open Container Initiative Initial release, Buildah Jun ‘17 Moby Apr ‘17 Sep ‘17 Kubernetes Mid ‘14 Nov ‘15 Buildah 1.0 Podman New logo May ‘18 Nov ‘10 Makara acquisition 2013年にDockerの イニシャルリリース 2014年にKubernetesのイニシャルリリースと Docker/Kubernetesが導入されたRHEL7のリリース 2018年にデーモンレスなコンテナエンジンである Podmanのイニシャルリリース (2019年にPodmanなどが導入されたRHEL8のリリース)
  3. Copyright 2020 Red Hat K.K. RHEL7に導入されていたDockerの仕組み 4 ▸ Dockerデーモンがレジストリ、イメージ、カーネルを利用したコンテナ管理を全て実施する仕組み ・

    レジストリからイメージをプルおよびプッシュ ・ ローカルコンテナストレージにイメージのコピーを作成し、それらのコンテナにレイヤーを追加 ・ コンテナをコミットし、ホストリポジトリからローカルコンテナイメージを作成・削除 ・ カーネルに対して、正しい名前空間や cgroupなどを指定してコンテナを実行するように依頼 ▸ DockerのCLI(dockerコマンド)により、上記コンテナ管理をDockerデーモンに依頼 ▸ Dockerの仕組みの懸念点 ・ Dockerデーモンが全ての子プロセス (実行中のコンテナ)を所有するため、 障害発生時にコンテナが孤児 (orphan)プロセスとなって、 コンテナがリソースを確保したままスタックする可能性がある ・ Dockerデーモンに脆弱性があった場合、イメージビルドの際に コマンドインジェクションの脆弱性 に繋がる可能性がある ▸ 上記懸念点を解決するために、用途に応じたデーモンレスのコンテナ管理ツールが誕生 ・ Podman/Buildah/Skopeo
  4. Copyright 2020 Red Hat K.K. Podman/Buildah/Skopeoの目的 5 ▸ コンテナの管理作業全てを担当するDockerとは異なり、目的ごとに細分化されて実装 ・

    Podman ・ ローカルでのコンテナまたは Kubernetes Podの起動や停止を管理 ・ Buildah ・ コンテナイメージをビルドし、レジストリにプッシュ ・ Skopeo ・ ローカル及びリモートのコンテナレジストリ間でのコンテナイメージの転送 ▸ これらは全てデーモンレスのツールとして開発されています ・ これより先は、Podman, Buildahについて紹介していきます
  5. Copyright 2020 Red Hat K.K. RHEL8から導入されたPodman (Pod Manager)の仕組み 6 ▸

    デーモンレス、ルートレスなコンテナ管理ツールとして実装され、下記の特徴を持っています ・ Open Container Initiative (OCI) に準拠した軽量なコンテナランタイムを利用 (runcなど) ・ runc自体はDockerでも利用されているコンテナランタイム ・ Kubernetesのコンテナランタイムを利用しない、スタンドアロンなコンテナ管理が可能 ・ Docker CLIに基づいたpodmanコマンドを提供し、Docker CLIと似たようなコンテナ管理が可能 ・ コンテナーの実行、停止、および再起動 ・ コンテナーイメージの管理 (プッシュ、コミット、設定など ) ・ 既存のDockerfileを利用した、Docker/OCI準拠のイメージビルド ・ ただし、完全互換ではないので、 Podmanでは未対応のコマンドオプション もあり ・ Kubernetes/OpenShift環境への移行支援機能を提供 ※ Open Container Initiative: 2015年にDocker、Red Hat、CoreOS、SUSE、GoogleなどのLinuxコンテナ業界のリーダーたちが 設立した、コンテナイメージとランタイムを定義するための標準仕様を管理する独立した組織。 2020年時点ではMicrosoftなどの様々 な企業も加入しています。
  6. Copyright 2020 Red Hat K.K. Podmanのインストールと利用 7 ▸ RHEL8.1+ でPodmanをインストールして利用可能

    ・ yumを利用してインストール ・ RHEL8ではdnfコマンドも利用可能 (yumコマンドはdnfコマンドのシンボリックリンク ) ▸ Docker CLIと同様に、pullやrunなどでコンテナを実行でき、commitでコンテナの変更を保存できます $ sudo subscription-manager register $ sudo subscription-manager attach --auto $ sudo yum -y install podman $ sudo yum -y install podman-docker <- podman-dockerは、dockerという名前で podmanコマンドへのシンボリックリンクを作成するためのパッケージ (オプション) $ podman pull registry.access.redhat.com/ubi8/ubi:latest $ podman run --name test01 -it registry.access.redhat.com/ubi8/ubi:latest /bin/bash [root@c21ad143c67f /]# yum -y install httpd [root@c21ad143c67f /]# exit $ podman ps -a CONTAINER ID IMAGE COMMAND CREATED NAMES aeb95fb38a18 registry.access.redhat.com/ubi8/ubi:latest /bin/bash 38 seconds ago test01 $ podman start -ai test01 [root@aeb95fb38a18 /]# exit $ podman commit test01 httpd_ubi_01 $ podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/httpd_ubi_01 latest d610cfd1a46f About a minute ago 242 MB registry.access.redhat.com/ubi8/ubi latest ecbc6f53bba0 2 weeks ago 211 MB
  7. Copyright 2020 Red Hat K.K. PodmanによるKubernetes/OpenShift環境への移行支援 8 ▸ 「podman generate

    kube」コマンドにより、実行中のコンテナに基づいてKubernetes/OpenShift のPod yamlファイルを作成可能 ・ 「podman pod」コマンドでKubernetes/OpenShift Podの作成・実行・停止・削除なども可能 $ podman generate kube test01 > test01.yml $ cat test01.yml # Created with podman-1.4.2-stable3 apiVersion: v1 kind: Pod metadata: ... spec: Containers: … env: - name: container value: oci image: registry.access.redhat.com/ubi8/ubi:latest ... securityContext: allowPrivilegeEscalation: true capabilities: {} privileged: false ...
  8. Copyright 2020 Red Hat K.K. Red Hat Universal Base Images

    (UBI) 9 ▸ RHEL7とRHEL8をベースとしたコンテナイメージとして無償提供 ・ RHELの有償サブスクリプションの有無とは無関係 ▸ UBIに独自ソフトウェアを追加して第3者に配布可能 ・ UBIに関するEnd User License Agreementを遵守することが条件 ・ Red Hatが提供するパッケージについては、 UBI専用のリポジトリによって提供されるパッケージの みをUBIに追加できるといった制約があります ▸ UBIは任意の環境で実行可能 ・ RHEL/OpenShift環境の場合だと、コンテナの 実行基盤からUBIの部分までRed Hatのサポート対象 CONTAINER UBI RUNTIME APP RED HAT PLATFORM CONTAINER UBI RUNTIME APP NON-RED HAT PLATFORM Fully supported by Red Hat Supported by end user
  9. Copyright 2020 Red Hat K.K. UBIとDockerfileを利用したコンテナイメージの作成 10 ▸ Docker CLIと同様にDockerfileを利用してコンテナイメージを作成可能

    $ cat << EOF > myecho > echo "This container works!!" > EOF $ cat << EOF > Dockerfile > FROM registry.access.redhat.com/ubi8/ubi > ADD myecho /usr/local/bin > ENTRYPOINT "/usr/local/bin/myecho" > EOF $ chmod +x myecho $ ./myecho This container works!! $ ls Dockerfile myecho $ podman build . STEP 1: FROM registry.access.redhat.com/ubi8/ubi ... Storing signatures STEP 2: ADD myecho /usr/local/bin 9f842e451aeb46b0852a33362f0632d182008631e30ead39fa03bbd5ac8eb18f STEP 3: ENTRYPOINT "/usr/local/bin/myecho" STEP 4: COMMIT 0db4e77ef97e260c24129434881a51d06dcb32f5f38aaecf193aca62aa60c890 $ podman images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 0db4e77ef97e 2 minutes ago 211 MB registry.access.redhat.com/ubi8/ubi latest ecbc6f53bba0 2 weeks ago 211 MB
  10. Copyright 2020 Red Hat K.K. 作成したコンテナイメージのpush 11 ▸ PodmanによりビルドしたOCI準拠イメージの格納先となる、SaaS形態のレジストリ ・

    Red Hat Quay.io ▸ 上記はエンタープライズ用途を想定したKubernetes/OpenShiftのレジストリとして利用でき、 無料お試しプランがあります ・ Red Hat Quay.ioでは、パブリックなレジストリを無料かつ無制限に利用可能 ▸ 他にもRed Hat OpenShiftなどにあるプライベートレジストリにもpush可能 ▸ Docker CLIと同様にイメージIDにタグ付けしてpush可能 $ podman login quay.io Username: <your_user_name> Password: <your_password> Login Succeeded! $ podman images $ podman tag <作成したイメージの Container ID> quay.io/<your_user_name>/myecho $ podman push quay.io/<your_user_name>/myecho Red Hat Quay.ioに イメージpushする際の手順例
  11. Copyright 2020 Red Hat K.K. Buildahによるイメージビルド 12 ▸ BuildahはPodmanより先に産まれた、イメージビルドのためのプロジェクト ▸

    Kubernetesのコンテナランタイムが、DockerからOCI準拠に基づいたCRI-Oに移行した際に、 Dockerに依存しないイメージビルド用の新しいツールが必要となったため、開発されました ・ PodmanはCRI-Oを利用しない「Pod Manager」として開発されており、 Kubernetesを意識した Pod単体でのデバッグも開発目的としています ▸ BuidahもPodmanと同様にデーモンレスのビルドツール ▸ 「podman build」はBuildahのソースコードを利用して実装 ▸ ベースイメージに基づいたビルドだけでなく、 スクラッチ(空)からのイメージビルドが可能 ▸ 最低限のアプリとランタイムだけを 含んだ最小イメージのビルドが可能
  12. Copyright 2020 Red Hat K.K. Buildahによるスクラッチからのイメージビルド 13 ▸ Podmanと同様にBuildahもyumでインストール可能 ▸

    スクラッチからのイメージビルド例 $ sudo yum -y install buildah $ buildah from scratch <- 「working-container」という名前の scratchコンテナを作成 working-container $ buildah unshare <- 特権ユーザの権限を利用して、コンテナの rootファイルシステムをユーザのホームディレクトリの中にマウントできるようになります # scratchmnt=$(buildah mount working-container) <- scratchコンテナのrootファイルシステムをマウント # yum install -y --releasever=8 --installroot=$scratchmnt redhat-release <- scratchコンテナでの RPMデータベースの初期化と redhat-releaseパッケージの追加 # yum install -y --setopt=reposdir=/etc/yum.repos.d \ --installroot=$scratchmnt \ --setopt=cachedir=/tmp/cache/dnf bash <- scratchコンテナへの bashのインストール # echo "echo Your container from scratch worked." > $scratchmnt/usr/local/bin/myecho <- scratchコンテナにmyechoファイルの追加 # chmod +x $scratchmnt/usr/local/bin/myecho # buildah config --entrypoint "/usr/local/bin/myecho" working-container <- コンテナ起動時に myechoファイルを実行することを指定 # buildah commit working-container localhost/myecho:latest <- scratchコンテナの変更をコミットして「 localhost/myecho」イメージを作成 # exit $ podman run localhost/myecho <- buildahで作成したイメージを podmanで起動 Your container from scratch worked.
  13. Copyright 2020 Red Hat K.K. 参考情報 14 ▸ DockerユーザのためのPodmanとBuildahの紹介 ・

    https://rheb.hatenablog.com/entry/2020/07/16/podman_buidah_for_docker_users ▸ ルートレスのPodmanはどのように動作しますか? ・ https://rheb.hatenablog.com/entry/how-does-rootless-podman-work ▸ Red Hat Enterprise Linux 8 での Linux コンテナーの構築、実行、および管理 ・ Podman/Buildah/Skopeo/UBIについての利用方法を紹介しています ・ https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/b uilding_running_and_managing_containers/index