nerdctl怎么使用

84次阅读
没有评论

共计 6924 个字符,预计需要花费 18 分钟才能阅读完成。

这篇文章主要介绍“nerdctl 怎么使用”,在日常操作中,相信很多人在 nerdctl 怎么使用问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nerdctl 怎么使用”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

现有 CLI 的不足

虽然 Docker 能干的事情,现在 Containerd 都能干,但 Containerd 还有一个非常明显的缺陷:CLI 不够友好。它无法像 Docker 和 Podman 一样通过一条简单的命令启动一个容器,它的两个 CLI 工具 ctr 和 crictl 都无法实现这么一件非常简单的需求,而这个需求是大多数人都需要的,我总不能为了在本地测试容器而专门部署一个 Kubernetes 集群吧?

ctr 的设计对人类不太友好,例如缺少以下这些和 Docker 类似的功能:

docker run -p PORT

docker run –restart=always

通过凭证文件 ~/.docker/config.json 来拉取镜像

docker logs

除此之外还有一个 CLI 工具叫 crictl,和 ctr 一样不太友好。

为了解决这个痛点,Containerd 官方推出了一个新的 CLI 叫 nerdctl。nerdctl 的使用体验和 docker 一样顺滑,例如:

???? → nerdctl run -d -p 8080:80 --name=nginx --restart=always nginx

nerdctl 只是 docker 的复制品?

nerdctl 的目标并不是单纯地复制 docker 的功能,它还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)、镜像加密(imgcrypt)等。

延迟拉取镜像功能可以参考这篇文章:Containerd 使用 Stargz Snapshotter 延迟拉取镜像。

虽然这些功能预计最终也会在 Docker 中实现,但可能需要几个月甚至几年的时间,因为 Docker 目前的设计只使用一小部分 Containerd 子系统。将来 Docker 有可能重构代码以使用完整的 Containerd,但目前还没看到什么实质性进展。所以 Containerd 社区决定创建一个新的 CLI 来更友好地使用 Containerd。

nerdctl 试用

你可以从 nerdctl 的 release 中下载最新的可执行文件,每一个版本都有两种可用的发行版:

nerdctl- VERSION -linux-amd64.tar.gz : 只包含 nerdctl。

nerdctl-full- VERSION -linux-amd64.tar.gz : 包含了 nerdctl 和相关依赖组件(containerd, runc, CNI, …)。

如果你已经安装了 Containerd,只需要选择前一个发行版,否则就选择完整版。

安装好 nerdctl 后,就可以使用 nerdctl 来运行容器了:

???? → nerdctl run -d -p 80:80 --name=nginx --restart=always nginx:alpine
docker.io/library/nginx:alpine: resolved |++++++++++++++++++++++++++++++++++++++|
index-sha256:d33e9e24389d7d8b90fe2bcc2dd1bc09b4d235e916ba9d5d9a71cf52e340edb6: done |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:c1f4e1974241c3f9ddb2866b2bf8e7afbceaa42dae82aabda5e946d03f054ed2: done |++++++++++++++++++++++++++++++++++++++|
config-sha256:bfad9487e175364fd6315426feeee34bf5e6f516d2fe6a4e9b592315e330828e: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:29d3f97df6fd99736a0676f9e57e53dfa412cf60b26d95008df9da8197f1f366: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:9aae54b2144e5b2b00c610f8805128f4f86822e1e52d3714c463744a431f0f4a: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:a5f0adaddd5456b7c5a3753ab541b5fad750f0a6499a15f63571b964eb3e2616: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:5df810e1c460527fe400cdd2cab62228f5fb3da0f2dce86a6a6c354972f19b6e: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:345aee38d3533398e0eb7118e4323a8970f7615136f2170dfb2b0278bbd9099d: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:e6a4c36d7c0e358e5fc02ccdac645b18b85dcfec09d4fb5f8cbdc187ce9467a0: done |++++++++++++++++++++++++++++++++++++++|
elapsed: 5.7 s total: 9.4 Mi (1.6 MiB/s)
27b55e0b18b10c4c8f34e3ba709614e7b1760a75db061d2ce5183e8b1101ce09

查看创建的容器:

???? → nerdctl ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b5faa266a43 docker.io/library/nginx:alpine  /docker-entrypoint.…  3 minutes ago Up 0.0.0.0:80- 80/tcp nginx

和 Docker 一样,Containerd 也有一个子命令 network:

???? → nerdctl network ls
NETWORK ID NAME FILE
0 bridge
 k8s-pod-network /etc/cni/net.d/10-calico.conflist
 host
 none

来看下默认的 bridge 配置:

???? → nerdctl network inspect bridge
 {
  CNI : {
  cniVersion :  0.4.0 ,
  name :  bridge ,
  nerdctlID : 0,
  plugins : [
 {
  type :  bridge ,
  bridge :  nerdctl0 ,
  isGateway : true,
  ipMasq : true,
  hairpinMode : true,
  ipam : {
  type :  host-local ,
  routes : [
 {
  dst :  0.0.0.0/0 
 }
 ],
  ranges : [
 [
 {
  subnet :  10.4.0.0/24 ,
  gateway :  10.4.0.1 
 }
 ]
 ]
 }
 },
 {
  type :  portmap ,
  capabilities : {
  portMappings : true
 }
 },
 {
  type :  firewall 
 },
 {
  type :  tuning 
 }
 ]
 },
  NerdctlID : 0
 }
]

