Docker 24ベータ版の新機能: containerdイメージストアへの統合 #docker #containerd #stargz
![](https://www.creationline.com/tech-blog/cms_x3GWkuX/wp-content/uploads/2019/07/docker-favicon.png)
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
2023年4月14日にリリースされた Docker 24.0.0-beta.2 には、containerdのさらなる統合が行われました。これはDockerイメージの格納にcontainerdを利用できるようになるというものです。
Docker has used containerd as part of Docker Engine for managing the container lifecycle (creating, starting, and stopping) for a while now! This new work is a step towards a deeper integration of containerd into the Docker Engine. It lets you use containerd to store images and then push and pull them.
訳: Dockerはしばらくの間、コンテナライフサイクル(作成・開始・停止)を管理するために、Docker Engineの一部としてcontainerdを使用していました。今回の新しい取り組みは、containerdをDocker Engineにさらに深く統合するための一歩です。これにより、イメージの格納・プッシュ・プルにcontainerdを利用できるようになります。
本稿ではDocker 24の正式リリースに先駆けて、containerdのさらなる統合についてテストしてみます。
注意: Docker 24はまだベータ版で、本番環境では利用できません。また、この機能に関しても今後変更される可能性があります。
Docker 24ベータ版のインストール
今回は Rocky Linux 9 を仮想マシンにインストールしてテストしました。VMとOSの準備は既に終わっているものとします。
Dockerのインストールは CentOS版 に従います。
このままではベータ版はインストールできないので、デフォルトでは無効になっているテスト版レポジトリを有効化します。
$ sudo yum-config-manager --enable docker-ce-test $
これでベータ版をインストールできるようになったので Docker 24.0.0~beta.2 をインストールします。
$ sudo yum install docker-ce-3:24.0.0~beta.2-1.el9 Last metadata expiration check: 0:00:30 ago on Wed 19 Apr 2023 06:47:04 AM UTC. Dependencies resolved. ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: docker-ce x86_64 3:24.0.0~beta.2-1.el9 docker-ce-test 24 M Installing dependencies: checkpolicy x86_64 3.4-1.el9 appstream 346 k container-selinux noarch 3:2.189.0-1.el9 appstream 47 k containerd.io x86_64 1.6.20-3.1.el9 docker-ce-stable 33 M docker-ce-cli x86_64 1:24.0.0~beta.2-1.el9 docker-ce-test 7.1 M docker-ce-rootless-extras x86_64 24.0.0~beta.2-1.el9 docker-ce-test 3.9 M fuse-overlayfs x86_64 1.9-1.el9 appstream 71 k fuse3 x86_64 3.10.2-5.el9.0.1 appstream 53 k fuse3-libs x86_64 3.10.2-5.el9.0.1 appstream 91 k libslirp x86_64 4.4.0-7.el9 appstream 68 k policycoreutils-python-utils noarch 3.4-4.el9 appstream 69 k python3-audit x86_64 3.0.7-103.el9 appstream 83 k python3-libsemanage x86_64 3.4-2.el9 appstream 80 k python3-policycoreutils noarch 3.4-4.el9 appstream 2.0 M python3-setools x86_64 4.4.0-5.el9 baseos 546 k python3-setuptools noarch 53.0.0-10.el9_1.1 baseos 839 k slirp4netns x86_64 1.2.0-2.el9 appstream 46 k Installing weak dependencies: docker-buildx-plugin x86_64 0.10.4-1.el9 docker-ce-stable 12 M docker-compose-plugin x86_64 2.17.2-1.el9 docker-ce-stable 11 M Transaction Summary ================================================================================ Install 19 Packages Total download size: 95 M Installed size: 375 M Is this ok [y/N]: y (省略)
Dockerを起動します。
$ sudo systemctl start docker $ sudo systemctl enable docker Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service. $ sudo docker system info Client: Docker Engine - Community Version: 24.0.0-beta.2 Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.10.4 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v2.17.2 Path: /usr/libexec/docker/cli-plugins/docker-compose Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 1 Server Version: 24.0.0-beta.2 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Using metacopy: false Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: systemd Cgroup Version: 2 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: io.containerd.runc.v2 runc Default Runtime: runc Init Binary: docker-init containerd version: 2806fc1057397dbaeefbea0e4e17bddfbd388f38 runc version: v1.1.5-0-gf19387a init version: de40ad0 Security Options: seccomp Profile: builtin cgroupns Kernel Version: 5.14.0-162.6.1.el9_1.x86_64 Operating System: Rocky Linux 9.1 (Blue Onyx) OSType: linux Architecture: x86_64 CPUs: 2 Total Memory: 3.819GiB Name: node1 ID: 6856f2e4-ba3a-411e-9d97-c387a4c55a41 Docker Root Dir: /var/lib/docker Debug Mode: false Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false $
インストールが完了しました。デフォルトではイメージ管理は従来同様Docker独自のものとなっています。Storage Driver の部分に注目しましょう。
Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Using metacopy: false Native Overlay Diff: true userxattr: false
従来のDockerイメージ格納方法
実際の従来同様の方法かどうか確認してみましょう。まず nginx:1.22 イメージをプルしてみます。
$ sudo docker image pull nginx:1.22 1.22: Pulling from library/nginx (中略) Status: Downloaded newer image for nginx:1.22 docker.io/library/nginx:1.22 $ sudo docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.22 0f8498f13f3a 3 weeks ago 142MB $
このように、docker image pull でプルしたイメージは、docker image ls で確認することができます。
containerd のイメージストアを確認してみましょう。Docker が containerd に管理を任せているのは moby ネームスペースです。過去記事「CRI を containerd にして kubeadm で Kubernetes クラスタをセットアップしてみた」もご覧ください。
$ sudo ctr --namespace moby image ls REF TYPE DIGEST SIZE PLATFORMS LABELS $
このように、containerd のイメージストアには何もありません。
ついでなので、containerd のイメージストアに hello-world:latest イメージをプルしてみましょう。
$ sudo ctr --namespace moby image pull docker.io/library/hello-world:latest docker.io/library/hello-world:latest: (中略) done: 48.545483ms $ sudo ctr --namespace moby image ls REF TYPE DIGEST SIZE PLATFORMS LABELS docker.io/library/hello-world:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:4e83453afed1b4fa1a3500525091dbfca6ce1e66903fd4c01ff015dbcb1ba33e 6.9 KiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/riscv64,linux/s390x,windows/amd64 -
もちろん ctr image ls で確認することができ、
$ sudo docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.22 0f8498f13f3a 3 weeks ago 142MB $
docker image ls では確認できません。以上が従来のイメージストアの状況です。
イメージ管理の統合
それではDockerのイメージ管理をcontainerdに任せてしまいましょう。手順は Install Stargz Snapshotter for Docker(Moby) with Systemd に従います。
まず、Dockerとcontainerdの設定ファイルを編集します。
$ sudo vi /etc/docker/daemon.json { "features": { "containerd-snapshotter": true }, "storage-driver": "stargz" } $
$ sudo cp -a /etc/containerd/config.toml /etc/containerd/config.toml.orig $ sudo vi /etc/containerd/config.toml version = 2 # Plug stargz snapshotter into containerd [proxy_plugins] [proxy_plugins.stargz] type = "snapshot" address = "/run/containerd-stargz-grpc/containerd-stargz-grpc.sock" $
fuse をインストールし、カーネルモジュールを有効化します。このテスト環境では既に有効でした。
$ sudo yum install -y fuse Package fuse-2.9.9-15.el9.x86_64 is already installed. Dependencies resolved. Nothing to do. Complete! $ sudo modprobe fuse $
Stargz Snapshotter v0.14.3 をインストールします。
$ curl -LO https://github.com/containerd/stargz-snapshotter/releases/download/v0.14.3/stargz-snapshotter-v0.14.3-linux-amd64.tar.gz -LO https://github.com/containerd/stargz-snapshotter/releases/download/v0.14.3/stargz-snapshotter-v0.14.3-linux-amd64.tar.gz.sha256sum $ sha256sum -c stargz-snapshotter-v0.14.3-linux-amd64.tar.gz.sha256sum stargz-snapshotter-v0.14.3-linux-amd64.tar.gz: OK $ sudo tar -C /usr/local/bin -xvf stargz-snapshotter-v0.14.3-linux-amd64.tar.gz containerd-stargz-grpc ctr-remote containerd-stargz-grpc ctr-remote $ ls -l /usr/local/bin/ total 84284 -rwxr-xr-x. 1 root root 59637768 Mar 8 10:08 containerd-stargz-grpc -rwxr-xr-x. 1 root root 26664136 Mar 8 10:08 ctr-remote $ sudo curl -Lo /etc/systemd/system/stargz-snapshotter.service https://raw.githubusercontent.com/containerd/stargz-snapshotter/v0.14.3/script/config/etc/systemd/system/stargz-snapshotter.service ls -l /etc/systemd/system/stargz-snapshotter.service -rw-r--r--. 1 root root 312 Apr 19 07:15 /etc/systemd/system/stargz-snapshotter.service $
Stargz Snapshotter を有効化・起動し、containerdとdockerを再起動します。
$ sudo systemctl enable --now stargz-snapshotter Created symlink /etc/systemd/system/multi-user.target.wants/stargz-snapshotter.service → /etc/systemd/system/stargz-snapshotter.service. $ sudo systemctl restart containerd $ sudo systemctl restart docker $
ここで再度 docker system info を見てみましょう。
$ sudo docker system info (省略) Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 1 Server Version: 24.0.0-beta.2 Storage Driver: stargz driver-type: io.containerd.snapshotter.v1 Logging Driver: json-file (省略)
Storage Driver が overlay2 から stargz に変わっていることに注目しましょう。これでDockerのイメージ管理がcontainerdに統合されました。
イメージ管理の確認
Dockerから確認してみましょう。
$ sudo docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 4e83453afed1 19 minutes ago 7.03kB $
おや、先程 docker image pull nginx:1.22 したのに、ctr --namespace moby image pull docker.io/library/hello-world:latest したものが見えているではありませんか。
つまり docker image ls で見えているのはDockerのイメージストアではなく、containerdのイメージストアであることがわかります。
改めて nginx:1.22 をDocker側でプルしてみましょう。
$ docker image pull nginx:1.22 (中略) docker.io/library/nginx:1.22 $
そして、Dockerのイメージストアとcontainerdのイメージストアの両方を確認してみましょう。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 4e83453afed1 23 minutes ago 7.03kB nginx 1.22 fc5f5fb75747 3 seconds ago 57MB $
$ sudo ctr --namespace moby image ls REF TYPE DIGEST SIZE PLATFORMS LABELS docker.io/library/hello-world:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:4e83453afed1b4fa1a3500525091dbfca6ce1e66903fd4c01ff015dbcb1ba33e 6.9 KiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/riscv64,linux/s390x,windows/amd64 docker.io/library/nginx:1.22 application/vnd.docker.distribution.manifest.list.v2+json sha256:fc5f5fb7574755c306aaf88456ebfbe0b006420a184d52b923d2f0197108f6b7 54.4 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x $
両方で nginx:1.22 が見えています。
containerd側でもプルしてみましょう。
$ sudo ctr --namespace moby image pull docker.io/library/busybox:1.36 docker.io/library/busybox:1.36: (略) unpacking linux/amd64 sha256:b5d6fe0712636ceb7430189de28819e195e8966372edfc2d9409d79402a0dc16... done: 198.253013ms $
両方のイメージストアを確認してみます。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE busybox 1.36 b5d6fe071263 44 seconds ago 2.6MB hello-world latest 4e83453afed1 27 minutes ago 7.03kB nginx 1.22 fc5f5fb75747 3 minutes ago 57MB $
$ sudo ctr --namespace moby image ls REF TYPE DIGEST SIZE PLATFORMS LABELS docker.io/library/busybox:1.36 application/vnd.docker.distribution.manifest.list.v2+json sha256:b5d6fe0712636ceb7430189de28819e195e8966372edfc2d9409d79402a0dc16 2.5 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/riscv64,linux/s390x docker.io/library/hello-world:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:4e83453afed1b4fa1a3500525091dbfca6ce1e66903fd4c01ff015dbcb1ba33e 6.9 KiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/riscv64,linux/s390x,windows/amd64 docker.io/library/nginx:1.22 application/vnd.docker.distribution.manifest.list.v2+json sha256:fc5f5fb7574755c306aaf88456ebfbe0b006420a184d52b923d2f0197108f6b7 54.4 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x $
やはり両者は同一の結果となりました。
まとめ
本稿ではDocker 24ベータ版の新機能であるcontainerdイメージストアの統合についてテストしてみました。
これによりイメージストアの二重管理の必要がなくなるうえに、containerdの強力なイメージストアの機能をDockerから利用できることが期待できます。今後のDocker 24の正式リリースに、この機能が本採用されることを期待したいと思います。