易陆发现互联网技术论坛

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

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

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

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

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

x
配置Containerd
3 g" \) o% ~2 v. Y- _在配置文件/etc/containerd/config.toml中添加以下内容:
: |* l( {! [- z) R" l4 `; i8 G3 ~0 B, D" s0 n
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
' _/ C7 w; k' a4 b) U9 G0 { ...
. H1 f( F% \/ M5 P+ P8 ~ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]/ r/ N4 y8 {$ b2 J2 Q5 V
   SystemdCgroup = true
* Y) Z6 T$ a# Y! i8 A; x9 y3 A+ b, P0 K
重新加载Containerd配置并启动服务
; `: l# n2 z6 r3 `3 N5 d4 p2 g使用以下命令重新加载配置文件并启动Containerd服务:9 d& O! v' f  _' i+ {

4 W7 S1 W1 M8 `. q3 n7 ^) o) o. h. b5 w0 g" ?* L
sudo systemctl daemon-reload
3 u( U: K3 G8 r6 r& J$ Ysudo systemctl restart containerd.service
! d' r2 p$ V$ Q* p6 w# r( J, B0 f验证Containerd安装是否成功
4 r+ I0 T) [) Q7 C6 l! M& S运行以下命令验证Containerd是否已成功安装:
9 \/ l  ]) A+ k! Y( i9 P3 e% S6 H5 V' S3 U9 K! O3 ~
! T' B. O5 F% \, W" [  H

3 u$ E0 J+ e( M& s$ e4 Csudo ctr version
8 L1 Z3 _+ O$ I) t* x: `& O输出应为:
" o& G9 P3 }; u/ ^  L# c3 B" H3 |. J4 X# S3 M+ i7 R
# Q% U6 c+ ^7 F) _
codeClient:
' _: J' g1 |' P) I+ T Version:  1.5.5( T; M+ N9 Z0 Z. w% L& h3 f& V
Revision: 09a19cb71a40ac5ab8686245e5a5fb5e5d25c144: B6 y' {* b+ p7 R" @" p
...) t" [$ n) ~7 y5 h  p- ?

6 g7 Q  q& }: [& w1 ^Server:9 d! C" `+ o# M+ A; Z7 j
Version:  1.5.5/ e7 ~8 b$ ?$ E* A! j- s! G
Revision: 09a19cb71a40ac5ab8686245e5a5fb5e5d25c144
* W/ k+ v1 f/ y2 t9 N ...
& i* y- N. `- ]7 O. [0 s2 J+ O7 P以上就是在Linux系统中安装和部署Containerd的步骤,在安装和部署完成后,可以使用CLI命令或者API接口来管理容器和镜像,例如:8 @, U# V7 q3 ^

" f6 @" C; ]& {. w1 B2 m0 N! _
% [9 X5 h4 m+ u) j2 V
6 T3 E3 r7 \' ]% R; c; x# 拉取一个镜像
3 k. n: f& K2 d( Q: pcontainerd ctr image pull docker.io/library/nginx:latest# T) R8 W, ?3 G; j
/ I5 w, o% ~# u8 R0 E, r
# 创建并启动一个容器
- ?3 l0 ~5 f- F4 Icontainerd ctr run --rm docker.io/library/nginx:latest mynginx
1 |# r3 {# `  X4 o2 d# P, H
- Z1 G' M) z2 _- p0 r6 [! n1 S+ P# 停止并删除一个容器) I: b9 W, k* S7 D: c1 N) ]
containerd ctr stop mynginx+ v+ A" L& `+ G% g
containerd ctr container rm mynginx" s# O8 W; \' D8 a/ T# n/ O
Containerd还提供了CRI插件,可以用于Kubernetes集群中的容器运行时- j  _0 i, n' w1 b/ t
5 J. V. K# r$ V; ?& A

+ w$ B! h2 q8 W) `0 F; `
/ H4 p. j! ]6 e, Z7 g- f
 楼主| 发表于 2025-1-16 17:27:10 | 显示全部楼层
#查看镜像:" D  [& B7 B0 {& x
ctr images ls ' p) B5 t; ^# V* h8 _0 A
--------1 A" `5 M% x; y9 W% L

