fbpx

Docker 24ベータ版の新機能: containerdイメージストアへの統合 #docker #containerd #stargz

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の正式リリースに、この機能が本採用されることを期待したいと思います。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA