易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 23|回复: 7
收起左侧

containerd 作为容器kubernets后端容器 相关操作

[复制链接]
发表于 2025-1-16 17:19:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
配置Containerd6 G# b2 \8 ?4 [
在配置文件/etc/containerd/config.toml中添加以下内容:6 A- d5 z. L- Y" w1 S6 B
  M' x( R2 ~$ Q. b# Z! ~+ Z* M
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]% c) l' Y+ H  L5 ^: ~
...
, R! M7 Q: r1 \  ?3 A0 R& i [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
/ W. i* D- e- O6 Y/ B3 h   SystemdCgroup = true" q2 G% n* V% R0 K, C. u* j

7 W9 c  J. U1 G& m; }  t8 `8 j% z& a6 f重新加载Containerd配置并启动服务& p( a) \- K2 m/ [; l
使用以下命令重新加载配置文件并启动Containerd服务:
' h4 {1 o+ Q% y9 _4 x0 S$ I7 a* i8 B; D1 m, i3 ~
5 q/ t& O! f3 G/ r, _3 k
sudo systemctl daemon-reload
9 R1 e" Z* p& N0 x* e- Y7 Ysudo systemctl restart containerd.service4 B, G: d! G7 l9 z& E5 j+ `
验证Containerd安装是否成功
# J1 v4 O) A: i* @+ `" D6 H& {运行以下命令验证Containerd是否已成功安装:
5 L% \1 _$ p# m. w4 Y; P
) h1 ^3 U* w( W# {# M+ O' t2 n5 p2 {  f% p# N% W6 |

2 G6 l* P; n, n+ E9 j! C1 ^" }sudo ctr version9 D* q. S. W: ^2 P$ r
输出应为:3 K9 a' w2 ~/ B: Q8 T
1 |+ W& @2 @( u/ X6 H
+ m0 [" o! f! ]" H* T7 ~
codeClient:: Z9 r" T7 u5 X8 c) P
Version:  1.5.5
' {- T5 R6 l2 ~5 P! @ Revision: 09a19cb71a40ac5ab8686245e5a5fb5e5d25c144
2 J9 Z' D5 X8 S- C ...
, R0 z: G* ]6 Q: p9 z
4 T2 N' ]- g, Y4 S# iServer:
! \7 i$ g( @0 \3 y/ @! W, q Version:  1.5.57 Z) x, d% g* Z) ~
Revision: 09a19cb71a40ac5ab8686245e5a5fb5e5d25c1445 X  u9 B4 p' w. E- g, g. V  `
...
+ B$ M8 L* Z& q6 S& s以上就是在Linux系统中安装和部署Containerd的步骤,在安装和部署完成后,可以使用CLI命令或者API接口来管理容器和镜像,例如:
( Q, ]; o$ R$ w- \9 s
4 \3 X7 s, b; w, f; ^1 Q+ c! |& r2 m6 u1 \0 l+ l' Q
) i2 l2 h' i; S% r2 Z7 ?6 S0 I
# 拉取一个镜像) s' j7 }# P- W5 \
containerd ctr image pull docker.io/library/nginx:latest2 v: m* Q0 {( ~5 F, b# n8 B) J# J

8 O% d. F9 e) ]7 e% s. N$ H* N" M  P# 创建并启动一个容器
- E( Z: B* u0 X% Bcontainerd ctr run --rm docker.io/library/nginx:latest mynginx
9 T, j, w. h. @" r. F, j. G
9 n7 Z1 ?1 o" l$ c  }# 停止并删除一个容器5 j1 @3 S* `. f
containerd ctr stop mynginx# Y% q! `+ f/ i+ V: D( v) W* K
containerd ctr container rm mynginx1 b9 o# E0 p4 j) g/ S
Containerd还提供了CRI插件,可以用于Kubernetes集群中的容器运行时5 g; c# |7 ^4 I+ }" d0 H

8 n5 |2 M) w1 |& t3 N# ]" U' u/ J; f, L% A, v
% a+ _$ P& M9 c- l) {5 J" |
 楼主| 发表于 2025-1-16 17:27:10 | 显示全部楼层
#查看镜像:
5 L& k, h* Q: }7 x) k, S! kctr images ls 1 i& H3 A( w- B
--------# `- x2 E8 l* u* n8 u* K

, D5 u' u8 ?( b" u  a
. k) `$ c( t( b6 o) @##下载镜像
9 q- k# v+ {: ?& \* K$ qcontainerd 支持oci标准镜像 所以可以直接使用docker官方或dockerfile构建的镜像
* s" ^8 x& n7 L) F+ c7 ?
# K2 ]6 c+ c4 X! Gctr images pull  --platfrom linux/amd64  docker.io/library/nginx:alpine$ ^* r2 l. v0 H; t; [2 a; P7 j
7 ?3 J  f. _& O$ \- M
ctr images ls
4 w6 A; U2 S$ g4 y1 `3 M
% Z4 H/ Q' n8 [, n1 I镜像挂载$ L( _' ~  p  C4 f0 x
把已经下载的容器镜像挂载至当前文件系统
' b! F* A; u$ J$ k9 bctr images mount  docker.io/library/nginx:alpine /mnt
* ?5 Q/ h' o! I) k! _5 u: A% G
 楼主| 发表于 2025-1-16 17:29:46 | 显示全部楼层