% y! U$ n" z2 i* D- G; ]# V1 \9 }+ s0 A' R0 b
##下载镜像
7 `' t8 S9 ]' U& x/ hcontainerd 支持oci标准镜像 所以可以直接使用docker官方或dockerfile构建的镜像
2 X# r$ _! t% A. \2 b  n" x7 m/ h+ ^- _2 |+ B/ F
ctr images pull  --platfrom linux/amd64  docker.io/library/nginx:alpine
0 S* |% {9 Q! ^3 Y  t* Q2 O) x  R) f# c
ctr images ls" i' j9 L$ x  p7 ^8 a0 M6 z
8 j3 q4 @$ N) g1 N) J. h: e$ }- l
镜像挂载
1 u" N. d$ K' a1 v* V4 l把已经下载的容器镜像挂载至当前文件系统) Z% @# Z" |  l* l' i
ctr images mount  docker.io/library/nginx:alpine /mnt
0 W0 t% \: L% G& v+ T
 楼主| 发表于 2025-1-16 17:29:46 | 显示全部楼层
1、Containerd镜像管理
) i% h2 I4 h/ ~: ~1.1 Containerd容器镜像管理命令3 g) l. h$ z3 t9 B% N4 m
docker使用docker images命令管理镜像; B, [/ W, Y! l, L+ p
单机containerd使用ctr images命令管理镜像,containerd本身的CLI  i& C8 W( [4 a6 D. u( Z
k8s中containerd使用crictl images命令管理镜像,Kubernetes社区的专用CLI工具& I0 Y: ?# p3 z. q. b- i
代码语言:text
; c0 p5 ], c( D5 i# r1 a9 H5 P复制
7 G  u4 j4 _: v  j获取命令帮助
7 D; z5 v$ Q3 p' S* U, w9 f# ctr --help0 z4 }4 _& ]* T
NAME:+ q- p  V" A, l+ S& U- @" c0 i
   ctr -- t4 d! B. m$ U" `& J% B
        __! A' ^! P: y$ P* h
  _____/ /______; F- v: {2 ~# I/ q  `
/ ___/ __/ ___/( _5 k6 Z& r( D% M$ N( T
/ /__/ /_/ /4 O3 t$ N$ w. d4 K' G- ]! g; O
\___/\__/_/
9 @/ U1 q9 l! `( I, d" G4 i. J4 {# v  |5 ?2 Z" i0 U* C
......
& b  b8 e8 J' }; U代码语言:text
) A- S" p& i% B% g1 x复制
9 B: L9 A+ W* o& e) f, K7 g获取命令帮助
0 H) c2 g; e6 ^9 T# a! ^6 Y# ctr images# z6 Z" I3 d; I; O/ W
NAME:
  s- d( a6 m$ Z1 _1 Z$ b   ctr images - manage images6 }, H. i! A2 k: K" ?

( J/ e: X: y! C3 b: f( c, oUSAGE:
( a: E) I2 |$ J) v+ v   ctr images command [command options] [arguments...]' p6 z3 t2 U# d# Q( s/ h) B

( d. Q6 Y" E' |COMMANDS:
% A3 P! P+ X+ j6 f9 f   check                    check existing images to ensure all content is available locally
$ W. C$ s5 `6 s* H   export                   export images
" X# {4 Q8 f3 }+ T- }7 c# X   import                   import images; {. |3 Z" P2 Y: _8 S/ K% Z7 K
   list, ls                 list images known to containerd8 ?* [- j& o: M  a
   mount                    mount an image to a target path
) D2 q1 I" W7 O   unmount                  unmount the image from the target1 _% b1 e* x% b7 {4 m  s2 l( K
   pull                     pull an image from a remote
$ }; \/ X1 C5 q/ S   push                     push an image to a remote
% O4 W& d* |  M   delete, del, remove, rm  remove one or more images by reference4 z9 Z6 f+ a9 ^9 F+ M5 F
   tag                      tag an image& F4 p7 P0 d* h* \
   label                    set and clear labels for an image# t' t3 Z' R! S8 P  _0 B2 W7 u
   convert                  convert an image
6 ~; H) D- W3 K+ u' Y0 Y/ y' H9 }3 K2 p# }0 G
OPTIONS:
+ U2 K$ d* n8 ^' I* \# t  O   --help, -h  show help! n* ^: u9 L1 @6 @# S# }
1.2 查看镜像
& @( j  B' R2 n( {% c5 Q代码语言:text6 c( D) h& D6 Q, G; ]7 }6 U- X+ d
复制
. v0 E' G  Y; U* A; T+ M6 {, L# ctr images ls, j0 @: w5 p1 t. b. d& f
REF TYPE DIGEST SIZE PLATFORMS LABELS; P5 K* e0 W& |# j. Y. Q
1.3 下载镜像! O! @/ v% D8 j: ]; z3 y
containerd支持oci标准的镜像,所以可以直接使用docker官方或dockerfile构建的镜像
1 N4 F) _5 [( o' N" S! e& ?& _) B! Y0 \1 z. t
代码语言:text# q) R7 h0 \. q' S+ H
复制
' w1 b$ Q( N7 l# 镜像名不能简写,--all-platforms:所有平台,不加的话下载当前平台架构
4 E$ J- i  p9 N- ]) @8 @/ S# ctr images pull --all-platforms docker.io/library/nginx:alpine. |+ L- G- [* c5 {  c& O3 |  }
# ctr images pull docker.io/library/nginx:latest
& O" A' g: n- G: W, x; L
/ r; L1 h# i( c  f' e9 O* p# uname -a- M# |, W+ t$ b0 z% R
代码语言:text: E% _" t$ b4 A- T# z7 V# \; G" r$ g6 }
复制
% [0 M. w6 k: O3 V0 p# c; }说明:
! Z- a- R5 t  K5 o, L这里ctr命令pull镜像时,不能直接把镜像名字写成`nginx:alpine`5 |  i1 O/ m- v. I
代码语言:text! i9 x7 L" a3 R
复制
8 Q6 j2 {" D6 f6 E" _查看已下载容器镜像8 f8 B6 i; P( }: ~% u& W$ c# C
# ctr images ls
9 Q; M  y4 w5 m/ e4 fREF                           
) l. w0 Y* G  z' O! E: F' _- C
, Z- j% W4 w7 n5 Z; STYPE                                                     8 y0 f/ z" L- V8 x" w

+ g' B. V( S, {4 P3 _0 L! g1 eDIGEST                                                      
1 q1 E9 R, o  K% S' }2 H, ~- X3 D( E2 f2 r0 S  H! M: c# x
docker.io/library/nginx:alpine
! ~8 `( Q0 B$ s* u
3 i8 e4 w2 \+ m. @9 Japplication/vnd.docker.distribution.manifest.list.v2+json
1 r! H% h1 u3 Q: Z' T; i2 P9 x5 \4 V
sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d32 ^: ?4 k6 S+ y8 R
. [9 |/ d& N3 p
SIZE   
+ c2 h1 T( a' C, l& y0 @4 f+ c$ `3 {1 X
PLATFORMS                                                   0 Z8 q' [- j3 W" }* d
, v' q1 y$ T- F; }* \
LABELS, t2 r: C  @, c: r! M

( H( u: R( A* j0 G7 Y# D9.7 MiB
! ]. N1 g) `* w# y3 Z: j) r/ B% j. c8 ]: @
linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x
, p4 d4 ]$ Q$ Q2 e
; b( B* K% [: C# Q2 E! K代码语言:text0 P5 G7 U3 b. c; W% @, C
复制" B* S# v* i$ I& U* `2 R) `( H
指定平台下载容器镜像
* o: M3 O$ l: t- m: r9 y. F# ctr images pull --platform linux/amd64 docker.io/library/nginx:alpine
. O. b0 X: ~2 ], R5 R" L0 |& }没有镜像是无法运行容器的。
1 T  Z; p9 M# f3 z$ F2 o; H! C3 |: ]) u
1.4 镜像挂载
9 C0 H' H& @* F* ^方便查看镜像中包含的内容。3 k9 ~) m' L2 V5 O2 i& }1 }- r* S

! K7 c, G! M/ h代码语言:text
! g4 f# b" R/ c. w: V5 L4 w复制9 ^4 r/ |9 u0 V$ f1 u
把已下载的容器镜像挂载至当前文件系统7 F( u. ]+ _; s6 F& N
# ctr images mount docker.io/library/nginx:alpine /mnt/ D3 K2 {6 [9 [2 i- l2 a7 L6 S, s' C
sha256:af2fcce448e2e4451a5f4796a9bf9cb5c9b5f88e0d6d10029cada42fb9d268ac4 w, v5 ~) r  u4 O( T& H, K5 J
/mnt' `1 R4 E% p& h  |. I$ g
[root@localhost ~]# ls /mnt
6 a  `+ q5 J8 B+ j9 g- Z- tbin  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var* A+ U0 G: e+ v3 ^# ^1 F' {
代码语言:text
2 L% B) f, V/ n: R+ Z) w& ~复制, f' E+ R3 G# A$ T/ m" n
卸载
# l" N. D  K& N% ]# umount /mnt* A1 _: u/ m  z) J$ ?1 z( f
1.5 镜像导出- X/ k- f* M0 i  s8 b8 T7 |) F
代码语言:text6 b. j( y- W. P4 Q
复制6 T2 l, }! D% h  L
把容器镜像导出
7 r7 A6 q- \  f+ V& [# ctr i export --all-platforms nginx.img docker.io/library/nginx:alpine
; @  |9 O& K1 |/ @/ ]4 Y) F# \/ a代码语言:text8 v6 v* @, t& e
复制
, Q# R; E* {0 q( x. l9 ?+ L4 m说明
1 J7 J) K5 y) u* I4 y--all-platforms,导出所有平台镜像,本版本为1.6版本,1.4版本不需要添加此选项。6 ]; J5 Y* F4 J. G9 A8 Y1 d6 [
代码语言:text
. q% x% ?$ ]0 U" H复制
4 B3 D4 m, @  [8 l2 v! @. X查看已导出容器镜像1 Z. ?7 G  z) Y& Z
# ls& j! |4 L2 I6 Q7 @1 {6 c5 h# X; y
nginx.img2 W: Z; M+ r! f  Z% G

. c) c8 o  Z8 q* X3 C# ls -lh
2 h: I5 v8 c1 R! h总用量 196M  Z1 p! m/ g" f
( F+ d) e; V6 \
-rw-r--r--  1 root root  73M 2月  18 14:48 nginx.img1 [9 {# h0 Y8 ^; n2 U. |
1.6 镜像删除+ J' R4 ^7 Z' O% Y6 L
代码语言:text
* I3 L- h" c/ ?9 D3 }复制' j5 C  [4 y2 p/ S8 n4 q" b& @1 U# N% D" J
删除指定容器镜像9 }) ~$ D" Y- i0 N/ d4 X
# ctr image rm docker.io/library/nginx:alpine" t4 E4 [, H1 u+ u  I& l8 ?
docker.io/library/nginx:alpine
4 H- I3 ], @# T; J0 W" f  C
9 u7 S+ ?) r: p& [9 d" |, r再次查看容器镜像
% j. n7 l7 U8 J3 V' P, u[root@192 ~]# ctr images ls
$ l# E; D1 ^& S$ f2 G4 O) m5 nREF TYPE DIGEST SIZE PLATFORMS LABELS
' q* \. T) Z" N# b/ U( g- i1.7 镜像导入
* v1 [  f/ q5 y7 p5 c  r2 X& i) x) D" `代码语言:text
; H( X1 x1 C5 G* `6 F% Q复制
: A3 l) s9 P0 F2 ]1 d/ M导入容器镜像) M  {. e0 U8 \
# ctr images import nginx.img* t" N/ a" [7 T2 ]
unpacking docker.io/library/nginx:alpine (sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3)...done
0 O: W, e  T1 y5 ~; ]+ n1.8 修改镜像tag
; c7 `3 _3 Y  o, X! Y6 \0 ~代码语言:text' q, D, u7 G; F* p0 G% @. f$ c! g
复制9 r, }+ Q( Z4 g5 o3 z
# ctr images tag docker.io/library/nginx:alpine nginx:alpine/ i$ W1 c7 }% N& h8 E
nginx:alpine
) U* @: w8 d2 a  ]" s. e3 h; P2 @
8 b' L( W' y& |) ?" O5 I5 s4 y# 建议修改tag的名称为:镜像仓库地址/目录/镜像名6 k& m* y7 q7 ~1 n" c/ _% _( `
代码语言:text
3 U& w/ |4 k9 i2 {复制
; q2 w2 _+ C9 p& \7 T" q说明:3 C* X: D0 b9 L) X: b( w
把docker.io/library/nginx:alpine 修改为 nginx:alpine
, p9 R* R* E8 d" Z代码语言:text
( ?3 \' Y1 E- g6 B, r复制
: c! |; h% U2 ~' |; r查看修改后的容器镜像6 d7 F& q, A- o/ I1 O
# ctr images ls/ y: V% C3 }2 G7 N+ ]+ j
REF                            TYPE                                                      DIGEST                                                                  SIZE    PLATFORMS                                                                                LABELS6 |. H' a7 B  u" b1 h
docker.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 -1 M' m# @# n' n3 ?2 |
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 -) H2 q1 E- _0 b* w- J1 u: _% U
代码语言:text$ P/ B6 x- ~' d5 j0 n
复制' V+ z5 z; l( E7 b
修改后对容器镜像做检查比对
4 E& _" E. W& A  @, P# ctr images check
' j" G% m. F1 B3 {' m: m8 d1 P, eREF                            TYPE                                                      DIGEST                                                                  STATUS         SIZE            UNPACKED
# o$ a1 M" R4 G  e4 I. ?9 Xdocker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 complete (7/7) 9.7 MiB/9.7 MiB true
, k- y. A7 ^' S# m6 D2 T; f) Q5 F( x3 C2 V, R$ q
nginx:alpine                   application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 complete (7/7) 9.7 MiB/9.7 MiB true# e4 i9 d3 `. }) J
2、Containerd容器管理
! D2 G% c1 ]! t2.1 获取命令帮助
) w# Y! v4 [8 O' C- q) o2.1.1 获取ctr命令帮助
1 U; o; W$ E# Q/ k2 R2 [: G6 ~代码语言:text) _) K8 i3 M4 N+ ^) J  s
复制5 v8 A8 Q; I; T! _
[root@localhost ~]# ctr --help& Y& d8 M6 F# O+ [. \( w5 H4 M7 c
NAME:+ I% B+ O( K- V( I
   ctr -9 x9 q/ S* l8 I) r7 {& [; s& @
        __
) g# w3 J: M4 k& r7 t$ U  _____/ /______9 c7 V0 U! A- A" X' z2 m5 _9 g
/ ___/ __/ ___/
$ m" a! r. k+ p4 c9 O. F/ /__/ /_/ /
/ d* N0 l$ M- H' N; T1 V\___/\__/_/) b9 w8 [1 T' `; J
( e' Q+ C; G9 G
containerd CLI2 w5 V0 T; C/ v- X  _' h! L

8 f, g. v, h7 M9 T3 C% X$ Z' E' `" H9 R
......
1 ]  ?+ v1 O2 ?4 G7 s1 Z5 i- D: T2.1.2 获取创建静态容器命令帮助/ |. b( J: c5 |9 p3 q! b9 w
代码语言:text
' S0 Q0 v# q7 `8 E& S# Z& u- N复制% J0 Q; M* L" s
# ctr container --help
9 o5 Z, E8 P: D5 bNAME:/ n9 m9 ?- V: h0 T
   ctr containers - manage containers$ K  W1 y6 P3 M2 c1 @+ o5 w1 D
8 i) y0 T5 i5 X6 E6 ?3 e
USAGE:& J* q: D2 Q6 i4 L! ~! b
   ctr containers command [command options] [arguments...]! I: f# a! ~* [3 C: s+ Y3 W: K
0 T& E) A: ^" M' X, p9 X# o
COMMANDS:# S" Y8 X) a  X1 o# K
   create                   create container
