CL LAB

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

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

 ★ 24

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

CL LAB Mail Magazine

CL LABの情報を逃さずチェックしよう!

メールアドレスを登録すると記事が投稿されるとメールで通知します。

メールアドレス: 登録

※登録後メールに記載しているリンクをクリックして認証してください。

Related post

Neo4j[ホワイトペーパー]CCPA