1、Containerd镜像管理
! H+ H0 o& R7 j1.1 Containerd容器镜像管理命令; |, T' R/ _  h$ f! g: p
docker使用docker images命令管理镜像, _# [. r/ s! S! a. v! y& E4 l2 S
单机containerd使用ctr images命令管理镜像,containerd本身的CLI
4 E: b+ D: q' o( |k8s中containerd使用crictl images命令管理镜像,Kubernetes社区的专用CLI工具
# p& C1 y+ u/ L; K- h" P代码语言:text
2 R+ Q2 V' n& l( q3 w  j复制
* K9 z" z4 C, d; \4 b" m& D获取命令帮助; d% q# O! ^; \% `
# ctr --help! l7 S. d8 S# Q, v5 F
NAME:* O/ R& j- X1 R! [0 v
   ctr -
) ^& M" j; w& A        __
/ X0 B( I3 B; x9 Q  _____/ /______2 h& y/ O# U( }7 K( H
/ ___/ __/ ___/3 p1 N8 n1 P7 a- x9 a# n: u8 Q
/ /__/ /_/ /6 h% U' |8 ~' x( d, s" ^% z
\___/\__/_/6 r$ H  L5 \- o" t$ q
' Q' ~$ D% u$ k; h
......
, w* U, P& |' {* u$ ?9 p代码语言:text
: b4 {, u+ U( s2 c4 J. C" x/ Z- z复制
0 J/ r" o7 ]) l( F  p获取命令帮助9 d- a1 A4 Q: g. j& G8 W# `3 R
# ctr images! P- [$ i/ k; Z" p& g
NAME:
/ ^  c4 r$ l3 T3 S4 ?. l1 r3 q( c   ctr images - manage images0 r8 V% M: D# z7 o# m
8 U: b: h- [' r( Y' Q3 d0 r5 g8 A
USAGE:* G9 k4 O1 [' z
   ctr images command [command options] [arguments...]
; D4 M0 h) Y' s* w5 S4 @8 C$ b$ J% D) e' C, ?. i/ A
COMMANDS:- O5 c8 B- W8 q  a7 S; R3 L* D
   check                    check existing images to ensure all content is available locally3 p" ?* s6 E$ q/ u$ \4 B
   export                   export images/ S9 r* d+ ?* g% p6 X) {+ w
   import                   import images
6 M: b/ Y2 h7 C/ @, W   list, ls                 list images known to containerd! X" b# `, L6 [0 e2 C9 u
   mount                    mount an image to a target path  A" p* c" y* S! g% z
   unmount                  unmount the image from the target
) X! B" s" T0 C; K" x   pull                     pull an image from a remote( N+ W. x; z4 _0 z: e
   push                     push an image to a remote" G+ \2 A) L) H7 x$ D- ?3 m
   delete, del, remove, rm  remove one or more images by reference7 V% Q( n4 C/ r4 Q2 n  r  ?
   tag                      tag an image' M: C; \+ I. }# U& ]5 Y4 P
   label                    set and clear labels for an image
7 O0 f3 c3 v5 l   convert                  convert an image+ @# ^0 _. D$ E& }) p: o) Z

3 @) F* W( |" I0 HOPTIONS:8 e  W8 V% ^( G9 g; _2 s
   --help, -h  show help
/ W4 V$ L/ `2 T6 n; t1.2 查看镜像
* P- A  k& V* f7 s! \0 e代码语言:text
4 ?6 H8 x% u- @复制: l2 `; f9 g- {# H& L2 g! l
# ctr images ls
# r0 ?( e+ n+ U9 l2 E* nREF TYPE DIGEST SIZE PLATFORMS LABELS
. Q8 V" Y: c" W2 ~' E" i4 X1.3 下载镜像# s! w3 S9 U" N7 Z5 I
containerd支持oci标准的镜像,所以可以直接使用docker官方或dockerfile构建的镜像; W6 q$ p2 i; v$ q2 o8 o

0 e6 }% \" b3 u* Q- d代码语言:text' Y' a5 p$ j) C; j5 J/ o
复制
5 `6 G1 E4 j" b3 \& c3 Y8 z# 镜像名不能简写,--all-platforms:所有平台,不加的话下载当前平台架构& u4 S9 R! {+ ^7 i' v4 m9 R4 H9 g! W
# ctr images pull --all-platforms docker.io/library/nginx:alpine
1 M" t% b0 z; a# ctr images pull docker.io/library/nginx:latest
) c- v) k& Q) H5 c; ~# u2 p4 z8 J
# uname -a
1 v  a1 L, z7 O6 B5 |1 S$ Z# y代码语言:text7 ^, s8 B6 P0 A# U, u
复制
- _" v) O' |4 M' a* z2 Z2 S( Y" J说明:6 Q" r5 \; A% s5 u. y: P& L
这里ctr命令pull镜像时,不能直接把镜像名字写成`nginx:alpine`1 H+ r5 X6 q" e& r9 d- }/ n% X
代码语言:text
& x# [4 Y7 ~  @1 W$ v' K复制
; ~: w& F' |" O查看已下载容器镜像" e# d* ]7 |, ~2 |/ {
# ctr images ls
1 s* ?( w) o# f5 l8 a, OREF                           7 d3 F% s% w( j$ d7 A
1 \$ D6 l; M7 P! ~7 X1 _! d7 f
TYPE                                                     - N* ~0 ^3 e5 d! V1 k' t, a

; T6 L/ }) y* X/ @9 o  c- `DIGEST                                                      
# v+ o3 G4 [* G: ~$ g
1 Q5 d7 D  v3 C- u; i6 Vdocker.io/library/nginx:alpine, o8 Q9 `0 l% s. e
$ y$ H, p1 W& o
application/vnd.docker.distribution.manifest.list.v2+json! T4 X* ^8 z7 R$ H- j

% S8 r9 M$ k& t5 ^0 i2 M6 H. Gsha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3
- }# v$ [% B/ z! O) j; \5 P- d. ?+ |- L" i1 {. s5 V3 f
SIZE   ( A% g1 G$ ~# v4 Z8 F: y

* N+ a; r9 z1 B2 z. gPLATFORMS                                                   $ F2 X0 f6 J$ E& T9 U7 L
( `2 R, \  ]  T& T. Q6 z
LABELS
/ j2 f9 i- i3 h1 b5 @  S8 M+ ?" F# J4 ~2 Y% K* q3 A! P. S/ P0 u
9.7 MiB
' }' A+ Q0 s% y; [0 c" g* L- P) r& }5 z3 B# ?& W: g
linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x
; o7 E( p& V- Y4 c# W
/ r+ T) m! ^& i8 \& m, e代码语言:text; J. C, B9 J2 p# z  P7 @; Q" X; J
复制* \# E; O/ b3 d  e& f/ i
指定平台下载容器镜像
2 N! x: b2 R6 {' J4 o' h# ctr images pull --platform linux/amd64 docker.io/library/nginx:alpine
6 R0 s% A0 w' d$ U0 `没有镜像是无法运行容器的。
2 |3 `; I) M5 }, |6 e8 b( |1 l& |0 w% @( m( c7 p% \
1.4 镜像挂载7 i$ h, a( Q+ I. s- n
方便查看镜像中包含的内容。
) V# y, A) V, J0 h$ K, F/ |+ V
( j- ]( x3 s9 O$ [& |代码语言:text
  j) c- t# i+ ^1 y* T复制
9 M& g3 x6 x) v) k. g) N' X3 T( a( j3 h把已下载的容器镜像挂载至当前文件系统  \& q& O6 o! H' c0 I# T9 Y
# ctr images mount docker.io/library/nginx:alpine /mnt2 s: K* |' v4 f6 Z7 n
sha256:af2fcce448e2e4451a5f4796a9bf9cb5c9b5f88e0d6d10029cada42fb9d268ac. N0 f! d8 s! @% _+ q
/mnt' |6 a0 l' D) D, M0 a$ q
[root@localhost ~]# ls /mnt6 p6 D2 W2 E0 P! D  O7 U
bin  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var' X4 l4 t* L5 s4 h3 U# O
代码语言:text
- I% O) P% {1 x$ W) y/ L复制
) Q* ~" ^* s+ H9 n( s! m* ]卸载2 a2 B- i! i; D7 C, ]1 _/ C) q
# umount /mnt' G. y2 g  j4 r! o
1.5 镜像导出
& X' V5 o: i! W代码语言:text
+ _7 R* ?/ K! U# X7 V复制' ]8 t. f1 t1 J9 z$ u
把容器镜像导出
, {% w# h; b9 ~& C* F# ctr i export --all-platforms nginx.img docker.io/library/nginx:alpine
7 T$ p' _: J) ]! @% n$ @代码语言:text( }# _7 K( v! R! F0 I- [& Y
复制
0 G3 u( u2 ]. F  c# r说明
6 A7 p! m! Z7 H8 I--all-platforms,导出所有平台镜像,本版本为1.6版本,1.4版本不需要添加此选项。0 H) l3 @' I" q* ~% j2 D  X; V0 z; _
代码语言:text
7 d& E( ?7 D& X7 a. k9 q) p复制
) L, C' ]! y7 |查看已导出容器镜像
% W! ~) r* `  u5 ?. ]# ls
% y( e, @" a" e: o: I% d" X7 Vnginx.img
( N) D4 S0 b% |3 |8 X) _: L) K7 [: \4 u( Y/ S9 X
# ls -lh' A% s! }! h; f1 m: J
总用量 196M7 j8 l: ]0 W5 ]
5 S. i  w9 c! Z$ ~# i: E% U. e
-rw-r--r--  1 root root  73M 2月  18 14:48 nginx.img" E& p2 l: ~0 N7 }1 X, a
1.6 镜像删除
6 a( k/ m: T/ g1 L8 m  Y+ E& K代码语言:text7 m& R) ]3 q. T( M
复制" w: B1 U* T1 T7 }( J' O
删除指定容器镜像/ x5 s* e8 H/ I3 V/ d7 l
# ctr image rm docker.io/library/nginx:alpine3 ]! D% Y# X" u' |
docker.io/library/nginx:alpine2 P6 H& J, J7 C$ m7 q
) K# A' M* h5 V
再次查看容器镜像, u: d$ R2 Z# B8 P; U
[root@192 ~]# ctr images ls# @( z% p' U. ]# j! i
REF TYPE DIGEST SIZE PLATFORMS LABELS
5 a! }+ Y9 v2 p: ^* c1.7 镜像导入
' S) x- f# M- y4 s7 T4 x代码语言:text/ h; E9 D' {* u# c
复制
+ C5 g8 A' |0 G  B! J% N导入容器镜像3 D2 j2 J  i+ T; v3 Y6 ?% F( R8 m
# ctr images import nginx.img) ]. N9 Y% F3 j
unpacking docker.io/library/nginx:alpine (sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3)...done% H" \3 l% T+ e2 J6 U( w! O6 @+ G$ ^
1.8 修改镜像tag' w: P5 y$ `0 \. G7 Q' k7 C
代码语言:text5 _1 K6 |0 ^2 Q& `/ d8 \' o
复制$ L$ R$ Q8 s  Y  A! K6 N
# ctr images tag docker.io/library/nginx:alpine nginx:alpine
' C* r0 C! j! o/ v7 d- ?* anginx:alpine5 A7 _- \" s: \1 B' F- c: V4 W

* Z% H* t" `. s5 S+ U# 建议修改tag的名称为:镜像仓库地址/目录/镜像名% B$ s1 b* A- ~9 r5 _
代码语言:text) T7 f% Y/ d; I$ h
复制
) }3 `$ j, `2 _( J+ ]说明:. u1 c- J( z6 w% s6 E+ _$ k) R
把docker.io/library/nginx:alpine 修改为 nginx:alpine/ {8 \" J6 j% _* @; E
代码语言:text
' E+ P9 u; c9 g7 @% V! d* ?; r( T# H复制
$ L8 n, F- i& o5 W) B5 g  U查看修改后的容器镜像$ x% o  u! R1 t
# ctr images ls
3 M% u; M5 k9 iREF                            TYPE                                                      DIGEST                                                                  SIZE    PLATFORMS                                                                                LABELS
: {9 l; n5 k5 Zdocker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 9.7 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -0 ]' e2 X: K4 l1 C4 }) I
nginx:alpine                   application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 9.7 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -, N$ f# `2 ?0 }% w' b8 f. t
代码语言:text
) s9 t+ r6 L6 N: x复制
% F; P! F/ r- R* o修改后对容器镜像做检查比对
! F5 b' i9 M2 n% s9 F6 N& P: W# ctr images check. R" y' Q$ w" R0 L3 |% t
REF                            TYPE                                                      DIGEST                                                                  STATUS         SIZE            UNPACKED
3 ]  Z: }& k0 K: Q' i/ ~  ydocker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 complete (7/7) 9.7 MiB/9.7 MiB true
! v+ i, |! h$ H. T+ U8 F
7 g2 l5 H; i1 F4 V2 \nginx:alpine                   application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 complete (7/7) 9.7 MiB/9.7 MiB true
3 `) C4 @' G! u; S" ~9 a% K2、Containerd容器管理0 d9 K& g! {$ o" P. U7 u
2.1 获取命令帮助
7 E+ S1 C/ ?# _8 e( K( b; g4 p- \2.1.1 获取ctr命令帮助9 d/ g% ^- W, w: P) Q
代码语言:text* p% ~! l" I& Z" @
复制  F( w' Y) Z6 r6 |% d
[root@localhost ~]# ctr --help: P7 a( v1 m8 C
NAME:& Q( z  a* w% P- l: }
   ctr -
0 V2 I5 v6 M% w! e        __. \8 ~. w- e6 M, o7 ~  H" ^7 f0 O
  _____/ /______; x* ]7 h7 z: S4 N/ G$ \% W# e* r
/ ___/ __/ ___/) @$ x5 s4 A' ]" k/ i4 K
/ /__/ /_/ /
6 u; h* `/ w0 [# @7 m% P8 R\___/\__/_/7 b; Y2 f8 A! m' l- ?2 q3 m
+ g. z8 V  s# C0 ~4 c$ v
containerd CLI
- p, I: ~; I0 c& l% Y+ I: }' r. @8 |* B+ t& A' i4 t/ q/ P4 z

