Podman、Buildah、CRI-O、Skopeoなどのコンテナツールを使用することの優れた点の1つは、画像をプルおよびプッシュするための同じライブラリ、つまりコンテナ/画像に基づいていることです。私はよくcontainers/image
について説明します 異なるタイプのコンテナストレージ間でイメージをコピーするためのライブラリとしてのプロジェクト。このストレージは、コンテナーレジストリ、コンテナー/ストレージ、ディレクトリやtarballなどのファイルシステムオブジェクト、さらにはDockerデーモンに直接配置できます。異なるタイプのコンテナストレージ間でこれらのコンテナイメージを移動するメカニズムは、トランスポートと呼ばれます。 。 containers/image
の最も理解されていない機能の1つ サポートされているさまざまなトランスポートです。
トランスポート
画像はtransport:ImageNameを使用して指定されます フォーマット。トランスポートが指定されていない場合、docker
(コンテナレジストリ)トランスポートは、Skopeo以外のすべてのツールでデフォルトで使用されます。 Skopeoでは、ユーザーは常にトランスポートを設定する必要があります。
Dockerが行ったクールなことの1つは、コンテナーレジストリのアイデアを発明したことです。 、これは基本的にコンテナイメージを含むWebサーバーです。 Docker.io、quay.io、Artifactoryはすべてコンテナーレジストリの例です。 Dockerエンジニアリングチームは、コンテナレジストリからこれらのイメージをプルおよびプッシュするためのプロトコルを定義しました。これをdocker
と呼びます。 輸送。
[お楽しみいただけるかもしれません:コンテナを使い始めるための12のPodmanガイド]
docker:// docker-reference
イメージ参照は、リモートコンテナイメージレジストリに保存されます。例:quay.io/podman/stable:latest
。参照には、特定のレジストリへのホスト名を含めることができます。
$ skopeo copy docker://docker.io/alpine dir:/tmp/alpine
$ podman run docker://registry.fedoraproject.org/fedora:latest echo hello
PodmanとBuildahの場合、docker://
デフォルトのトランスポートです。便宜上ドロップすることができます:
$ podman pull registry.fedoraproject.org/fedora:latest
fedora
のような画像をプルするために短い名前を使用する場合 、PodmanとBuildahは、レジストリのリストを使用してDocker参照を作成し、docker://
を使用して呼び出します。 輸送。
Containers/image
コンテナイメージをコピーおよび保存するための他の非常に多くのトランスポートもサポートしています。
oci:path
oci
トランスポートは、イメージがOpen Container Image Layout Specificationに準拠していることを前提として、コンテナーイメージのコンテンツをローカルディレクトリにエクスポート/インポートします。マニフェストとレイヤーのtarballは、個別のファイルとしてディレクトリにエクスポートされます。
$ skopeo copy oci:/tmp/myimage docker://registry.example.com/myimage
$ podman run oci:/tmp/fedora echo hello
dir
dir
トランスポートは、コンテナーイメージのコンテンツをローカルディレクトリにダンプします。これも、イメージがDockerイメージレイアウトに準拠していることを前提としています。マニフェスト、レイヤーtarball、および署名は、個別のファイルとしてディレクトリにエクスポートされます。これは標準化されていない形式であり、主にデバッグや非侵襲的なコンテナ検査に役立ちます。 oci
と非常によく似ています 転送しますが、従来のDocker形式を使用してファイルを保存します。
$ podman save --format docker-dir fedora -o /tmp/fedora
$ podman run dir:/tmp/fedora echo hello
docker-archive
Dockerエンジニアがコンテナイメージを保存および転送するために開発したもう1つの方法は、tar
を使用することです。 。 tarball コンテナイメージを構成するすべてのファイルが含まれています。これらのtarballは、もともとdocker save
を使用して作成されました およびpodman save
コマンド。 docker load
を使用して、コンテナエンジンのローカルストレージにロードして戻すことができます。 およびpodman load
。 container/image
ライブラリはこのアーカイブ形式をトランスポートにし、podman run dir:/tmp/fedora.tag echo hello
などの他のコマンドで直接使用できるようにします。 、またはbuildah from dir:/tmp/fedora.tar
$ skopeo copy docker://registry.fedoraproject.org/fedora:latest docker-archive:/tmp/fedora.img
$ podman run docker-archive:/tmp/fedora.img echo hello
警告 :docker-archive
を使用する ほとんどの場合、正しいことではありません。このフォーマットは、ストレージとI/Oの両方にとって非常に無駄です。ユーザーが一時的なdocker/distribution
を実行することをお勧めします 代わりにレジストリ。
oci-archive
この形式は、docker-archive
に似ています。 、ただし、レガシー形式ではなく、単一の画像をOCI形式で保存します。パスは、指定されたパスのディレクトリにあるOpen Container Image Layout Specificationに準拠した画像であり、タグが付けられています。
$ skopeo copy docker-archive:/tmp/fedora.img oci-archive:/tmp/fedora-oci.img
$ podman run oci-archive:/tmp/fedora-oci.img echo hello
docker-daemon
containers/image
の最も優れた機能の1つ docker-daemon
のサポートです 輸送。 DockerとPodmanは同じストレージを共有しません。 Dockerがデーモン内のストレージへのロックを制御しているため、これらはできません。 Podman、Buildah、CRI-O、およびSkopeoはコンテンツを共有できますが、containers/storage
を介してファイルシステムを使用します。 。
Podmanおよびその他のツールは、docker-daemon
で動作します。 docker-daemon
を介して間接的にストレージ 輸送。これにより、コンテナエンジンは、Dockerデーモンによって以前にプルされたイメージまたはdocker build
によってビルドされたイメージに直接アクセスできます。 。 BuildahとPodmanによって作成されたイメージをDockerデーモンに直接移動することもできます。
このようなもの:
podman run docker-daemon:alpine echo hello
注 :PodmanはDockerデーモンから画像を引き出し、画像をcontainers/storage
に保存しています 、次にコンテナを実行します。 Dockerストレージを直接使用していません。 PodmanがDockerと通信できるようにするには、Dockerデーモンがroot権限を必要とするため、rootとして実行する必要があります。
$ sudo docker pull fedora
$ sudo podman run docker-daemon:docker.io/library/fedora echo hello
buildah
を介してイメージをビルドする場合 、画像をdocker-daemon
に直接コミットできます :
# ctr=$(buildah from fedora)
# mnt=$(buildah mount $ctr)
# install -m 0744 start.sh $/mnt
# buildah commit $ctr docker-damon:myimage
注 :docker-daemon
を使用するのはクールですが このような輸送は、I/Oとストレージのコストが非常に高い最後の手段です。いずれかのstorage/ecosystem
で実行するプロセスを統合する ほとんどの場合、より良いです。たとえば、Dockerデーモンからイメージを引き出してから、containers/storage
を使用する方がよいでしょう。 それを実行するため。
$ sudo podman pull docker-daemon:registry.fedoraproject.org/library/fedora
$ podman run fedora echo hello
コンテナ-ストレージ
最後の「トランスポート」は実際にはトランスポートではありませんが、containers/storage
を使用して作成されたローカルストレージに画像を保存するためのメカニズムです。 図書館。 docker-reference
の形式 Dockerトランスポートで詳細に説明されています。
$ skopeo copy docker://registry.access.redhat.com/ubi8:latest containers-storage:ubi8:latest
BuildahとPodmanは、デフォルトで画像をコンテナストレージに保存します:
$ podman image pull ubi8
上記のPodmanコマンドは、 ubi8の短縮名を展開します registry.access.redhat.com/ubi8:latest
へ 次に、docker:// transport
を使用します registry.access.redhat.com
からプルします 。次に、コンテンツをcontainers/storage
に直接保存します 。
$ buildah push docker://quay.io/myrepo/myimage
上記のBuildahコマンドは、コンテナストレージを調べてから、docker://
を使用してイメージをプッシュします。 quay.ioレジストリに転送します。
[コンテナを使い始めますか?この無料コースをチェックしてください。コンテナ化されたアプリケーションのデプロイ:技術的な概要。 ]
結論
container/image
ライブラリは、マシンとさまざまな種類のストレージ間でコンテナイメージを転送するための優れた方法を提供します。それはコンテナエンジンに不可欠であり、いくつかの本当にクールな機能を提供します。コンテナトランスポートのマニュアルページを使用して、トランスポートについて詳しく調べてください。