, D# m/ Y/ U$ q0 ]- ]4 X   delete, del, remove, rm  delete one or more existing containers( q( E% h/ j* g- A! X
   info                     get info about a container( Y1 A5 _: [* h0 H1 P/ w. l
   list, ls                 list containers( W9 k4 R% [/ X, S2 {
   label                    set and clear labels for a container
$ b7 C8 K/ C0 t4 m, r$ C   checkpoint               checkpoint a container
+ i/ r0 G8 X+ q2 @( w* x' Q   restore                  restore a container from checkpoint' l6 u7 D8 x& @% o  g8 c+ Z
; m# g( r9 K4 k/ U
OPTIONS:$ ]8 M  Y6 A+ W5 _7 O. C8 |
   --help, -h  show help, A1 e0 f2 H9 P' {/ q  B# {/ R- d
代码语言:text* e/ d$ Y7 f% y# V  E# V+ n
复制
4 b3 I. d9 M& P说明:
- G$ r1 k2 `$ M, k4 b8 t' j! P+ |
使用`ctr container create `命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。这个 container 对象只是包含了运行一个容器所需的资源及配置的数据结构,例如: namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程(本案例为nginx)还没有启动。需要使用`ctr tasks`命令才能获取一个动态容器。
! N! l  Z6 Z, O; e* P2.1.3 获取动态容器命令帮助
: J5 k6 D: C. b! r" ^代码语言:text  c7 y1 B, t7 @# S4 V8 h6 k
复制
$ t6 ^( z9 S7 r) Z8 H" L# ctr run --help
0 h( B  d+ ?# g& x: YNAME:
) f$ Z) e; u" a2 a( i: d- q   ctr run - run a container2 a1 v6 ?, w% B% i% Y
: y, T" p5 _/ P
......
1 ?: ~; d" ~# e/ e代码语言:text5 G, h7 y% V4 c4 d9 U: P
复制% K. U" ^* d1 p2 s) z1 z
说明:
8 D  }; S6 ?( Y使用`ctr run`命令可以创建一个静态容器并使其运行。一步到位运行容器。7 G& o1 y! |$ B5 p4 ^
2.2 查看容器4 J" Z2 M  \) P* b2 Y: `9 a/ T5 y# \) p
container表示静态容器,可用c缩写代表container% H. u8 {! s& @! g( l6 v
3 Z: R+ L; E, |9 p5 G. Q* J
代码语言:text# f; [( A7 c3 m6 F
复制
2 d4 @: {4 V) c( {# ctr container ls' ?) ?4 h3 m# Q7 U4 C
CONTAINER    IMAGE    RUNTIME+ t8 z+ R+ `% I
1 v5 C' P: R& h# Z

; b' y/ `: z3 ~* c* ?+ U9 k代码语言:text
' B- o5 A, z! q' I复制. ?$ \& x" k/ G& @% z* d6 z" K
# ctr c ls
4 p6 e" x0 x  a6 Y) r, ?5 P# bCONTAINER    IMAGE    RUNTIME
! g* R- s5 d5 u" ]6 C以上命令无法查看出来容器的静态的还是动态的" b( t0 _6 N5 \, z# }$ y
/ [/ p1 w7 x4 a8 Q) p( I' ]& U
2.3 查看任务6 ~( g/ Y3 o% D+ q, I
task表示容器里跑的进程, 可用t缩写代表task
4 F- h, G4 r3 x, y, g5 q
% m' b* A; e; G3 R, M代码语言:text
1 i. ^+ w1 c- N6 J7 c( L- o复制& ?, }" f4 Q) o1 E" W
# ctr task ls! r' @8 q. C) |, m2 z3 s
TASK    PID    STATUS0 E" A4 \% o- C! k. K$ d9 S

) t+ P! M. r  s. j1 A% U' U" E; U' N) w/ u/ Z
代码语言:text
0 L! ^+ v) q0 I2 ~; ]# R* h复制
+ o; N' _: \! ~# v" i/ h- N7 i5 Z5 B. @# ctr t ls
- D1 q7 U0 _  J$ {$ P" d+ S6 HTASK    PID    STATUS# K0 E1 f. n' U4 C5 i9 a! H
2.4 创建静态容器% _! n) m& `" n
代码语言:text& B; z) C( ~0 @3 I) m& g
复制
0 G0 N' k0 E, P' Z" M. n# ctr c create docker.io/library/nginx:alpine nginx12 K6 {/ [+ m6 m$ V# i5 z
代码语言:text
( l" T3 I& z6 G/ J9 t1 }复制7 T5 [$ X: f# R6 P! i, Z9 ^* T
# ctr container ls
9 Z% c0 d* L3 ]/ k5 KCONTAINER    IMAGE                             RUNTIME$ r3 ~; E9 m" I9 X6 g% b+ }
nginx1       docker.io/library/nginx:alpine    io.containerd.runc.v2/ Z8 {" }3 z) t
代码语言:text$ B) @  S& y6 Z- X* J# E$ F
复制# \4 R; s' p9 {9 ]" z& w+ H
查看容器详细信息
! z+ @1 r. b9 j8 q& n. G# ctr container info nginx1
% U6 K& S* y, |3 S, i* x2.5 静态容器启动为动态容器% Y' |% P: H- I! h
代码语言:text7 c; ?8 G( t# K1 S7 C$ @
复制
9 k* B1 n, Y9 S/ l2 X" j6 ]5 u复制containerd连接runC垫片工具至系统
: n: T3 n: h5 Z3 k/ d, n# ls usr/local/bin/; f0 P  B  L* J7 }0 e' i
containerd  containerd-shim  containerd-shim-runc-v1  containerd-shim-runc-v2  containerd-stress  crictl  critest  ctd-decoder  ctr$ h1 h! R+ \9 L; w/ Z2 z
[root@localhost ~]# cp usr/local/bin/containerd-shim-runc-v2 /usr/bin/0 R! A1 w3 i  Y0 J
代码语言:text
, B0 [2 V" O0 j8 t, i复制
" i/ O/ S, d4 p, a' P( T启动task,即表时在容器中运行了进程,即为动态容器。
8 }1 A' h% M' P8 u7 D- x# ctr task start -d nginx1* t6 Y/ a+ A" ?$ U7 F
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration5 w5 d% c8 `6 Q3 K$ E
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/, T) P7 n9 B, q1 g$ K; M; x+ ]$ }
代码语言:text
) z: }: N8 d) B6 ~复制
# {# ?% d: U3 G6 b- ?% C说明:
* @+ c- {( N' |  }# h+ Y( _-d表示daemon或者后台的意思,否则会卡住终端
  q- p" L; u  H/ Y' x. V代码语言:text8 P3 t8 {5 e  R/ b: L% r
复制
* S& i, \9 I: V$ v查看容器所在宿主机进程,是以宿主机进程的方式存在的。+ ?: k' f; w  p- _6 |/ H5 q
# ctr task ls/ R. y  g( D, C
TASK      PID     STATUS
9 u) ?* R% U1 `$ p9 mnginx1    3395    RUNNING
# ^7 ]$ O- t7 K5 @- @5 C" i代码语言:text
* [2 F' B! o$ L, m' g, u& l- K复制
) W; r5 Q) ]+ @! ^9 H查看容器的进程(都是物理机的进程)3 J" H( t6 [% M
# ctr task ps nginx17 F9 u  ]8 o2 J8 K4 z6 v
PID     INFO
% |5 [  p4 U7 L) \$ g' N. z# V3395    -
: O3 ~) C9 J1 z7 N3 U  l3434    -
2 x  s4 E! g8 Z* N代码语言:text
' B$ ?/ Y' ?) r9 P- z, H复制
/ H0 a  @* f# G, a; ^物理机查看到相应的进程* ?+ {% Y# J  i" O
# ps -ef | grep 3395, N* F* ]5 `4 a
root       3395   3375  0 19:16 ?        00:00:00 nginx: master process nginx -g daemon off;
$ r2 Q( n, ~& q8 O101        3434   3395  0 19:16 ?        00:00:00 nginx: worker process4 ?5 ~1 V* w, u1 g. m, z
2.6 进入容器操作
. e1 D6 s8 K8 g% h" s代码语言:text; \6 [. m7 N, q* }0 S. q
复制3 n- l; x5 U) T' [7 N" I
# ctr task exec --exec-id 1 nginx1 /bin/sh! z; M: }2 t2 u" S, N8 C

, U5 J# n! N: Y7 W# ifconfig 查看网卡信息4 C$ k4 x3 h4 |' l8 Y

# I$ B( J: L2 W+ }3 g- p  T...& V5 x9 K  a( b! b- u/ N6 y

& w- Z$ R6 T! n$ [  `' J) R# curl 127.0.0.1 访问本地提供的web服务
) t& w3 M" w9 f' G6 u...
$ W( |4 @( [6 t: Y代码语言:text# H' n4 M% b7 p) @: i* q
复制
: e) T6 k  }! L. S: q; K; W说明:7 W$ q7 I: \7 \+ A
为exec进程设定一个id,可以随意输入,只要保证唯一即可,也可使用$RANDOM变量。
7 V+ e1 V0 @% t6 Z% R2.7 直接运行一个动态容器
: f, w  d8 ~1 p+ N6 e( U9 f代码语言:text
5 D" ^- F; F1 U- g  Q7 ~5 |复制! o, j+ P& T9 ?# w
# ctr run -d --net-host docker.io/library/nginx:alpine nginx2
/ o% p' J/ e, e& k2 W' E/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration4 j1 d  L5 w9 S0 G% B
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/' ?3 T& p' x% v/ v: X
代码语言:text
4 {0 ?' f8 \" C复制
$ G( M. h2 ]: ~说明:$ T* T# b. T3 L0 q3 I  H+ k! k) ?
* -d 代表dameon,后台运行
/ I2 ~( y& r' S$ C6 d9 o; ~* --net-host 代表容器的IP就是宿主机的IP(相当于docker里的host类型网络)" g) w. ?/ A* g" F5 U
代码语言:text6 ^' m1 S% ^; w
复制
& Q" @$ L: f3 M/ L* }查看已运行容器
. w3 I/ K8 v2 ^& [# ctr container ls2 L7 N: I0 @3 ]* \. y* s
CONTAINER    IMAGE                             RUNTIME
6 L* v% l8 H* O/ z5 a: [4 wnginx2       docker.io/library/nginx:alpine    io.containerd.runc.v2
$ F. o: w% O3 x代码语言:text; ?# N% g7 |0 f  T8 h
复制
5 _6 l" y! }) ~% T. }' _0 h; S2 y查看已运行容器中运行的进程,既tasks
# }# @! G) N+ Y# ctr tasks ls  d! |& e$ k% M( @3 H; j6 I* s
TASK      PID     STATUS
9 i; h8 B* [  q2 h, C( ~/ `nginx2    4061    RUNNING& s  b7 Z6 e  U+ V- P# J8 H
代码语言:text
( q" L" X1 o0 z0 Q3 `0 M# t) Z复制/ Q# R/ t; H1 U
进入容器
- T9 L  ?6 t7 M7 B- P5 d( S# ctr task exec --exec-id 1 -t nginx2 /bin/sh& V# B( t5 g- r
代码语言:text- Z0 s+ ~- c* @6 S
复制. _& Y$ n7 D; q* x& Z! @, \( |/ ?
/ # ifconfig 1 _+ `; ^  C/ F7 K$ ~* H
ens33     Link encap:Ethernet  HWaddr 00:0C:29:B1:B6:1D
- L% c1 Q% e, H2 y: N) n' B          inet addr:192.168.10.164  Bcast:192.168.10.255  Mask:255.255.255.06 J7 ^7 ]$ \+ O. J2 _6 }$ I
          inet6 addr: fe80::2b33:40ed:9311:8812/64 Scope:Link! m) V" L; O; u. z& J. u% e. M
          inet6 addr: fe80::adf4:a8bc:a1c:a9f7/64 Scope:Link! F; ?; O5 \  ?! B" [) L8 M* m, K1 a
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:18 [/ P$ b; ]' j6 }9 [
          RX packets:55360 errors:0 dropped:0 overruns:0 frame:0
/ {" k6 s! ^# Z, c. ~          TX packets:30526 errors:0 dropped:0 overruns:0 carrier:0
" q/ K/ d, b1 B/ r7 B0 m. [( B% W1 V! W          collisions:0 txqueuelen:1000$ b3 a/ c, X2 @  z" s; ^" E
          RX bytes:53511295 (51.0 MiB)  TX bytes:2735050 (2.6 MiB), U1 F! v" O$ G2 Q0 ^7 R
4 |! r- y$ ]* n5 r5 q% \. i, L
lo        Link encap:Local Loopback
$ Q5 g" C/ h  J) m( O          inet addr:127.0.0.1  Mask:255.0.0.0
2 P% s  a% W8 T0 Z5 v          inet6 addr: ::1/128 Scope:Host6 z" V$ V2 @$ J' ]
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
$ ^. i: Z( |5 e          RX packets:68 errors:0 dropped:0 overruns:0 frame:0
+ X1 f9 ~0 `# q- D          TX packets:68 errors:0 dropped:0 overruns:0 carrier:09 u9 Q1 _9 @. [9 t  B
          collisions:0 txqueuelen:1000$ u+ ?; z' z5 ^& a& F
          RX bytes:5916 (5.7 KiB)  TX bytes:5916 (5.7 KiB)( |& y1 G& F$ i+ K* }7 _

8 W: K: B0 b% {' S8 ?! S0 d9 hvirbr0    Link encap:Ethernet  HWaddr 52:54:00:E9:51:82
- c& ^. n* v- U/ V9 }! V, P6 y          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0, b: B0 B! K* ~/ L8 D7 ^
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
* q! @! A, f) v' \; ]5 H, g          RX packets:0 errors:0 dropped:0 overruns:0 frame:0; g2 Z1 k4 f4 {
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
" X2 X1 B7 F$ o9 C' E5 J          collisions:0 txqueuelen:1000
1 u4 P0 L8 c8 |$ `          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)  K" B/ A, B+ H
代码语言:text$ j! C- ^; t' Z5 S# Y% Z/ N# n
复制
1 Y* V) w+ i( D为容器中运行的网站添加网站文件
" X9 G( f& H+ k  k2 S/ # echo "nginx2" > /usr/share/nginx/html/index.html& _0 K. [, E% ~, x0 l* i
/ # exit
( I% y- m' X! a代码语言:text' K' R& f: h4 }
复制- G+ K. q8 |- k2 B5 r
在宿主机上访问网站
0 t# W0 y  W5 o  u[root@localhost ~]# curl 192.168.10.1644 ?+ {9 a2 S7 v# n& Z0 B# G
nginx2
  z; e. ]0 F. o. X9 @2.8 暂停容器
: L- r& b9 e9 F# C代码语言:text
: Q+ J" T  \. X4 t( J复制+ h, F  q0 _; u, Z: A9 S
查看容器状态
: Z; b( g: [+ `4 q# ctr tasks ls" j9 b; f: s% e$ a/ r
TASK      PID     STATUS3 p" y- }5 H4 ]; N8 J
nginx2    4061    RUNNING* m7 x4 k( g+ I$ V- R8 ]+ l; q6 ~
代码语言:text) l* ~( y- i7 e. }2 {5 X/ b
复制' v7 E. s! l& d. f/ Q, y1 `/ W
暂停容器
$ q4 q3 c- o7 N) _: ^6 o# ctr tasks pause nginx2
( y! W2 C+ X0 a. A9 r代码语言:text. ]; }0 ^* I9 Y' r+ i4 z
复制
' V- S; p6 e' Y! V/ w+ w2 C; V" v再次查看容器状态,看到其状态为PAUSED,表示停止。
/ g& f% y$ i; m3 E0 L4 m, i6 o# ctr tasks ls2 n+ f4 I7 n* w0 d2 \$ i% ?
TASK      PID     STATUS  `# l' d% b& S5 V; N
nginx2    4061    PAUSED6 X9 J) [- G) r" r. S8 W
代码语言:text8 a0 y8 D5 x+ I1 s6 X) ^7 d: R/ V
复制6 R4 H- X" x  S
[root@localhost ~]# curl http://192.168.10.164  _( F1 J  }: p6 s. o
在宿主机访问,发现不可以访问到网站6 |  p9 O% G7 G8 V" p
2.9 恢复容器: m; a7 y/ r0 ^! Y: n
代码语言:text
. f# B' `* D! _  |/ L7 K复制; ~$ ?& l- t6 y% B( U
使用resume命令恢复容器' |3 \( r+ g3 R' ^- m* N+ I
# ctr tasks resume nginx2! f; q' Q9 V1 i0 I- K( y
代码语言:text
" t- I4 d* ^. e( Q  U复制
$ c) ^; v  L# D  O' m$ ?查看恢复后状态1 ?3 a5 M! T2 {  L" Q
# ctr tasks ls
' R' i# n$ B+ P! M- H3 B; Y( jTASK      PID     STATUS
7 v2 S0 D0 ^( Z# Z2 rnginx2    4061    RUNNING
# E9 `& e  @) `$ A代码语言:text
3 a$ E3 u9 D. X3 a  r0 {  B复制: Y9 v' }- K1 O
在宿主机上访问容器中提供的服务& T$ n: e8 d/ f. A
# curl http://192.168.10.164
: [* R3 X  h9 x  p! enginx2  k' ~! C% `  O4 k
2.10 停止容器% F: q% }! [6 A" j( Q
代码语言:text
0 b' k( |- y, ?) U) d" c. G/ v复制0 G$ }0 g( \7 D& `# d  n2 I
# ctr tasks --help
0 g# N7 M. i* T0 H......3 q" f2 @; E* a# E1 [6 W$ d7 D0 `
代码语言:text" e! E9 t$ M1 x0 r7 r9 A1 p& X
复制
, r  z. `- ~$ Y( Z使用kill命令停止容器中运行的进程,既为停止容器5 ]1 R4 K( W$ Y$ M( G; m9 U
# ctr tasks kill nginx2
% l* o' H: o/ q) l; c& \8 T" ~代码语言:text
* R+ V0 e. h6 _2 J7 b) X7 J8 k复制
! ~0 ^; T' ]+ _' a4 w. T查看容器停止后状态,STATUS为STOPPED
+ u, i' V4 e+ k% r# ctr tasks ls
! n( M; p  R5 ?$ nTASK      PID     STATUS2 B# g* u$ Q; t; W( x5 A1 ^7 s
nginx1    3395    RUNNING
6 D- e3 r4 X( z: jnginx2    4061    STOPPED
  {6 V( ]5 ~7 ?2 Q$ ]$ i1 v2.11 删除容器% X" `9 `, Z) c2 [. s7 g3 o9 }3 a
代码语言:text
# t" o$ r" ?$ ~' X6 B$ g* J6 R7 `复制
; Y% ?2 i, b+ a! M* i7 C7 \) O4 n# ctr tasks delete nginx2
) H% {- s9 _! g; a7 ?5 _1 `必须先删除task,再删除容器- A% l5 H( @( M2 N  ]& i$ D
代码语言:text- @; m# r1 u4 J
复制$ I/ J  K4 r; C" u" a- l
查看静态容器,确认其还存在于系统中7 `6 i+ H1 r0 o% `
# ctr container ls& A, Q. P) W! g4 T6 D& d; z6 c
CONTAINER    IMAGE                             RUNTIME0 L$ E7 x% S! l/ E5 q. J9 m
nginx2       docker.io/library/nginx:alpine    io.containerd.runc.v26 u- s1 C# J; |6 f! P2 d
代码语言:text
. ]! o4 X; a3 N4 }2 H: N" T% ?复制4 R5 K; E0 n' v1 i
删除容器  P0 y4 n, y# v
# ctr container delete nginx2
8 f' f0 m: }. y( W& c+ H3、Containerd使用私有容器镜像仓库 Harbor
5 w. M5 o+ Y+ _# x7 f. z1 b3.1 Harbor准备
2 E5 A5 n7 ?* {% L+ q! r) E( d5 ?5 d9 o7 N& M! _

$ {6 d' u; j; @' k* a3.2 配置Containerd使用Harbor仓库8 C; {8 E  x0 |" q7 b- Q+ Z! a
3.2.1 Harbor主机名解析. |- ]( O5 [$ l+ V% z! r
在所有安装containerd宿主机上添加此配置信息。
" C( n  c8 B! l3 s7 g/ K- y9 Y
, C: I, ?: N/ e' D代码语言:text
7 I# u) [3 g* N* R复制* P9 B# {4 M$ K$ I5 L0 q. G
# vim /etc/hosts
7 J: @/ Z$ ]6 J7 V5 e. E  p# cat /etc/hosts* p! L6 y" P' E( w9 f8 g1 {) L
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
: M; }& t8 d0 U4 r+ g+ S0 d::1         localhost localhost.localdomain localhost6 localhost6.localdomain6+ r. t( B% ^4 D' Y- J9 D/ q
192.168.10.165 harbor.kubemsb.com
6 J: C9 _. x. F& U7 f代码语言:text5 Y8 ~* Z: S# b- _) z
复制
( z# ]2 \: N1 p$ A9 [; m说明' f3 T. f( B6 \* Y) D
* 192.168.10.165是harbor的IP
: E( Y5 Y0 G; B/ T0 \' M4 W' \3 ~, w4 e# d* X" p2 b3 Z1 l
* harbor.kubemsb.com建议用FQDN形式,如果用类似harbor这种短名,后面下载镜像会出问题
/ T: U, o2 |% _& [$ D5 `7 r3.2.2 修改Containerd配置文件& q# S! X! R: \$ D
代码语言:text& j& Z3 {' u3 ~! L( y- K
复制
+ U, S' p& t7 o, _# F) e此配置文件已提前替换过,仅修改本地容器镜像仓库地址即可。
' |4 O( r) t0 g9 E% Q/ d# vim /etc/containerd/config.toml! ]8 t4 t! u6 ^6 Y2 o, t
# cat /etc/containerd/config.toml+ K8 T+ d8 W- l( a! c3 Y& w
root = "/var/lib/containerd"# p1 X$ B8 r9 e# P( f
state = "/run/containerd"
" m! w8 r. ^8 h' Q6 Uoom_score = -9998 I7 |! [0 K+ s. K( `. n  j

5 q1 ~) d  Q! ?! o4 j[grpc]8 Z, n4 a. [1 D  I. r2 ]
  address = "/run/containerd/containerd.sock"& B% S; y$ R7 \* U6 H- y; |1 k/ {. w
  uid = 0
- G9 E- ~" K1 ~  gid = 0
  z! K7 ]% _& |9 n  w# a+ U! M( [  max_recv_message_size = 16777216
6 Z& Z' O" v: t; G$ m& k  max_send_message_size = 167772161 _" I% V- q( @9 f; _3 Z1 A

4 i3 L5 h, [: O3 N3 j[debug]
' ?$ P2 k  H) N& Q. @4 Y  address = ""
  J3 |; h% M1 g  uid = 0
5 C. F8 ]9 n3 N  gid = 0
' j3 [; L- [1 D  level = ""
) N1 A( [  u" e  p$ X  ?$ w% F
/ j- J6 C: k0 a9 f4 y[metrics]' c) R( s1 I' w/ ~
  address = ""
7 }7 q: m! N" s" X  Y8 _  grpc_histogram = false
1 d) F* [5 A# j7 Q7 j+ i6 k7 B* H1 ~
[cgroup]
- ^5 M7 m, \5 j$ \$ q: `- p  path = ""
$ b& p* z! A. _  @) D/ p% ]) _# x1 E
[plugins]
5 Y" i9 {* v" [( j4 ?5 a- f  [plugins.cgroups]
4 K- b4 T; O/ u    no_prometheus = false
4 c* j+ J- n% Q  r  [plugins.cri]
! z' R7 x0 A2 R5 f9 C( f    stream_server_address = "127.0.0.1"
4 S; x' R3 `/ T( y: }' f    stream_server_port = "0"$ |! N( L8 g) R6 o0 D
    enable_selinux = false8 Y2 l7 P9 L& P$ `8 x# w
    sandbox_image = "easzlab/pause-amd64:3.2"; l9 X! P8 f* ^
    stats_collect_period = 10
  e* U3 R1 q  L# |* U) F    systemd_cgroup = false- m4 q; x9 ?7 u1 A  v% q
    enable_tls_streaming = false
1 ?% Z0 l' M" S3 q: g    max_container_log_line_size = 16384$ P* b( R% z4 `$ r8 l- \: x
    [plugins.cri.containerd]
$ F2 L. F* F; D- p: w      snapshotter = "overlayfs"
6 ?, j& }- O& H, q5 K- v$ t& C      no_pivot = false7 E: {" }3 u% V7 t0 |2 b
      [plugins.cri.containerd.default_runtime]
  r# r+ y7 h! {+ \        runtime_type = "io.containerd.runtime.v1.linux"
3 N4 n: F# [8 L) |  j6 ]        runtime_engine = ""1 W3 s2 K3 }$ }- ~% e
        runtime_root = ""$ [% u& j$ r& ]( s! y6 S
      [plugins.cri.containerd.untrusted_workload_runtime]
2 w5 ^+ Q! j6 ~  Y- h. o) e& b        runtime_type = ""
9 O. J/ r% g' h% C1 o) n/ e- C        runtime_engine = ""
+ g1 P, P/ j- @        runtime_root = ""6 W1 G  a, r* @* f8 F% ]9 Y! ~, {8 v$ v- x
    [plugins.cri.cni]& ~9 Z0 s5 ?; Y% p
      bin_dir = "/opt/kube/bin"
! F% t9 ?+ V" h) J, R* w# @0 x/ y1 C      conf_dir = "/etc/cni/net.d"
% p7 k+ `. h* }3 \% u      conf_template = "/etc/cni/net.d/10-default.conf"
  f7 o/ J- o+ c' \- O1 c    [plugins.cri.registry]
; I4 D; N( J- L6 w( a- X! x      [plugins.cri.registry.mirrors]
3 ~2 k3 o( H, n* }4 a' f: u. a        [plugins.cri.registry.mirrors."docker.io"]
% }" j; t/ {* T# ~( o          endpoint = [
1 _% p1 f  @9 C- a" H; @) X" e            "https://docker.mirrors.ustc.edu.cn",
9 ]6 A/ r1 v/ z            "http://hub-mirror.c.163.com"
. M* Z: A2 M" a: o  x          ]
( t+ n* D1 [# z2 v/ o8 _; c        [plugins.cri.registry.mirrors."gcr.io"]
8 f& y; u! k# |' \9 [$ }6 d          endpoint = [
% @: ^; T1 e& f, V. e/ t" I            "https://gcr.mirrors.ustc.edu.cn"
! V; W6 r: g' P3 m5 x7 s          ]  `* V9 h7 R5 u, N2 i
        [plugins.cri.registry.mirrors."k8s.gcr.io"]
; _) @: ?' Y0 p* c1 J8 N          endpoint = [+ f% B% ]& A' K9 n0 o4 S9 O
            "https://gcr.mirrors.ustc.edu.cn/google-containers/"1 _  Z* [7 u. ~0 m% P
          ]8 _' E) X5 S  r8 e  e8 K
        [plugins.cri.registry.mirrors."quay.io"]
+ I9 [$ }0 e# i; `          endpoint = [: ~) T6 c) W' v- B, j1 |
            "https://quay.mirrors.ustc.edu.cn"
- Z' O8 f4 E! V" B% @* ]          ]1 ^" Y6 P9 E! Y- k! }
        [plugins.cri.registry.mirrors."harbor.kubemsb.com"]   在此处添加,在镜像加速器下面添加这一段/ L3 d" |( R* ?; h4 Z& T4 b  j
          endpoint = [
7 }9 V6 O9 T; k0 z            "http://harbor.kubemsb.com"
7 B* ?% M7 Y; u1 d          ]
  ~' ]4 J, w) c  @' _    [plugins.cri.x509_key_pair_streaming]1 ^; n- \6 ?# F& V4 ]" n4 |4 l. ]
      tls_cert_file = ""; d) H: M/ ~$ U9 G: T
      tls_key_file = ""
1 C$ a4 d" J1 x0 h, g1 N. @. C  [plugins.diff-service]
! R& ^3 ]( z0 }$ R# [4 `    default = ["walking"]* w% [- x' \. X7 j$ S3 k
  [plugins.linux]
7 H3 Y8 h* F2 h0 j+ B4 Y! _( k! B    shim = "containerd-shim"
! J2 Q( T* F) g    runtime = "runc". P/ z( O  Z" m$ g
    runtime_root = ""
% m. T* z" A5 }3 v! ]    no_shim = false% ^  i: M$ |, j9 U; u& _
    shim_debug = false& d! m0 m) y4 [( N
  [plugins.opt]7 S! _  F) p( j, m0 V6 E% X
    path = "/opt/containerd"
+ P( x/ E# y+ d0 n8 M  [plugins.restart]# }$ l0 \5 D/ W4 u2 h* ?) h
    interval = "10s"
6 ]. r% C* z+ ]  [plugins.scheduler]
0 T7 a" ^: w! C' \2 [    pause_threshold = 0.02- c8 d+ r8 w& E: |3 s: _% `& C8 r
    deletion_threshold = 0$ E: x8 y& ^4 m" Q) \& ]3 G* F2 r
    mutation_threshold = 100
: c- d* u$ {6 y& y6 c( S    schedule_delay = "0s"3 P/ W* E, W7 v' A6 m/ x
    startup_delay = "100ms"
! G/ t# R+ J3 E5 K$ T, |) C9 g代码语言:text0 K; J: B& _1 r
复制
( ~9 E. i, T+ J重启containerd,以便于重新加载配置文件。; |6 a: S6 E! Y  E
# systemctl daemon-reload
! g# I5 C5 e" R% h; J# systemctl restart containerd( P+ ?8 u+ C) N. P9 T
3.2.3  ctr下载镜像+ M4 ?+ e: e, k, i  d
代码语言:text
8 j: g$ t  t! K* Q  ^" e复制. w1 N! j% ?8 E- r
下载容器镜像* Y2 q' ]! X! v% L/ ^% h/ |4 F
# ctr images pull --platform linux/amd64 docker.io/library/nginx:latest& W( j! B. V2 a, x3 _1 o
代码语言:text
: k/ E7 ?1 K+ y9 y# B复制/ S8 g8 j! h$ T$ E5 o. R
说明:. X) e/ f5 N$ W% r1 v1 G7 N
* --platform linux/amd64 指定系统平台,也可以使用--all-platforms指定所有平台镜像。
  E# `- a! B: Q代码语言:text; g) a8 t) s9 J( o: `8 W$ @5 z2 g
复制) V5 T) o; S+ C# a* @7 k
查看已下载容器镜像
* b9 s8 C$ v2 }9 ?: m* X6 {# ctr images ls) _' }0 P; c/ D7 ^
REF                              TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                                                                          LABELS
2 F+ e% R, w5 |- L6 \" J6 h) {
/ S2 P  C& b0 w. P+ b5 X( }docker.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                            -
" B& A8 J( T4 N# |) a3.2.4 ctr上传镜像
7 G  F  c1 X# G上传到Harbor library公有项目
1 V$ k) ]3 f  H/ O) |7 t5 j
5 {9 m$ ?( Y) N$ f8 A+ u  Q! y代码语言:text. C/ L* K% h5 s7 C- ~0 l
复制
( J8 m  l" k/ X0 ]重新生成新的tag
1 l( d3 s9 e; M/ f- k2 S" N# ctr images tag docker.io/library/nginx:latest harbor.kubemsb.com/library/nginx:latest1 Y! Q/ c0 ~4 P
harbor.kubemsb.com/library/nginx:latest$ {' l+ a6 x# j) Z
代码语言:text
+ ?. j; o( h: c% @3 T6 Q复制
0 g% I) K# W1 a- \! q6 J查看已生成容器镜像7 Z/ \) R4 R6 c' @0 G8 c
# ctr images ls7 _/ X$ Y* O- d0 Q* [$ q8 n
REF                                     TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                                                                          LABELS; V( T- c# k1 X& ]4 K7 h( ?
docker.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                            -8 ^( U' J: M6 i4 D! e/ S
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                            -
! J0 S8 a/ P8 f8 |# q, Z! E! D* G代码语言:text
& f. t2 ~& \# t! [% M复制0 X/ v( A' e, f/ L
推送容器镜像至Harbor+ `# g* W8 i! t
# ctr images push --platform linux/amd64 --plain-http -u admin:密码 harbor.kubemsb.com/library/nginx:latest
$ m; a4 F/ z! H  d代码语言:text
2 y/ x: [( X4 D$ v# v+ `) r复制( ~8 T9 i+ o( D6 t) R% e: g  A
说明:
$ Y8 t: h' ^. d* O; h1 b" l4 q2 L& F0 o6 e  Z* s& z
* 先tag再push
( Y" d( b' D$ B% B, K/ }: A* 因为我们harbor是http协议,不是https协议,所以需要加上`--plain-http`4 r+ b9 i4 Z$ G/ K6 o$ M' p- l
* `--user admin:Harbor12345`指定harbor的用户名与密码! ^' g8 h/ }0 h" f
代码语言:text1 K, J: k; v2 Y% d2 @  }
复制
3 W  D$ l2 P9 y5 K, Z输出:, v0 j- M$ l0 B' _% E. R
manifest-sha256:0fd68ec4b64b8dbb2bef1f1a5de9d47b658afd3635dc9c45bf0cbeac46e72101: done           |++++++++++++++++++++++++++++++++++++++|  m8 r* `5 H( S5 W9 g  |1 k
config-sha256:dd025cdfe837e1c6395365870a491cf16bae668218edb07d85c626928a60e478:   done           |++++++++++++++++++++++++++++++++++++++|8 ?  D$ A" ], a5 l1 V
elapsed: 0.5 s                                                                    total:  9.3 Ki (18.1 KiB/s)1 @; b( g% ~0 U
9 N( X2 |8 R2 E3 T+ {$ S
代码语言:text3 m% M9 |# f! F6 o- g. n  Y, C
复制2 R  Z6 f+ _0 }/ u9 j
下载已上传容器镜像
* S! {' H4 b7 o. w& J9 g5 ]# ctr images pull --plain-http harbor.kubemsb.com/library/nginx:latest
3 e/ E2 \% D" j
9 F" z7 }) b3 L2 T
 楼主| 发表于 2025-1-23 13:50:42 | 显示全部楼层
Containerd 常用命令% ^- y. K! ~+ Y0 [2 a; J8 G. [: Z% v$ S2 i

* }! A; s8 d4 I1 H在 Containerd 作为容器运行时的情况下,可以通过 ctr 工具或 crictl 工具来与之进行交互:
* R6 R  j' j- q: xctr 是 Containerd 自带的客户端工具
( M5 ]1 d7 P% h8 [3 \( v, `1 p& e! _0 g0 x& z1 W
crictl 是 CRI 客户端工具,比较接近 docker 命令
+ z. S: f9 J. ]" p
5 U6 W' H, r7 h, j3 O; [- o# ^此外还有 nerdctl 等类似工具,以后找机会给大家详细介绍。: A  K$ ~; ~5 S3 j! A2 X

  P0 q+ t1 p( m& ? / U4 V2 F1 ~1 J! @. R/ y" _7 n

$ j6 o/ |1 q' v6 d) ^1、ctr 命令3 A: _9 ?% |" `. z
. n1 S+ w. k# g) d  N0 n5 A
# 镜像操作命令
' L, f# V9 j; D/ yctr -n <ns> i xx                         # 镜像操作命令格式,默认 ns 为 k8s.io
1 ^+ D0 m0 H1 J* L  bctr i ls                                 # 查看本地镜像列表,同 docker images7 F  r+ I% U* N( a- u# M& {
ctr i rm <镜像ID或镜像名>                  # 删除本地镜像,同 docker rmi -f <镜像ID或镜像名>
% S* n6 P( o2 v/ }6 Y- L  f' U% pctr i pull <镜像名>                       # 拉取远程镜像,同 docker pull <镜像名>5 k  q5 |- r% g9 S' [
ctr i tag <旧镜像名> <新镜像名>             # 修改镜像名称,同 docker tag <旧镜像名> <新镜像名>
0 r$ D" S& Z6 y9 t6 k* ?0 Y, Hctr i import xxx.tar                     # 从本地文件导入镜像,同 docker load -i xxx.tar# s* @4 c1 J* g5 B2 l5 b
ctr i export xxx.tar <镜像名>             # 导出镜像为本地文件,同 docker save <镜像名> -o xxx.tar
7 Z: b5 D$ `: w3 Y9 W% F1 E
: O" ]0 [/ P* n6 U6 @0 K# 容器操作命令
0 I: V; C$ H4 w% F+ I6 I# V; sctr -n <ns> c xx                         # 容器操作命令格式,默认 ns 为 k8s.io7 ?1 V  ^' |; N# h8 f- D
ctr c ls                                 # 查看容器列表,同 docker ps -a,查看所有容器
. K; ~: l7 M9 k. R! Actr c rm <容器ID或容器名>                  # 删除容器,同 docker rm -f <容器ID或容器名>) `# b. G2 o, n& Z' k- u; z4 E
ctr c info <容器ID或容器名>                # 查看容器信息,同 docker inspect <容器ID或容器名># P$ b% j% ]* Y( i7 F! [' d
ctr c create <镜像ID或镜像名> <容器名>      # 创建容器,同 docker create,仅创建容器(容器并未运行)
2 L8 @0 f3 B+ Z; a+ }* X% E6 V2 B  C8 s4 g" [- V5 J) P
2、crictl 命令
6 k6 q  }: @% Q. `' J# 镜像操作命令% Y3 ^/ S6 B& [/ {* P- L
crictl img                               # 查看本地镜像列表
) G6 H8 D2 L+ `' V! X4 y0 |crictl pull <镜像ID或镜像名>               # 拉取远程镜像- Q9 L& \2 {" m" Q
crictl rmi <镜像ID或镜像名>                # 删除本地镜像& c* J  V, @4 |6 c
! I4 D1 }! [$ H) y4 Z4 o* s/ y1 p
# 容器操作命令& y* c, u5 q- S7 F
crictl ps -a                             # 查看容器列表- p0 \" k, ]/ S: {, v! [' a
crictl rm <容器ID或容器名>                 # 删除容器
0 w. \; G8 o- Y+ acrictl logs <容器ID或容器名>               # 查看容器日志
! }) J6 l, N0 }' p$ G4 i* ]crictl stats / statsp                    # 查看容器 / Pod 资源使用情况
 楼主| 发表于 2025-1-23 13:51:15 | 显示全部楼层
# AMD架构; V8 Q- H, a1 @) H3 C8 u: ]& _
wget https://github.com/containerd/co ... -linux-amd64.tar.gz
" d9 ^/ Y! S9 N7 j1 P0 V5 ntar -xzvf containerd-1.7.21-linux-amd64.tar.gz -C /usr/
$ R" {# A, J5 o+ A; e% r6 Q : A" `+ I6 ]% z" O, }: G6 A$ h$ P
systemctl daemon-reload3 y8 u. R3 q- K
systemctl enable --now containerd/ p( W" L( S' ^0 C% F
: U) r% |, _( [
===================================================================================- L: b  k6 r% b0 P0 @7 o, H/ d
# ARM架构. [% w- B+ m0 c9 [( j# A: Z, `
wget https://github.com/containerd/co ... -linux-arm64.tar.gz  O, c" ?. _8 M" d" m
tar -xzvf containerd-1.7.21-linux-amd64.tar.gz -C /usr/+ }7 n5 N/ k% L
6 i$ z& L" ]4 I
systemctl daemon-reload3 M! q# Z+ `" I
systemctl enable --now containerd
 楼主| 发表于 2025-1-23 13:51:29 | 显示全部楼层