4 h  T. [7 U; ^0 w' N8 n: K......
) w$ R6 Q: z% M. p# p" M2.1.2 获取创建静态容器命令帮助
7 j2 Q8 \4 F8 e# U2 n代码语言:text
7 n" Y* k2 d# e6 {. |, t复制6 d. S9 X& ~; ?4 w2 g5 A$ L) v& A0 y. R
# ctr container --help- C/ B2 c" m% f7 Y3 @; p1 o  o
NAME:. j) A$ [8 N8 t2 ]! }
   ctr containers - manage containers$ P- w  ]' \5 B' p8 _8 H

+ ]# S$ l* \' Y% h; J9 x. lUSAGE:
: e( f5 Z& S7 M# P& M   ctr containers command [command options] [arguments...]
, O8 w: `5 L: y& O+ M' i
6 ?# S. N$ N2 o1 C1 B7 G' P7 gCOMMANDS:/ j" T, l0 A5 y9 O, p
   create                   create container" O8 g# Y: A, \2 E( P( Z$ n9 A! h% k
   delete, del, remove, rm  delete one or more existing containers4 N  B7 P  M$ A
   info                     get info about a container/ s2 V1 w! p+ `! G% F$ t. x
   list, ls                 list containers
0 x& L0 t# J# V2 `   label                    set and clear labels for a container
: G4 P3 w9 g6 b3 I2 z3 {) Q/ w3 Z   checkpoint               checkpoint a container2 m5 b4 g9 B- n) P, G
   restore                  restore a container from checkpoint
+ P  w  D& V) _0 J3 u  d0 A+ ^8 }
OPTIONS:
  T, o. ]( b, \2 q   --help, -h  show help. A. x* w3 r. ]& m! K" O/ v. K; v
代码语言:text
% W# q  Y3 K! V' e7 V! }复制
& _" i6 v# X* S说明:
2 n6 ^  g% v( I$ }& B# _9 p* M3 ?& _, u0 A
使用`ctr container create `命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。这个 container 对象只是包含了运行一个容器所需的资源及配置的数据结构,例如: namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程(本案例为nginx)还没有启动。需要使用`ctr tasks`命令才能获取一个动态容器。# ?; i: J* N4 N8 p( m, r% n
2.1.3 获取动态容器命令帮助! `8 g& m" r  T! B: u% J
代码语言:text
2 A) e4 o8 G, `9 p2 G- K8 s复制
. C' q/ @( }3 Z0 `' k0 H( ?# ctr run --help
3 m5 N5 P0 J, i# `0 E% w4 ]NAME:! Q' u# a+ b: f6 r
   ctr run - run a container: `0 B/ ~' q4 I) `

/ }# e3 o* B. y" Q& a. e0 E......% p( b; @6 x; g+ c9 B, W+ ^
代码语言:text0 `' `& E/ s' e' y. B5 L8 `
复制' I) ]  O* ^5 C0 V! w+ i! [$ ^
说明:
: {( `4 f: k# c+ A使用`ctr run`命令可以创建一个静态容器并使其运行。一步到位运行容器。
  @) @! e1 B9 C" s2.2 查看容器8 u$ C, T* _. {( s/ P' T  z) |
