GNU/Linux >> Linux の 問題 >  >> Linux

7つの楽しいLinuxコンテナ/画像転送機能

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 loadcontainer/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 ライブラリは、マシンとさまざまな種類のストレージ間でコンテナイメージを転送するための優れた方法を提供します。それはコンテナエンジンに不可欠であり、いくつかの本当にクールな機能を提供します。コンテナトランスポートのマニュアルページを使用して、トランスポートについて詳しく調べてください。


Linux
  1. docker は Linux コンテナー内で実行できますか?

  2. Docker イメージ/コンテナの中身は?

  3. Dockerコンテナ内のLinux perfツールでデバッグシンボルを機能させるにはどうすればよいですか?

  1. Linuxコンテナとイメージの違いは何ですか?

  2. Docker(およびLinuxコンテナー)とは何ですか?

  3. Docker コンテナーで実行されている OS はどれですか?

  1. 低レベルのLinuxコンテナランタイムの歴史

  2. LinuxでDockerコンテナを作成、一覧表示、削除する方法

  3. Dockerコンテナを一覧表示する方法