可以看到 network 子命令背后还是 CNI 在运作,与 docker network 子命令原理不同。

构建镜像

nerdctl 也可以和 buildkit 结合使用来构建容器镜像,需要先下载 buildkit 的可执行文件:

???? → wget https://github.com/moby/buildkit/releases/download/v0.8.2/buildkit-v0.8.2.darwin-amd64.tar.gz

将其解压到 $PATH 中:

???? → tar -C /usr/local/ -zxvf buildkit-v0.8.2.linux-amd64.tar.gz

编写 systemd unit 文件:

# /etc/systemd/system/buildkit.service
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit
[Service]
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true
[Install]
WantedBy=multi-user.target

启用 buildkit.service 并设置开机自动运行:

???? → systemctl enable --now buildkit.service

下面以 KubeSphere 项目为例,展示如何使用 nerdctl 来构建镜像。

首先克隆 KubeSphere 官方仓库:

???? → git clone --depth=1 https://github.com.cnpmjs.org/kubesphere/kubesphere.git

进入仓库目录,编译二进制文件:

???? → cd kubesphere
???? → make ks-apiserver

将二进制文件拷贝到 Dockerfile 目录:

???? → cp bin/cmd/ks-apiserver build/ks-apiserver

进入 Dockerfile 目录,修改 Dockerfile:

# Copyright 2020 The KubeSphere Authors. All rights reserved.
# Use of this source code is governed by an Apache license
# that can be found in the LICENSE file.
FROM alpine:3.11
ARG HELM_VERSION=v3.5.2
RUN apk add --no-cache ca-certificates
# install helm
RUN wget https://get.helm.sh/helm-${HELM_VERSION}-linux-amd64.tar.gz   \
 tar xvf helm-${HELM_VERSION}-linux-amd64.tar.gz   \
 rm helm-${HELM_VERSION}-linux-amd64.tar.gz   \
 mv linux-amd64/helm /usr/bin/   \
 rm -rf linux-amd64
# To speed up building process, we copy binary directly from make
# result instead of building it again, so make sure you run the
# following command first before building docker image
# make ks-apiserver
COPY ks-apiserver /usr/local/bin/
EXPOSE 9090
CMD [sh]

构建镜像:

???? → cd build/ks-apiserver
???? → nerdctl build -t ks-apiserver .
[+] Building 22.6s (9/9) FINISHED
 =  [internal] load build definition from Dockerfile 0.0s
 =  =  transferring dockerfile: 812B 0.0s
 =  [internal] load .dockerignore 0.0s
 =  =  transferring context: 2B 0.0s
 =  [internal] load metadata for docker.io/library/alpine:3.11 1.0s
 =  [1/4] FROM docker.io/library/alpine:3.11@sha256:bf5fa774f08a9ed2cb301e522b769d43d48124315a4ec50eae3228d03b9dc558 7.9s
 =  =  resolve docker.io/library/alpine:3.11@sha256:bf5fa774f08a9ed2cb301e522b769d43d48124315a4ec50eae3228d03b9dc558 0.0s
 =  =  sha256:9b794450f7b6db7c944ba1f4161edb68cb535052fe7db8ac06e613516c4a658d 2.10MB / 2.82MB 21.4s
 =  =  extracting sha256:9b794450f7b6db7c944ba1f4161edb68cb535052fe7db8ac06e613516c4a658d 0.1s
 =  [internal] load build context 1.0s
 =  =  transferring context: 115.87MB 1.0s
 =  [2/4] RUN apk add --no-cache ca-certificates 2.7s
 =  [3/4] RUN wget https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz   tar xvf helm-v3.5.2-linux-amd64.tar.gz   rm helm-v3.5.2-linux-amd64.tar.gz   mv linux-amd64 4.7s
 =  [4/4] COPY ks-apiserver /usr/local/bin/ 0.2s
 =  exporting to oci image format 5.9s
 =  =  exporting layers 4.6s
 =  =  exporting manifest sha256:d7eb2a90496678d11ac5c363b7743ffe2b8e23e7071b94556a5e3231f50f5a6e 0.0s
 =  =  exporting config sha256:8eb6a5187ce958e76c8d37e18221d88f25b48dd7e6672021d0fce21bb071f284 0.0s
 =  =  sending tarball 1.3s
unpacking docker.io/library/ks-apiserver:latest (sha256:d7eb2a90496678d11ac5c363b7743ffe2b8e23e7071b94556a5e3231f50f5a6e)...done
unpacking overlayfs@sha256:d7eb2a90496678d11ac5c363b7743ffe2b8e23e7071b94556a5e3231f50f5a6e (sha256:d7eb2a90496678d11ac5c363b7743ffe2b8e23e7071b94556a5e3231f50f5a6e)...done

查看构建好的镜像:

???? → nerdctl images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.11 bf5fa774f08a 3 seconds ago 2.7 MiB
ks-apiserver latest d7eb2a904966 6 minutes ago 57.7 MiB

到此,关于“nerdctl 怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计6924字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)