container表示静态容器,可用c缩写代表container
' J+ ]5 V/ Z" y6 Q- X' |# m% n2 E9 D6 c  O+ D0 n
代码语言:text
$ T. N, \; g5 M8 R- e( |# ^6 ?* ^: ^复制! j' \* u9 @' a0 M1 M% p. c. T, M
# ctr container ls! [1 j# N, N, J& f7 G0 Y" V6 E
CONTAINER    IMAGE    RUNTIME
- Z- B) J" Y- G% D0 d1 x' z, [
$ Z  e) x6 L- m" n8 Q* Z5 F: m5 L
- x7 o, `' E9 Q9 p  \- O代码语言:text8 s2 C8 H* q$ u+ i/ r: d/ b
复制
) y+ e8 m. q' J$ q: |/ `9 }1 t7 C( T. R# ctr c ls
  t( f" Z9 R: Y9 z2 ]! ~8 H# uCONTAINER    IMAGE    RUNTIME0 @) E; k1 M. ?2 h# R
以上命令无法查看出来容器的静态的还是动态的
4 C% G# f+ P1 }3 Q: A
9 p+ X+ E  `6 a$ q. M, g) J2.3 查看任务
  j" }' l$ K8 o) |9 c& b: y! ?task表示容器里跑的进程, 可用t缩写代表task
0 N" g7 n- n+ }
! `1 y6 K2 i$ E' k" T代码语言:text
& [& N2 D9 P# k2 ]: K2 `. a+ x! W( \0 ?, Y复制
" Q( `# W; D& A' c2 h  k! k# ctr task ls8 ^% O% M' R5 }& X/ T+ ^
TASK    PID    STATUS8 R- y, x; ], |9 M7 B

" R1 Q& Q1 `3 h3 B: Q' W# e4 n8 v+ _
1 E+ J$ O, G+ \5 L代码语言:text
  c& g9 a8 b) S# w复制
3 S, d/ q1 q( Q: ]7 V+ u# N4 Y# ctr t ls2 K5 _3 u' v" ?9 C0 p
TASK    PID    STATUS
8 f# ]8 N4 z) S+ }& X' ~2.4 创建静态容器
, z7 E( Q1 U& h7 C3 l% q, O0 Q代码语言:text+ q0 y, n% E/ k5 V
复制2 X* {7 X5 j4 ]% l
# ctr c create docker.io/library/nginx:alpine nginx17 Z% i5 g9 O0 D5 s8 J7 ~% f, A
代码语言:text
7 O3 z& p7 |- Y7 h. C复制9 z" f3 ]; r) b
# ctr container ls. l9 P1 D5 K$ d& Z
CONTAINER    IMAGE                             RUNTIME
' _, x7 A+ \: |* {/ qnginx1       docker.io/library/nginx:alpine    io.containerd.runc.v2. c1 Y3 @+ |# U) {
代码语言:text
8 i0 @3 u% M1 a! H, h2 U5 \复制6 t  y) z- O; ]) K# W) w
查看容器详细信息. p  y' `( a9 t9 c
# ctr container info nginx1  G. P- P( m1 d; _  E4 f
2.5 静态容器启动为动态容器
& p5 I/ e8 J  s9 O7 g代码语言:text1 s+ e+ K) v$ x6 v! \
复制$ N. f. a. v) @( ^! g- J+ Z# G7 N
复制containerd连接runC垫片工具至系统
3 h4 Q8 G# Q, f# ls usr/local/bin/
1 D+ _) v9 x% y& y* p, icontainerd  containerd-shim  containerd-shim-runc-v1  containerd-shim-runc-v2  containerd-stress  crictl  critest  ctd-decoder  ctr5 J" r* ?5 a  K* K& d0 \
[root@localhost ~]# cp usr/local/bin/containerd-shim-runc-v2 /usr/bin/$ T( i  E& Q) k( R; G& y( Y) n+ M/ Y
代码语言:text
0 C/ t0 K/ k& _复制
" l8 d" H4 x5 y9 I% L) w% X启动task,即表时在容器中运行了进程,即为动态容器。, m9 R6 k0 e  m! D. c2 S
# ctr task start -d nginx1
* d1 f0 O: ^' P+ Q$ Q( P/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
6 |5 d- i/ U7 x/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
' v$ _. `% B: M# C, H+ k; y代码语言:text; D* X8 }/ K7 D2 c1 P
复制* ]" w6 @) ~, B/ s
说明:
6 M4 a! ~9 l+ F2 k* Y1 y-d表示daemon或者后台的意思,否则会卡住终端. s1 G  H  e8 M3 a8 z4 f
代码语言:text
- X# o& {! P( E* n" d复制1 `: v* y# [, v- I
查看容器所在宿主机进程,是以宿主机进程的方式存在的。, m4 x% P3 V; L7 V
# ctr task ls
8 I& F& T3 q/ Q. x1 \; j* w4 O! `- gTASK      PID     STATUS
# W. ]/ s) P: V! unginx1    3395    RUNNING
7 ^1 S9 i" Q2 `( J1 E' C* M代码语言:text1 h4 F5 X9 a2 [( r! ?, }- S
复制8 ]- B+ y8 o' \) F8 j
查看容器的进程(都是物理机的进程). g& @; L5 E  M/ ]- v- D: @
# ctr task ps nginx1$ F3 l+ M* M% A; s" E0 B( \
PID     INFO
6 A4 r! _6 {# R% k5 a3395    -
! `0 H, W0 c4 \- Q0 W1 A: C/ i3434    -+ y  V- w3 @* Y8 a3 {
代码语言:text4 @: S1 z( O5 n4 }
复制/ E9 ^% h; z" l" U+ \
物理机查看到相应的进程# ]- X3 E; I$ Q3 T: {
# ps -ef | grep 3395
, m( x3 l% K( [2 c  V. croot       3395   3375  0 19:16 ?        00:00:00 nginx: master process nginx -g daemon off;
7 j2 h# s' L- d6 G; f3 k& K3 {101        3434   3395  0 19:16 ?        00:00:00 nginx: worker process
3 I: Q  Q" d* {$ J  B3 }/ X% W8 y2.6 进入容器操作
" o5 t  `2 W* V( O! l# M9 V代码语言:text1 c0 j( ~3 x' y- W
复制" F. b" v( L3 b% T6 K. m9 }6 O
# ctr task exec --exec-id 1 nginx1 /bin/sh
) g- K" G( D( d  k0 w& {7 C
. ]6 V: y* U2 Y$ K  d* Q( ~: L$ e$ N# ifconfig 查看网卡信息
, @' n3 \6 i5 v1 D1 j8 r+ ^
% `% g4 R& j- v/ N+ u...1 m+ @+ y1 {  e$ w. w" c! t
$ z, ~  |+ i0 a4 m; z' d
# curl 127.0.0.1 访问本地提供的web服务; J6 l. ~1 F* l) H. N
..., @. O' D" B* X% g$ A4 ]1 P) ]9 g" O
代码语言:text
, ^6 a0 s3 |# j复制# K% d* f! @; l" L7 a
说明:" x" Z1 p5 g' ^0 M6 h% S, V4 V
为exec进程设定一个id,可以随意输入,只要保证唯一即可,也可使用$RANDOM变量。
6 ]' l/ z& x5 I; O7 c/ T# |  |2.7 直接运行一个动态容器
8 G$ ?$ d+ R, y' O' U7 P代码语言:text* q" _- ?& w. G" Q& Y
复制& T( Q4 u7 ?* e! i8 z$ Q
# ctr run -d --net-host docker.io/library/nginx:alpine nginx2/ g. q! O$ n: e4 j9 o/ h( [6 {% B
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
& o8 F0 }. e# s7 f" a/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/4 D% |8 A$ D! C. {& [( W- |
代码语言:text
( o  G3 }# V1 r0 [& r复制
5 D6 Q  S8 ~! l, u1 \5 H说明:
/ f. o. O3 F( [/ q* -d 代表dameon,后台运行9 a  L5 u, r5 Q$ H' n8 V0 `6 t
* --net-host 代表容器的IP就是宿主机的IP(相当于docker里的host类型网络)
1 m& T3 `/ Q( b) ^代码语言:text
0 ^4 L: e# N7 V/ N8 c* ]0 F复制
1 s6 l4 U  @0 `查看已运行容器$ W7 ]) O- x- y, a8 ]- z
# ctr container ls
/ T6 i; N0 t7 {2 k  m4 QCONTAINER    IMAGE                             RUNTIME
# q3 |; e  V5 Onginx2       docker.io/library/nginx:alpine    io.containerd.runc.v26 A4 u  W* J& `! d4 v( P) D/ J
代码语言:text
; O" S% c; x# S8 x. X. q4 [, U* A复制8 V$ a$ D8 E2 j
查看已运行容器中运行的进程,既tasks
! [2 h% p$ @2 T, P# z# ctr tasks ls
4 C/ S5 h4 s; p9 k5 R" c6 nTASK      PID     STATUS- ?4 r3 D% K8 G" u& J( j: |/ O4 G
nginx2    4061    RUNNING
; l/ f0 H/ U+ ?( ]2 Y' _$ z+ W- A代码语言:text
$ Q# i) p6 V& Y+ n  }2 R# p复制/ Q% u. {0 x& o
进入容器9 ^2 W% z; @7 \" k" o
# ctr task exec --exec-id 1 -t nginx2 /bin/sh
: {" e" |: r) Z" S3 I6 r代码语言:text7 r! ^. b5 M3 L: q4 [
复制
* K, [1 Y9 M/ f/ G, V/ # ifconfig
7 a  G5 B# q! l% |ens33     Link encap:Ethernet  HWaddr 00:0C:29:B1:B6:1D
# `- Y5 L9 T/ ]% ]          inet addr:192.168.10.164  Bcast:192.168.10.255  Mask:255.255.255.06 z) X) s8 q4 l1 n6 l- {' ~
          inet6 addr: fe80::2b33:40ed:9311:8812/64 Scope:Link
: _' U' V: N# d1 s6 n! }! C# ]% O, I" I          inet6 addr: fe80::adf4:a8bc:a1c:a9f7/64 Scope:Link/ m4 \1 {# s+ H7 B* c, ]/ b
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
5 a4 d, a- ?  L* c. {          RX packets:55360 errors:0 dropped:0 overruns:0 frame:0. R5 V! l4 n  J- b
          TX packets:30526 errors:0 dropped:0 overruns:0 carrier:00 x. g" j) U1 Y/ |
          collisions:0 txqueuelen:1000* Z8 L6 j2 e# A, R
          RX bytes:53511295 (51.0 MiB)  TX bytes:2735050 (2.6 MiB)& z1 }& [/ B: Q
1 X) w! ~' K6 w% d
lo        Link encap:Local Loopback
! l- x1 m5 D* r& R- c          inet addr:127.0.0.1  Mask:255.0.0.0
. ~# m4 i! ]) X) y+ e          inet6 addr: ::1/128 Scope:Host. }7 w) S; G" h1 y# _- w
          UP LOOPBACK RUNNING  MTU:65536  Metric:19 h+ v* i: M5 O/ O# \  w) |# ^
          RX packets:68 errors:0 dropped:0 overruns:0 frame:0' K* F" x, x( \2 m. |* U# V3 u' n9 D
          TX packets:68 errors:0 dropped:0 overruns:0 carrier:0$ X. m- O5 K" ]
          collisions:0 txqueuelen:10000 j5 l5 f& S- ~9 y. S9 u
          RX bytes:5916 (5.7 KiB)  TX bytes:5916 (5.7 KiB)
5 r; h5 C, i- q- D/ P. ]2 n( f% {; _% R6 z) q+ w! ^
virbr0    Link encap:Ethernet  HWaddr 52:54:00:E9:51:828 m# p2 C! A+ J0 J" s3 G
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
) ^; a: ?5 h% g0 S& R          UP BROADCAST MULTICAST  MTU:1500  Metric:17 e/ y# Q2 Q/ D! F! B- k$ q( F
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0, L" D- I' U! |# ?# J7 }6 y
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:03 J6 r7 o) N) w, i  u9 G( e( f
          collisions:0 txqueuelen:1000
8 S2 e( s6 d# q0 B3 h# Q          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B), v) S9 w- y3 ]+ l1 b' W* {
代码语言:text
  F: I$ L+ W- [复制
# h# N3 E5 u; f" q为容器中运行的网站添加网站文件
5 [( {4 J! j0 j9 M/ # echo "nginx2" > /usr/share/nginx/html/index.html& m' e: ]9 X8 }$ i. q0 f' L# s
/ # exit
4 K  W: ~0 {& Q4 m+ e! \, T代码语言:text
( T# F" W( i: ?4 Y0 q复制
! ~  C/ `* H+ O, v在宿主机上访问网站
% U# F6 L. @' w: A; r[root@localhost ~]# curl 192.168.10.1648 {# B9 r4 y8 @" E, J
nginx28 |$ b4 \, ]6 |/ ]5 b6 e% E$ q
2.8 暂停容器  e( p- F8 M4 W% L7 R
代码语言:text4 R6 x+ F( {: t  S: y6 Q) p
复制
7 D: p6 A6 U+ _" B( P查看容器状态
* z- v" O  D% t! N2 @# ctr tasks ls0 \- g2 {1 R9 |5 k
TASK      PID     STATUS
4 E! @( f) L7 |- n, ^% mnginx2    4061    RUNNING
, p' A; F# g, W" `+ r! d! \" j代码语言:text
4 b4 S+ U! a: m0 K, e- ~$ I5 ?' y复制! C9 Q9 {7 a9 y/ a3 I7 A2 r6 \6 Q+ H  T
暂停容器* L% x$ Y2 M+ b% e) @
# ctr tasks pause nginx2
# c) ^( g: @+ L0 L- i5 e" _代码语言:text
- y/ v7 }7 d& M2 P, W0 e+ L: s' B复制
& m2 G: f" ~& w9 t再次查看容器状态,看到其状态为PAUSED,表示停止。
5 C$ F' f& e+ u5 F+ w' i: J# ctr tasks ls1 i* L9 W! {5 w3 k2 n1 \
TASK      PID     STATUS
( T: _3 N( Z' l1 m& Wnginx2    4061    PAUSED
8 F& K3 Y1 o& }+ r! A% ]7 r  i代码语言:text& l( p6 [: D8 [# O
复制
  I$ D0 Q$ s' o7 t. b( Y  S8 O+ K[root@localhost ~]# curl http://192.168.10.1647 Y1 X6 O* `( v
在宿主机访问,发现不可以访问到网站
  j, U1 t$ A4 A6 y* O- V* y3 g2.9 恢复容器+ }8 k# {4 ]: @5 E* [( h6 B( b
代码语言:text4 E: H* B' B" j# [! \& N0 y: m; i  @5 g' [
复制
) \7 m. H) O+ u% `9 @" ^使用resume命令恢复容器  a% F/ L- @  X6 V9 U! j* z( [
# ctr tasks resume nginx2) U3 ~" i# n1 h2 ?
代码语言:text
" P# C4 t; X7 S; q& G. y' ]* w复制6 i6 b- K( Q9 p4 }" a1 [$ {
查看恢复后状态! P8 v, Y9 \6 t$ F  C; @' O
# ctr tasks ls! K% F& H& l5 L. d8 g% R1 ]
TASK      PID     STATUS4 F) c, p6 m  X
nginx2    4061    RUNNING
3 G/ Q6 a  ^7 w7 O5 I5 i5 L代码语言:text& w% E. @4 I% q  J  p+ g, C
复制
: B9 H8 o& {1 W" X) [. ~# t7 _: y在宿主机上访问容器中提供的服务
$ R3 g# Z# M$ @" W# curl http://192.168.10.164
; ?+ Y1 Y# y6 [0 A0 u0 Knginx2
1 b/ C- U0 z6 L/ E$ }! O& C2.10 停止容器
% i/ [& u  ~  ^+ x1 L6 A" k代码语言:text' ]5 L# z$ b! j5 y9 ~8 I8 M
复制. l- P" P( y* t
# ctr tasks --help
# F# T/ O5 y. y, T......5 ]2 u/ _& I$ M% }
代码语言:text. D* A% b5 K* Z4 M) A& L2 Y
复制
. [7 @' g- ~" Y# O) S; ?4 G使用kill命令停止容器中运行的进程,既为停止容器0 I: g9 |" ^- @# W& o
# ctr tasks kill nginx2
* k: u: w9 f8 J8 u代码语言:text
5 Y! W7 r5 q. N复制) G. F2 w7 U8 D: {
查看容器停止后状态,STATUS为STOPPED2 |7 A: s& g3 w5 q$ V7 [$ M
# ctr tasks ls2 l; r% B/ w' D! ~5 A& u+ B
TASK      PID     STATUS9 H3 H$ F. ~+ U7 q) w
nginx1    3395    RUNNING
* u1 D( Z- v9 |2 @; Z8 s3 tnginx2    4061    STOPPED; u/ W! R8 U- o
2.11 删除容器( o) T! n% Y+ H5 t2 Y, e7 [
代码语言:text; F& i$ S- k0 V4 c
复制
, }& L! M8 W6 M) ~: W" z7 a+ W# ctr tasks delete nginx2
' a$ W' f( f  N" O2 h( x必须先删除task,再删除容器
# w7 ?0 [7 u. n代码语言:text, M7 f+ N5 {0 \8 Z2 v  L5 ?! R
复制
+ `- v! `* m  v3 @5 V! d  _$ D查看静态容器,确认其还存在于系统中
7 L. ?  ^  T" W- L. V8 ~$ R8 U3 t# ctr container ls
4 C% F3 \2 i8 f2 d2 uCONTAINER    IMAGE                             RUNTIME
! L0 \- U1 B% E" j' O! Anginx2       docker.io/library/nginx:alpine    io.containerd.runc.v2, n( Q( G- f. o9 N0 |0 F
代码语言:text
  K6 k* o0 d' x0 j- l8 c: K复制
9 Z' b& t' t/ f* S删除容器8 E; A3 N- \) Q7 d' X
# ctr container delete nginx21 Y& i: n; Q5 Z: I7 J* @( W- u3 U8 n
3、Containerd使用私有容器镜像仓库 Harbor1 X3 P+ {- L* c
3.1 Harbor准备
4 h0 @3 d' S# v6 i( A$ F+ O# Y/ H4 d

4 y7 `! ]9 n; g8 o* c3.2 配置Containerd使用Harbor仓库9 I8 z' h# Y& o
3.2.1 Harbor主机名解析
0 I* t1 q! a* L) n8 A, T8 S: A在所有安装containerd宿主机上添加此配置信息。; `* G  K1 U8 T: P% }

- F) B1 W) n% S+ |代码语言:text& u: ]: B% Z( y
复制- c: b8 O4 M- R) [  J
# vim /etc/hosts: X4 s5 L7 k) @+ @6 h, D2 C
# cat /etc/hosts
; L! [$ r# \! r3 c" K5 s  Z127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  W# [( t0 w! N4 w
::1         localhost localhost.localdomain localhost6 localhost6.localdomain65 Q/ Q" `. ]. Y" _; ]4 [
192.168.10.165 harbor.kubemsb.com
0 ?' I+ x4 {) y代码语言:text
% o& ]: \' L. n1 E# ^  \复制, Z+ k/ c/ ~7 }1 k
说明2 p; A# x, X9 q6 I+ t6 Q
* 192.168.10.165是harbor的IP
+ x7 ?* y/ K$ [8 M' S( F1 B# K  k& c. O
* harbor.kubemsb.com建议用FQDN形式,如果用类似harbor这种短名,后面下载镜像会出问题
$ O5 M3 R/ u* Q# ^+ b; j3.2.2 修改Containerd配置文件
2 p8 s2 \: Z1 c6 K5 O9 q- l% |代码语言:text
; N- f) C* Q' i7 V( \" w复制, R1 U" a$ K  l/ `2 D+ }4 E
此配置文件已提前替换过,仅修改本地容器镜像仓库地址即可。
! P& h3 e$ }' d- ?" H# vim /etc/containerd/config.toml
# U6 a. z! [3 y) P" M. N: n) j# cat /etc/containerd/config.toml# f  Y8 @) k- Q8 l0 `5 X
root = "/var/lib/containerd"9 g& u4 x, f) W1 z8 k' l
state = "/run/containerd"
1 V4 v) N1 x) D/ m. U- ^oom_score = -999# h7 J" e) V  {5 X( A* b
( i2 c- d6 ]8 A/ P: P
[grpc]
% u; ?' ^% y6 O, p! A6 w  address = "/run/containerd/containerd.sock"1 S# Y0 H/ ~' P2 _
  uid = 0
3 f5 y7 g' `: H% V7 `9 K  gid = 03 L0 d" X( ?1 c8 Y4 R, h% Q
  max_recv_message_size = 167772169 w1 q0 F$ k9 U: [
  max_send_message_size = 16777216
4 h6 ]  m7 e- {/ j. v7 S& N+ S3 N9 g3 }& S
[debug]
) h$ s6 ]# U2 U7 o# c# w& e3 O+ P  address = ""& _& R' z% e! F, G# {
  uid = 0