# 拉取一个镜像# K! _5 ]; e7 c1 l5 K$ J0 p3 |  _
containerd ctr image pull docker.io/library/nginx:latest% v0 l! n6 `  J; F6 \

: ?: F' z+ b0 G' D' Q7 x# 创建并启动一个容器- d' E  K% `% W* n6 Z) L' i4 m
containerd ctr run --rm docker.io/library/nginx:latest mynginx/ Y" k* Y4 s$ @0 p! g  q

% R" \# V$ H4 `" D: ]7 P) j% z0 e, f# 停止并删除一个容器
$ n* Z+ B1 }( ^- u3 Wcontainerd ctr stop mynginx/ m) ~- M7 d7 r9 O6 n* A( C
containerd ctr container rm mynginx
 楼主| 发表于 2025-1-23 13:52:38 | 显示全部楼层
配置Containerd0 b' Q1 T( B8 M0 k/ h
在配置文件/etc/containerd/config.toml中添加以下内容:/ B& [! j3 [+ t
. U& {1 B% k  i  [# x4 ^6 [
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
: \- t/ x! c! l) z ...
2 A- D% a+ K$ f+ t1 X" h; ] [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]- r% r: n1 d0 \: x
   SystemdCgroup = true
 楼主| 发表于 2025-1-23 14:01:01 | 显示全部楼层
containerd config default | \" |: h1 h3 s/ f5 e9 j- L5 {" q
  sed 's@/var/lib/containerd@/data/containerd@g' | \: `3 B% Y9 F( |1 [" h0 K* ^* u
  sed 's@k8s\.gcr\.io@google_containers@g' | \$ U6 j2 O" `1 D" V/ D
  sed '/SystemdCgroup/c \5 c/ R  P& z- L: [
            SystemdCgroup = true' |) t. B6 k3 l- v" s3 J& i
  sed '/registry\.mirrors/a \) O: d6 `, k2 i+ y& D
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.1.10:8082"]\
' P$ N' F" i  {- q7 R# O# _          endpoint = ["http://192.168.1.10:8082"]\
% v; j& o" g% m9 N- b% n        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\0 [0 Y* A% q7 k7 O' \& t, q7 k, Q) P2 b
          endpoint = ["http://192.168.1.10:8082"]'> /etc/containerd/config.toml& i% q  o& Z( v2 E3 x
: N- K3 r9 N2 s" o. O

+ i$ x* f, }# H- X: U
0 \% N5 p; w: l: T) o& w& ]% D
  W( N" w/ p7 a: y+ a3 Ihelm upgrade -i --create-namespace ingress-nginx ingress-nginx/ingress-nginx --version=4.0.19 \
# t1 S( X$ w  X9 T6 [2 s, F0 w# A; U9 c# i$ U$ B4 I" i3 Z7 K
    --namespace ingress-nginx \. i( `' c7 j( g2 Z7 a
    --set controller.image.repository=ingress-nginx/controller \
+ c9 H& \. K0 _. P    --set controller.image.digest=null \% P2 t, `- b9 z6 s3 ~" ?
    --set controller.dnsPolicy=ClusterFirstWithHostNet \
# J/ Q8 E5 a0 D* B. X7 T. K    --set controller.hostNetwork=true \
0 U" K6 I0 v; K7 |1 ^  r+ a    --set controller.kind=DaemonSet \
% Z% S4 @# V% @4 a$ ~    --set controller.service.enabled=false \  A7 R) c! J8 a$ ~
    --set controller.reportNodeInternalIp=true \
1 N4 e2 L! y, }7 A2 ^    --set controller.admissionWebhooks.enabled=false \7 j8 A" a" Q9 Z. u4 O* b
    --set controller.ingressClassResource.default=true \+ W5 z+ D( X$ \( |
    --set 'controller.tolerations[0].operator=Exists' \
) \$ b, j: y# c$ H    --set 'controller.tolerations[0].effect=NoExecute' \% m* p" Q% X$ ~; g# J! {9 J5 M7 t
    --set 'controller.tolerations[1].operator=Exists' \+ z. ]8 u; Q. x8 F. _- }! f
    --set 'controller.tolerations[1].effect=NoSchedule' \
7 [& D8 ?; ^1 f+ J$ F/ G, |    --set controller.config.compute-full-forwarded-for=true \
' b& e& z9 H9 `0 C    --set controller.config.hsts=false \% H9 N6 e9 U1 Y4 g. m/ R
    --set controller.config.use-forwarded-headers=true# z! v- J9 w; g, [! N

* H) f7 d% I! b
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

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

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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