5 n4 t, ~  H" R. v- @. t  gid = 06 d5 x1 }* f' A6 o
  level = ""* v3 V' d. `  i! ~

: a) Q3 s! N0 I6 n8 o) C" {& x[metrics]! @$ u* m' H: a- P
  address = ""0 {4 p) J- K& |( |" s! ~! I4 i  Z
  grpc_histogram = false! E5 I& J- q' w* A

+ B  G5 a; W/ w  I- Y/ ^3 J[cgroup]3 Y# v% [# R9 L$ v" O0 N
  path = ""
5 _' r- f: G) k3 x
( m& d, {5 D+ ]! ]# \" k0 _[plugins]' S# B) n  f8 n- r6 h4 \7 g. @+ Q# R
  [plugins.cgroups]& F; B* {; [# v! L- \" e% C
    no_prometheus = false$ F! p7 n, m& G5 l2 O4 N- N5 B
  [plugins.cri]
. Z2 u. w6 j3 r1 w8 o    stream_server_address = "127.0.0.1"* ~& x5 z" L  w( I" @
    stream_server_port = "0"1 @* s- y% e; B. E6 `" U6 K
    enable_selinux = false
2 R: j9 D1 X' [. V- t7 ]    sandbox_image = "easzlab/pause-amd64:3.2"$ i. v, E, o3 j  x: Z- X
    stats_collect_period = 10, i1 Y) E* b, c) A3 E6 n, X* A+ o
    systemd_cgroup = false
+ d8 M; S4 i8 c5 g    enable_tls_streaming = false
, }  ?4 z6 Y8 S5 J    max_container_log_line_size = 16384
9 s" y& A2 X3 U- W/ V( C' p    [plugins.cri.containerd]
9 ~6 |& _( H3 F      snapshotter = "overlayfs"
8 o9 W! n; {9 ], s0 K5 }- X      no_pivot = false) C) Q$ ]( P/ y  W
      [plugins.cri.containerd.default_runtime]  r- N9 ~& V( Z5 H4 V8 W7 q. b; D
        runtime_type = "io.containerd.runtime.v1.linux"
* [. v3 q$ _5 w        runtime_engine = ""  j+ G% y8 D1 i
        runtime_root = ""
5 [% J; s. h4 u      [plugins.cri.containerd.untrusted_workload_runtime]. n6 h4 I1 i& e0 H
        runtime_type = ""
9 j$ I. q& i7 A2 K* @* `" \7 q8 U        runtime_engine = ""
' e6 i9 _* y1 {2 e( O        runtime_root = ""6 j3 J! O; }. |4 o$ n! S
    [plugins.cri.cni]0 x- {6 G+ K' B' z4 Y
      bin_dir = "/opt/kube/bin"
5 D. Y1 F1 |+ s, ]2 e- i7 y      conf_dir = "/etc/cni/net.d"
0 P3 X& x4 d9 q6 C      conf_template = "/etc/cni/net.d/10-default.conf"
2 z6 E8 G, s0 M: K0 y6 }( T6 ^    [plugins.cri.registry], i0 X- A( w6 ^- l
      [plugins.cri.registry.mirrors]
, I0 ^4 l4 g) t+ W0 e        [plugins.cri.registry.mirrors."docker.io"]
8 x/ U) W+ v4 x          endpoint = [
+ F: I. G) u, d' U& ~" l8 n            "https://docker.mirrors.ustc.edu.cn",
) W; s; K# a# I/ C            "http://hub-mirror.c.163.com"
$ W" |. _4 S: i0 }: ?5 V8 _          ]/ r; X# q* s3 X: @& L& R: [
        [plugins.cri.registry.mirrors."gcr.io"]
0 M. H2 n7 c) K4 m: ~* U8 e          endpoint = [
* f% m/ M2 H' C& o; i; Q            "https://gcr.mirrors.ustc.edu.cn"
! _, r% |! w; `, G3 l  Z          ]0 m7 O- j" l- d: F' I% K
        [plugins.cri.registry.mirrors."k8s.gcr.io"]
1 t' y% l6 ~0 s/ T; e          endpoint = [
" |- o1 g& k8 F& R            "https://gcr.mirrors.ustc.edu.cn/google-containers/"
+ M$ X* w/ R; u8 [1 w5 b          ]
' G. N( i1 \5 P! s+ k        [plugins.cri.registry.mirrors."quay.io"]* \& {% E- M/ N  Z( ]
          endpoint = [# n+ }$ K1 l, m3 Q: P
            "https://quay.mirrors.ustc.edu.cn"& P6 B% [$ L  p  E$ J$ @1 f& q$ e; t( a
          ]  H/ C2 G3 B- Y* A
        [plugins.cri.registry.mirrors."harbor.kubemsb.com"]   在此处添加,在镜像加速器下面添加这一段
2 L+ Q  Z' Z; Z7 V: p! V4 g% q          endpoint = [
# o- J2 @( H+ x. n) W& C            "http://harbor.kubemsb.com"
9 k; y1 d/ @8 t: {2 e; |, H* g          ]
( F# s* z- e6 g0 E5 a; M    [plugins.cri.x509_key_pair_streaming]
( J1 L, x$ O9 W: @' n      tls_cert_file = ""
0 d7 b8 Y/ l  v* ]( ]6 Y: F5 ^      tls_key_file = ""$ X  [3 b' [) M* ^! Y, D/ [
  [plugins.diff-service]4 C5 A& u8 q; Z+ U; ?) R
    default = ["walking"]
, l! {" v, n' H% @! d: I. l* `  [plugins.linux]
1 s) L( |" j, u) _6 q    shim = "containerd-shim"
# S6 u* ?2 N) u1 W' V5 G7 p    runtime = "runc"0 `' ]9 j9 }2 P# a) Y- E0 V4 J3 C
    runtime_root = ""
8 d; C) c6 i8 @. R    no_shim = false- I( R) p# G9 W7 D
    shim_debug = false
( d  g7 b1 {7 B  [plugins.opt]
8 f8 w1 n, z8 s9 y% O4 }    path = "/opt/containerd"  L# J: j7 Q' f/ @8 ^% R
  [plugins.restart]8 w" n5 e  V6 K, Y- n/ Z7 u; b0 Z
    interval = "10s"  y4 x0 e$ ?7 N" H' e( d
  [plugins.scheduler]. b+ H2 U! q2 q3 M3 g
    pause_threshold = 0.02
: {1 J- v- C5 q# @( i/ R. k7 ?" B, c    deletion_threshold = 0
: p" e/ |+ E7 M2 V& J2 V$ R' g    mutation_threshold = 100+ Y4 D; K( \4 e3 X
    schedule_delay = "0s"
; T# |3 ~% [+ y% S! r; f/ J) n7 v( I    startup_delay = "100ms"
; P* |( `" ^  J' P) W5 s+ F代码语言:text
. ~3 Q4 ?2 w* s3 d  ?- T. x  O; k复制6 |$ {! C4 v# J# c6 V2 ]# F
重启containerd,以便于重新加载配置文件。
% S- m5 E0 t3 }9 [; r# systemctl daemon-reload: s3 }6 `5 k/ n8 Z2 @
# systemctl restart containerd
  }. L" b! b) z; p3.2.3  ctr下载镜像
, e) i# |8 }# U代码语言:text5 [  v+ d2 i% Z+ z# M6 M* D+ @
复制
; }: B1 E. X8 L) C. Q$ ]下载容器镜像
1 G1 u5 T& t( k4 _0 ^% y# ctr images pull --platform linux/amd64 docker.io/library/nginx:latest
% J$ J. U, U  U6 c  _/ m( U代码语言:text7 u1 C- |' H  W( N
复制3 ^) w8 {8 z/ p6 n% [* ?  {; g6 {
说明:
8 p1 `. K7 P( T) f" V" c2 D* --platform linux/amd64 指定系统平台,也可以使用--all-platforms指定所有平台镜像。
" P& H' s% w8 Q2 x, h7 ]- ]9 s代码语言:text; A* c# w5 h" n* U& n' M& X
复制
1 Q0 {3 T7 f1 s& n/ V查看已下载容器镜像
& N1 N6 T& l  z- H+ s  |! F  k4 L# ctr images ls: V) Z5 M5 d) J+ O! }
REF                              TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                                                                          LABELS+ g) n7 l" l  ?6 X

5 o  K* l$ W) rdocker.io/library/nginx:latest   application/vnd.docker.distribution.manifest.list.v2+json sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767 54.1 MiB  linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x                            -4 q1 b8 F/ t: W# _
3.2.4 ctr上传镜像
; w! R1 u8 d+ u. q' H. W上传到Harbor library公有项目/ J; ?! R4 B" F$ f

* m0 x  _0 u4 [8 m4 \代码语言:text
( ?$ O) r/ V: G$ d复制
5 c! ^) u( m! j" E. c& k8 q重新生成新的tag$ \' V# I7 ~0 w/ H. {. F
# ctr images tag docker.io/library/nginx:latest harbor.kubemsb.com/library/nginx:latest
% G* F7 [) W! ]4 D( u0 Z* u& _harbor.kubemsb.com/library/nginx:latest6 j% ^# @2 Y6 w
代码语言:text
! ~3 V8 A8 M$ }2 o# O2 s复制
8 K9 x& S1 v* V$ `查看已生成容器镜像3 i" k4 P6 g8 T. [# m6 Z. T
# ctr images ls  [1 T7 g2 J6 k6 X+ w: P3 M3 Y/ J! _. ^; j
REF                                     TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                                                                          LABELS
: X0 _5 Z9 e2 d* W1 Q0 u5 edocker.io/library/nginx:latest          application/vnd.docker.distribution.manifest.list.v2+json sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767 54.1 MiB  linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x                            -; h" {5 f. g7 {& {7 L. a1 f' I
harbor.kubemsb.com/library/nginx:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767 54.1 MiB  linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x                            -
+ n2 h4 I! L3 u. I' v4 E; `+ l1 _代码语言:text
: n* f" f" t$ H5 ^. l# G, l3 ]复制
5 j$ t2 H1 |) q3 H推送容器镜像至Harbor. C' l0 X# a- U. I
# ctr images push --platform linux/amd64 --plain-http -u admin:密码 harbor.kubemsb.com/library/nginx:latest
- D1 x" L2 t( D7 z代码语言:text
1 J9 c' h' g: g) q- k( y! m复制. A3 ^. S( C& u- F
说明:0 f4 K% [( d* U" N; U

' s, J- w' m: [$ ~; W* r* 先tag再push
+ W0 s3 d) b2 G6 N! V7 d2 G2 m6 ?0 i* 因为我们harbor是http协议,不是https协议,所以需要加上`--plain-http`7 V7 p& Y6 _% @7 j$ i
* `--user admin:Harbor12345`指定harbor的用户名与密码
+ F- m- h3 P, n  I9 f代码语言:text1 H. {9 a) ?" Z" N( k
复制
( m. `" U( h1 U  z1 u8 r7 @输出:
  F8 }: L3 P' O, F8 s" x9 Kmanifest-sha256:0fd68ec4b64b8dbb2bef1f1a5de9d47b658afd3635dc9c45bf0cbeac46e72101: done           |++++++++++++++++++++++++++++++++++++++|
+ r$ Z6 F; y. E& M% ?. N  F( hconfig-sha256:dd025cdfe837e1c6395365870a491cf16bae668218edb07d85c626928a60e478:   done           |++++++++++++++++++++++++++++++++++++++|3 a8 {0 P: D- [$ ?7 j7 \
elapsed: 0.5 s                                                                    total:  9.3 Ki (18.1 KiB/s)0 `5 `- p8 D# Q* h3 q

9 K; Y; g6 q8 `8 h+ C7 O; Y# q代码语言:text1 H8 M/ N. O! k6 k% d
复制
3 f0 L# ?/ q2 Q' g- f下载已上传容器镜像5 H2 b& T8 z! K, U' j0 K) b
# ctr images pull --plain-http harbor.kubemsb.com/library/nginx:latest
( t" J+ Y# s6 W& \8 g% a) ~8 E+ K( C5 b; }* J3 p
 楼主| 发表于 2025-1-23 13:50:42 | 显示全部楼层
Containerd 常用命令
# K: {' [6 x, I$ h- Z3 O3 B4 G3 D# G( W' N# t& \( r
在 Containerd 作为容器运行时的情况下,可以通过 ctr 工具或 crictl 工具来与之进行交互:
1 @. \0 y+ a' U$ ^' ?9 Ectr 是 Containerd 自带的客户端工具. c) V8 ?1 G' c' v
' W3 R" h% `/ Y8 N; w6 [9 G
crictl 是 CRI 客户端工具,比较接近 docker 命令
! w2 V# s4 U  H. M/ V) t* B" a+ k2 Y7 Q: d: x" p4 Y2 x* S
此外还有 nerdctl 等类似工具,以后找机会给大家详细介绍。
/ I& w' X3 f# m9 }& z1 ^" y2 r" X+ ^- p
4 [1 j0 L( a. e- F

* l" \- Y& R* v: J$ J- t% ^1、ctr 命令
3 z6 m8 t  W, F, `5 `
) B1 t2 a% d, D# 镜像操作命令- k, n  q7 L' x8 c7 |4 @4 ]6 p
ctr -n <ns> i xx                         # 镜像操作命令格式,默认 ns 为 k8s.io! |" t2 ~6 p. e9 \5 p; _! s% d; P
ctr i ls                                 # 查看本地镜像列表,同 docker images9 N) C2 D6 q* G7 |5 C) s6 J  c
ctr i rm <镜像ID或镜像名>                  # 删除本地镜像,同 docker rmi -f <镜像ID或镜像名>2 \+ P4 ^4 u6 H! C  j
ctr i pull <镜像名>                       # 拉取远程镜像,同 docker pull <镜像名>
# |; [& N. z, qctr i tag <旧镜像名> <新镜像名>             # 修改镜像名称,同 docker tag <旧镜像名> <新镜像名>
" F) V( r8 Q' U; h+ a, v! ]6 t% Bctr i import xxx.tar                     # 从本地文件导入镜像,同 docker load -i xxx.tar
! W/ s( o" ?1 x& j" Ectr i export xxx.tar <镜像名>             # 导出镜像为本地文件,同 docker save <镜像名> -o xxx.tar5 _, a! J% G+ N; _/ N. m
& @; B/ q: |! r3 I, B: P* ~( |
# 容器操作命令* j: U% o# z; A8 K6 g( D2 m8 a
ctr -n <ns> c xx                         # 容器操作命令格式,默认 ns 为 k8s.io# C9 `7 U+ X% x% d' H% G9 s* K
ctr c ls                                 # 查看容器列表,同 docker ps -a,查看所有容器
7 A2 U$ Y- m: Qctr c rm <容器ID或容器名>                  # 删除容器,同 docker rm -f <容器ID或容器名>8 A3 B$ Y3 i, _: m
ctr c info <容器ID或容器名>                # 查看容器信息,同 docker inspect <容器ID或容器名>
( u7 i2 G- j8 J; a1 ~! {ctr c create <镜像ID或镜像名> <容器名>      # 创建容器,同 docker create,仅创建容器(容器并未运行)
& c( `  _8 C( B7 Q
% j5 v: F& Z+ l  [; P8 W) v5 }2、crictl 命令" E  Q1 c& W# C$ N3 d4 n2 x
# 镜像操作命令
5 P: m, O& v5 m0 b3 zcrictl img                               # 查看本地镜像列表
/ Y2 o) t' d, K- ^. a; k) ~; _4 Mcrictl pull <镜像ID或镜像名>               # 拉取远程镜像
. A; W% [/ \- ~$ Vcrictl rmi <镜像ID或镜像名>                # 删除本地镜像
. \- u& l% x# k4 y) O; k/ [  V 2 o" }$ }. u# M8 e
# 容器操作命令* a- F5 X' j6 a5 n; o
crictl ps -a                             # 查看容器列表" u( L5 x0 _9 n( p2 l( K
crictl rm <容器ID或容器名>                 # 删除容器% \, c8 w! A$ d( o
crictl logs <容器ID或容器名>               # 查看容器日志
! C# G! U" o- Mcrictl stats / statsp                    # 查看容器 / Pod 资源使用情况
 楼主| 发表于 2025-1-23 13:51:15 | 显示全部楼层
# AMD架构
- W6 y# u/ [5 [7 c* C- `wget https://github.com/containerd/co ... -linux-amd64.tar.gz+ {$ ]# Z/ a/ W) ~- I; N- Q
tar -xzvf containerd-1.7.21-linux-amd64.tar.gz -C /usr/6 j5 }) g) Y0 F% k
" `1 j0 Z6 D  y, H5 h- v
systemctl daemon-reload
' \  c4 N" B7 [: [( ~8 Y6 x0 zsystemctl enable --now containerd" g: x, H# @9 t0 j: H, ^: {5 X

/ X5 ~* Y* C7 i; d===================================================================================3 M% X' Z9 v3 b+ k5 `+ V" @! _
# ARM架构
" o* R" _1 z1 }, Kwget https://github.com/containerd/co ... -linux-arm64.tar.gz
. V: X1 ^# p8 J& ltar -xzvf containerd-1.7.21-linux-amd64.tar.gz -C /usr/
4 \+ y& I5 {; x. b/ r / ^# K2 f' v+ C; ^( d' p+ ~
systemctl daemon-reload
* G4 @& S# H! U8 esystemctl enable --now containerd
 楼主| 发表于 2025-1-23 13:51:29 | 显示全部楼层
# 拉取一个镜像
2 k! g, F2 A4 bcontainerd ctr image pull docker.io/library/nginx:latest+ F$ ~7 c7 O" N: M

8 y# n7 ~, v/ r9 ?, {+ w2 H# 创建并启动一个容器
. e4 K4 P) @4 Y& U, X) dcontainerd ctr run --rm docker.io/library/nginx:latest mynginx# |: J, N+ b, t- D
* W, B: u# P1 c. H/ g9 h
# 停止并删除一个容器
% s: r; W7 G1 G! p5 ^$ Y: dcontainerd ctr stop mynginx
/ A8 W- T  \$ A" scontainerd ctr container rm mynginx
 楼主| 发表于 2025-1-23 13:52:38 | 显示全部楼层
配置Containerd$ x3 f5 `/ i0 k$ a3 p# Y
在配置文件/etc/containerd/config.toml中添加以下内容:# D1 w8 z* D* _  l
: d* S/ Y3 y! R5 r! {6 \
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
: G' @- K4 T) x; e* p8 ?; y* j4 p ...
! I4 e) v/ {& [* X/ j3 B  a6 J [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]( ~0 R. E0 [& t' E/ K
   SystemdCgroup = true
 楼主| 发表于 2025-1-23 14:01:01 | 显示全部楼层
containerd config default | \
( g4 \/ R0 t" P  sed 's@/var/lib/containerd@/data/containerd@g' | \- S7 o6 ^7 v! T& h
  sed 's@k8s\.gcr\.io@google_containers@g' | \4 J/ F$ D! L5 F$ Y
  sed '/SystemdCgroup/c \/ M7 Y. l1 |4 z3 s: n7 y: Y9 {3 q
            SystemdCgroup = true' |- Q5 P- b+ {6 L& }; U
  sed '/registry\.mirrors/a \. S4 ?9 {9 F) r# w# ?* n
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.1.10:8082"]\' f' \1 |! S) c6 X$ v
          endpoint = ["http://192.168.1.10:8082"]\" c/ K+ S1 M) N' Y3 i% \" k4 |3 K
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\: b0 W& y. h6 l8 l
          endpoint = ["http://192.168.1.10:8082"]'> /etc/containerd/config.toml0 B! l' K8 S) [: b& b4 j& m, i7 ~

/ x( K; q' g' M# |* `
% z% I9 a" ~% E- @+ \! N. o/ x+ K( D# P
. ?; B- O# O, q9 r2 F5 k) W9 f
helm upgrade -i --create-namespace ingress-nginx ingress-nginx/ingress-nginx --version=4.0.19 \! V/ J" L; S4 G! v6 P

: X# h1 {8 f2 k/ J7 c    --namespace ingress-nginx \4 t' S' h2 x* j7 L& X" e& e
    --set controller.image.repository=ingress-nginx/controller \$ P9 ~1 ^& f/ i9 r6 ~; K
    --set controller.image.digest=null \  l; z7 k0 t8 L0 D, [& h+ T
    --set controller.dnsPolicy=ClusterFirstWithHostNet \: [: j+ V# ?# f
    --set controller.hostNetwork=true \3 Z) @- p6 k5 `2 y% m* j% Q  ~
    --set controller.kind=DaemonSet \( R8 X9 s+ R2 ~& u. D% s$ d
    --set controller.service.enabled=false \
, P" v8 K- d$ f# h. n    --set controller.reportNodeInternalIp=true \* R$ L7 s4 t4 `" X: l$ |. P2 Z
    --set controller.admissionWebhooks.enabled=false \
1 [* F1 H) j7 e+ {# _    --set controller.ingressClassResource.default=true \, i5 g" _/ G7 q2 H' `8 b
    --set 'controller.tolerations[0].operator=Exists' \% B4 ]2 m$ x# i- t) W
    --set 'controller.tolerations[0].effect=NoExecute' \
7 Y" x4 y. B/ |7 ^' k# X4 }    --set 'controller.tolerations[1].operator=Exists' \
( N4 s4 h) }$ v7 a& c$ `    --set 'controller.tolerations[1].effect=NoSchedule' \9 ?& @' C% ~2 k
    --set controller.config.compute-full-forwarded-for=true \" q9 B3 l. I% E: I: P  m* n
    --set controller.config.hsts=false \3 Z, m) i' z2 X% ~, W
    --set controller.config.use-forwarded-headers=true/ N% w& _* T# j9 E) [

6 g5 `  n9 f8 }0 e) B  C: C
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 20:20 , Processed in 0.056068 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表