找回密码
 注册
查看: 35|回复: 7

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2025-1-16 17:19:41 | 显示全部楼层 |阅读模式
配置Containerd
- B2 s$ F# |& G在配置文件/etc/containerd/config.toml中添加以下内容:
3 A9 P! F  i" k/ ?2 {+ v+ i7 u* j  R, |0 D
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]6 Q2 l; M4 Z1 _$ k( @
...
% [' v$ |) n  ?! i  ~. S4 T  V) X9 M$ z [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
+ h  [/ z0 g. h% {! g: R( x   SystemdCgroup = true
" r9 u0 Z0 x/ z: y' w6 p0 v
( K) r, m  u0 ?重新加载Containerd配置并启动服务2 d% W8 C* M+ A
使用以下命令重新加载配置文件并启动Containerd服务:
% n0 y' a' z0 U& s# ~
9 h9 T, I" T' S. Q- |% U8 }; L% F: L) d$ a
sudo systemctl daemon-reload
2 y: M# C0 T  Usudo systemctl restart containerd.service
5 |3 J& d9 Y  ]- h$ K+ {; X* e1 y7 t6 l验证Containerd安装是否成功6 Y) I& a4 f6 `8 O. E; V
运行以下命令验证Containerd是否已成功安装:5 G( @" e4 Z; e7 O5 S. v0 D
, P* T% o, X# Z8 Y0 `$ J6 }
$ V7 X4 T4 H$ e( v. l# G
5 Q9 m' _0 E5 U7 Z7 F
sudo ctr version
/ _* g* T( J/ K6 I输出应为:
6 j( j0 t5 m0 K: X
  C0 G- \4 U1 k) K3 o) j. Y8 w! Q
codeClient:3 c1 M1 r* Z% R$ e) e2 t$ O/ b# z; M
Version:  1.5.5, N; G6 W/ A0 [  d7 O* a: f
Revision: 09a19cb71a40ac5ab8686245e5a5fb5e5d25c1440 I* I/ X6 P- U' ]4 I; p+ W7 _5 n9 Z
...: m4 H6 {" l% @& ]$ F5 ~

* v3 k: w1 T8 c- Q8 X5 WServer:& j; ]9 Z% J" i: l9 z0 F
Version:  1.5.5
+ r- b: w; F! E: W5 V+ R9 n% } Revision: 09a19cb71a40ac5ab8686245e5a5fb5e5d25c144
1 p0 A' j. X" z4 ~0 ?" F% O, P- B8 [ ...
# W  j) N1 Q2 V2 U以上就是在Linux系统中安装和部署Containerd的步骤,在安装和部署完成后,可以使用CLI命令或者API接口来管理容器和镜像,例如:
$ }( q8 D" m# o2 J: e& F! J0 `  Z# n" q6 Y7 `& F% X8 E/ b/ S- f

' P4 u6 i0 C, t  ]' Y+ @# g# j7 W
' m; q3 s4 y+ Y4 y) n; |# 拉取一个镜像/ ~2 h; J* _6 U" e
containerd ctr image pull docker.io/library/nginx:latest
+ M1 K" F3 Q6 j0 {$ ]: t, e
% H# E( X1 L) f1 N. b2 t; [; [$ _# 创建并启动一个容器
& o$ t, W+ P9 |. ^' zcontainerd ctr run --rm docker.io/library/nginx:latest mynginx6 C  i' v' C% d9 C& U

' C6 Y- g! P  Y$ t+ C5 W# 停止并删除一个容器; M$ V' g) {( f" Z0 ]' m
containerd ctr stop mynginx" g+ h, v+ ^4 T1 R4 i  z$ ]5 T
containerd ctr container rm mynginx, k! G- f3 ]1 q
Containerd还提供了CRI插件,可以用于Kubernetes集群中的容器运行时
: u0 Q+ q) ~6 ?  Z  _# R" b# B) H1 g4 }7 x% |
0 x3 [" t/ m' A$ t9 S
2 v6 `7 h- F8 Q! v, R, m. |5 p

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-16 17:27:10 | 显示全部楼层
#查看镜像:
8 D: `) r/ `  K! xctr images ls * s. G$ Z/ E0 z2 ?, E
--------
' o, c  ]# x# q* U& ]: k. Y8 L% ^: |2 g; Y% c
8 A" V) T2 v1 z$ d
##下载镜像- p3 X) Z; e! `1 x0 e" m
containerd 支持oci标准镜像 所以可以直接使用docker官方或dockerfile构建的镜像9 q+ R- [- t( ]% r* R  `2 `
: g2 P5 c; ?1 |# g2 m! E- U* u1 I
ctr images pull  --platfrom linux/amd64  docker.io/library/nginx:alpine
7 r; R% I2 ]8 Z' o4 H) R" e+ d# A3 ~9 q/ Y9 V+ r
ctr images ls
) o, o) g9 t$ Y. g+ ~% t
1 n$ j, l7 K3 S6 w7 j镜像挂载) g* b2 I4 f: N' i
把已经下载的容器镜像挂载至当前文件系统
2 ~9 g* w1 L) X6 Octr images mount  docker.io/library/nginx:alpine /mnt, Q3 V; f4 `/ H. F& H

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-16 17:29:46 | 显示全部楼层
1、Containerd镜像管理
8 ^1 S, `3 p, A+ t5 C+ J8 i1.1 Containerd容器镜像管理命令
+ B8 K9 `# [1 u: edocker使用docker images命令管理镜像
8 v* ?4 k" W: ^& ?  |- H单机containerd使用ctr images命令管理镜像,containerd本身的CLI9 k6 C* z& P0 {  q: \2 Q
k8s中containerd使用crictl images命令管理镜像,Kubernetes社区的专用CLI工具' k. q. ~& Z+ U+ e" s* j, w
代码语言:text) H6 Y. q) g6 @7 x
复制6 R9 |& u$ Z3 Y6 O
获取命令帮助
! Z0 d! ]* G0 N' ]. {# ctr --help
1 l( T, ]9 O8 gNAME:  @$ q, r+ _, X0 F6 i- v1 V
   ctr -, m3 Q1 ?( Y, T
        __
$ r# K9 o3 ]8 \/ x; M" _  _____/ /______
* `$ Z  g$ D0 O: K6 r. X- p / ___/ __/ ___/
, u6 h6 S( p1 @* Z/ /__/ /_/ /
: ^) p$ z+ Y6 c( n+ D' n( B; N\___/\__/_/
/ r; H. k4 j: q2 v
) u; e+ ~- D' U  y5 ~1 F......
5 C+ }9 Z5 X! v3 O6 \代码语言:text
4 C. y) D& f- @& K- H( b# B3 B复制  [: p1 r+ C* ?& C
获取命令帮助
' u6 _5 R) |  A; z8 Z# ctr images
+ C9 m: Q) A/ {" ^: z. m* O1 [NAME:
% |, h# u3 r: i! `2 o   ctr images - manage images
$ T  X7 H, N! z; \/ Q' A, f
7 g& T$ o1 K4 C( n5 t$ @, aUSAGE:
' D0 Y' N: o" l0 U/ E* P/ L   ctr images command [command options] [arguments...]
* |6 X1 I- w, e3 e
4 f" |3 H0 C: ]COMMANDS:8 |7 d, p7 y3 b+ Z3 t+ n8 r5 i6 j
   check                    check existing images to ensure all content is available locally9 }, b- A' H3 N- Q& E
   export                   export images1 L: m) Z4 R3 _4 f5 e) \
   import                   import images
+ n" m" a  Y' z* e   list, ls                 list images known to containerd
' i% h7 `! v7 V, Y0 ~   mount                    mount an image to a target path4 \7 K  Y% ^& Q4 i* b
   unmount                  unmount the image from the target* e6 L+ n% K( Y. a
   pull                     pull an image from a remote: {" D3 H. u: k3 ?7 @/ `0 i9 S
   push                     push an image to a remote/ X3 ?* p2 ?0 H8 X+ {
   delete, del, remove, rm  remove one or more images by reference
0 p8 Y0 Q- W& |0 R; n# \+ ^1 \; I   tag                      tag an image9 {5 }3 S( v/ ^( M# D( H7 {- z
   label                    set and clear labels for an image) V( {$ [3 ~8 ]/ F$ T1 I
   convert                  convert an image  F& @; g# f. S% ]3 @& \2 l
. h( g! T* s# {' f, J; _
OPTIONS:
+ j5 M2 w6 U7 W   --help, -h  show help
' D9 o, k* R0 B. R- j1.2 查看镜像% {( {' N: o, {: w! V6 B. }
代码语言:text
5 R2 A( T& ?/ {' r5 |* i$ i" A/ d复制; y0 ^* p5 U( w* g" I' V% y8 Q
# ctr images ls
* M9 Q2 O# V: L, mREF TYPE DIGEST SIZE PLATFORMS LABELS8 l8 `6 i2 k9 {9 X
1.3 下载镜像0 Z. A) E2 ?4 W7 k) I
containerd支持oci标准的镜像,所以可以直接使用docker官方或dockerfile构建的镜像
& S6 L8 x% M0 N; S/ y1 X- x: a$ l/ Q5 D0 u  u5 r
代码语言:text  S0 |/ [3 I! o+ t: D- x" U7 Y
复制
  t. j( V# K* q$ \- I# 镜像名不能简写,--all-platforms:所有平台,不加的话下载当前平台架构
& S$ q; z! k8 B; J( h9 P& _# ctr images pull --all-platforms docker.io/library/nginx:alpine
% Z* j$ }, l' N  A8 Y/ N# ctr images pull docker.io/library/nginx:latest
+ v! S: J: g3 a( E3 Z2 Z/ t* i0 B3 X/ x. y
# uname -a
4 H" ]' ]% D  F8 {: c代码语言:text
/ R8 E/ i. B2 R+ L1 Z1 |复制
+ b3 F  f2 h; g说明:
0 X5 r/ h% U5 I这里ctr命令pull镜像时,不能直接把镜像名字写成`nginx:alpine`
6 C% ], `* g! c/ B- X% m4 f- H& ?. P代码语言:text
: C- N+ B* m0 u% d复制4 @3 k) V* o2 ?. s) W
查看已下载容器镜像/ {, L. ~( ^0 q( ^- ^. ~
# ctr images ls- O0 W- i0 |- V8 O4 [3 e
REF                           4 K% l4 B; z) e3 l9 @9 U
! G' j! J, ^8 T2 ]
TYPE                                                     ( W# K, ^1 w0 c0 ]1 g

" E4 B8 `: w- T7 J6 A  r3 t+ d* MDIGEST                                                      
8 }2 O& F: K; c4 u2 x9 Q8 o7 i2 d$ m7 o" h  x+ [, N
docker.io/library/nginx:alpine: m; l: |1 x8 Q
9 v1 e, q  E' Q
application/vnd.docker.distribution.manifest.list.v2+json
3 F1 d' {- u* E. S( @* L" ?! }0 K( o5 Q) j# ~
sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3
0 ^( M/ B8 m- V7 f3 w& p% n$ J) N% }
SIZE   7 a! E  h1 v% ~+ j( ^
% C: W( {( M0 i
PLATFORMS                                                   & k. h1 K2 m6 i8 h3 g" U8 c. ~
1 n" K3 W1 n2 A; O% e* ]
LABELS- ?( [$ {3 U: L

4 b' o! ]+ N# {! T6 T8 W4 f9.7 MiB
6 A) l$ w: {9 q# w  f* D( u; H* j5 O4 `, b3 Z
linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x4 g1 O  e# n4 L( l: S

8 Y& X- @  v; W7 Y8 p9 U% f% v; B代码语言:text
, R9 }$ W8 D2 c3 G) k1 g1 M) A* ~复制
( ^! C4 U5 n3 |  N6 T' h指定平台下载容器镜像
9 d& A% |1 l# y# ctr images pull --platform linux/amd64 docker.io/library/nginx:alpine
8 {9 P9 L, ?! U' y/ \; q没有镜像是无法运行容器的。( [! m. J( |9 E2 K1 }- r
$ e* l. M$ |) F0 z$ P9 j+ c
1.4 镜像挂载, V* Q# W' v, a* T9 j2 F8 A. D3 ~
方便查看镜像中包含的内容。
4 V3 b& }) X+ s- p6 j
, J9 H+ l7 M& @- g, \+ l: I, z& i代码语言:text
& g9 x. ^. ~: W# B5 i2 `& v0 P复制6 V$ l9 D# S% `! E2 L
把已下载的容器镜像挂载至当前文件系统
; N( F, y7 K2 ^& P8 H# ctr images mount docker.io/library/nginx:alpine /mnt) d  \7 `+ u1 L
sha256:af2fcce448e2e4451a5f4796a9bf9cb5c9b5f88e0d6d10029cada42fb9d268ac
% j" @7 `' r0 }- ^) a/mnt; g( V- [: y& {4 v3 X+ }9 f
[root@localhost ~]# ls /mnt
. [: M. B; i/ P2 c: ]bin  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
4 _0 g3 [3 j* q% P1 V: f: ?代码语言:text+ d" Y( ?1 V: a' u- a% @
复制6 R9 w. v1 W! c8 {: T# F9 U
卸载
  U$ {0 s( u8 E/ q# umount /mnt/ y. ?$ ~' z% C* W4 n8 ]- Z
1.5 镜像导出3 b" p& M0 x8 h; L
代码语言:text, p$ s- ?8 i6 O. Q
复制1 f; e, p3 p, V9 X( A4 t3 F! e! h
把容器镜像导出9 Z8 C( l6 w6 h% q" Y/ |
# ctr i export --all-platforms nginx.img docker.io/library/nginx:alpine+ U  [: e6 |! P& o3 r) Q" q) ]
代码语言:text
8 q  ~$ Z9 _3 H( {1 _0 Z0 w. Z复制" X2 G; s7 v: a: {* R4 f
说明6 k1 y" a/ ?) p. v) s$ N) {
--all-platforms,导出所有平台镜像,本版本为1.6版本,1.4版本不需要添加此选项。! m  I9 C6 L' J: n
代码语言:text
6 l% }9 G: U9 P% h& X- n, ]7 e复制% W1 ^, W6 Y/ P0 X, ]
查看已导出容器镜像# c/ p- T9 W4 q& F9 v
# ls& L1 s, d' C% y  p
nginx.img
* m% ~3 P5 u: e. L
, I- a# X# h( U& O# ls -lh
0 k) s. R) Q; N5 X总用量 196M, ?4 o. ?% x& q% _9 _$ H. I! E
' A4 }2 q7 {6 |& {  m6 s& k
-rw-r--r--  1 root root  73M 2月  18 14:48 nginx.img
0 ?$ T# F+ ^2 A+ W" Y$ T$ ^3 V1.6 镜像删除  K; c* M6 ~% {. N0 `
代码语言:text
; u$ e3 p! F6 J" A& m复制9 M5 @' ]8 K  w; |5 {' B" ]4 t
删除指定容器镜像9 P* a2 M3 G; U# U
# ctr image rm docker.io/library/nginx:alpine
. x2 A/ u  Y0 d( K) Jdocker.io/library/nginx:alpine, j6 O' Y% Z/ ?- E  g( |
6 w, q3 S2 v/ v/ E$ E: O
再次查看容器镜像5 l7 y7 K' ]$ i* }, D
[root@192 ~]# ctr images ls
) x5 I& q7 o3 {REF TYPE DIGEST SIZE PLATFORMS LABELS2 h" A/ Y5 a- F( _. X
1.7 镜像导入6 R  d; w5 |$ S. {0 F; I
代码语言:text
# v/ u) X( u2 u复制9 o  E% c/ N( ?0 ]+ P' I
导入容器镜像
& y- ]/ d+ S! i% X2 q/ s: p# ctr images import nginx.img- {) y7 x* ^4 `8 {
unpacking docker.io/library/nginx:alpine (sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3)...done' d! W, E4 W: e6 h: U7 n$ a% P8 V
1.8 修改镜像tag
, n" k/ A# ^8 W2 \6 K" Y: k. K* m+ X代码语言:text; i' C$ o1 Z" o3 r9 e. H0 h
复制0 ?% l7 O: c* Q9 K- Q/ Y9 E
# ctr images tag docker.io/library/nginx:alpine nginx:alpine
) V! h3 q' E& U: s% D2 mnginx:alpine
  c8 v; W$ d$ _( Y8 e+ [) @! ]3 w; U6 U
# 建议修改tag的名称为:镜像仓库地址/目录/镜像名
: K  `1 U- b/ @# ]1 V7 i0 c代码语言:text; B0 L2 k1 r- _- j% H% Y, C5 p% t
复制
  R/ l" H9 Q$ _- R说明:
6 _1 E7 E; s4 v/ J3 o把docker.io/library/nginx:alpine 修改为 nginx:alpine
7 F* E5 ]& g% o+ f代码语言:text
5 E, h6 B0 {: C8 A% l* t! w0 R% I复制0 v9 ]5 ?, e' F* O
查看修改后的容器镜像9 T# U# U: ~6 T' i6 c3 ?7 b% P
# ctr images ls) I4 M3 J/ L& _# Y$ P; ]
REF                            TYPE                                                      DIGEST                                                                  SIZE    PLATFORMS                                                                                LABELS
5 U$ C# D  |: I6 P  @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 -) `( X0 G* a% ?9 l
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 -
$ v: h; `- N. P# U' e; f代码语言:text
6 l5 ]. M1 i- F% e6 M. E. g复制: P3 g/ L5 g6 [; P: x# T1 p
修改后对容器镜像做检查比对
0 s0 I, H- V5 m, Y) S' _0 K# ctr images check
- V* g$ F  l8 IREF                            TYPE                                                      DIGEST                                                                  STATUS         SIZE            UNPACKED4 h9 ]' S6 X1 `% Z2 T! ^0 ?% ^9 I
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 complete (7/7) 9.7 MiB/9.7 MiB true
9 Z2 r% o1 _& b( E& P" f" |( F7 M3 ~. X- I, L
nginx:alpine                   application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 complete (7/7) 9.7 MiB/9.7 MiB true. f( b$ M, C% [- w5 x0 B
2、Containerd容器管理
0 [( |3 _+ d2 {+ T# X+ l2.1 获取命令帮助  P7 I: f& Q8 r, [/ ~
2.1.1 获取ctr命令帮助( a( b5 |2 z1 S  V! y+ _' `$ {/ d. H6 V
代码语言:text% c$ z: A* w6 s( b" s$ b
复制. {: Y3 |% ?; b  _" n2 H$ l2 ?
[root@localhost ~]# ctr --help
! O% l& @0 T. r# YNAME:  X0 c. S6 x2 s+ T, ^2 }
   ctr -
- D5 d0 U% O# s. C/ t5 \3 s        __: o" ?! q# x: K2 T
  _____/ /______! K$ o) ?# V* q; s( L1 }  X
/ ___/ __/ ___/1 y. m* s4 K1 V) D# ]/ q5 K! z* P; c
/ /__/ /_/ /
, l, Q) A8 v! d( g\___/\__/_/# i2 u% T* p' R% J1 l1 `" J
- @* ]: I# `& L4 @2 m# {/ ?
containerd CLI/ _5 d0 |+ C1 W+ R- c8 s& J: I- X" C

. S+ Q8 M0 j# l. u% l5 ]
5 s4 ~1 J; J7 t9 P& {......
' R0 L1 g- U6 s2.1.2 获取创建静态容器命令帮助5 ^# ~5 G" B3 ]
代码语言:text
- C9 G2 {/ c# j' X8 a& l7 {4 ^复制
0 ~7 c4 @& D0 v0 s6 z) \# ctr container --help7 c  E5 a2 r1 ^1 h2 r- @; \- x
NAME:% Y. j+ V/ ]2 z" k% @" t1 X4 _
   ctr containers - manage containers
3 \' D5 G9 D" y" T! o
! k$ J# z" \2 h3 a3 ]) vUSAGE:2 T6 Q& @6 M$ T0 o: h8 x
   ctr containers command [command options] [arguments...]
: n4 h% c9 p8 A7 ?, s: ~3 w" Q# f  D1 p6 V3 z+ h" M% b4 w8 Q5 n4 X
COMMANDS:
! d& G, y  ^; A0 w5 f  ]   create                   create container
+ X/ {1 m8 D7 p& g) e" E   delete, del, remove, rm  delete one or more existing containers* W* B) k; l! B9 p( N' ?
   info                     get info about a container3 ?- }% o4 f0 I0 y% S
   list, ls                 list containers' `$ _; A( x- k* C
   label                    set and clear labels for a container
; @, \4 ?/ J  V! e; ^   checkpoint               checkpoint a container/ q+ W8 O; z9 u, N4 f
   restore                  restore a container from checkpoint/ N" o# g" C0 |; c% X

6 x8 y* D& O2 s' P. y% y+ U& S" fOPTIONS:
! ?+ ?0 a2 J$ D7 C# K6 Y7 `   --help, -h  show help
7 x- \) `# ~5 e+ G" C7 D1 V代码语言:text3 k9 M) E* A( s6 O8 s. C
复制
; A/ w+ }& T  W7 t& K4 Z, p! x说明:( d# s- E5 e; v+ I/ e" T
' m  M0 m; N* h$ |
使用`ctr container create `命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。这个 container 对象只是包含了运行一个容器所需的资源及配置的数据结构,例如: namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程(本案例为nginx)还没有启动。需要使用`ctr tasks`命令才能获取一个动态容器。
( W9 i) d; X4 c2 t* V1 x/ y# v2.1.3 获取动态容器命令帮助! m' _; w; G0 K7 k: k; l
代码语言:text
/ @. V9 F/ Q9 `! s2 Z- s3 `3 `复制
8 y  E$ v& D4 t+ c9 k# ctr run --help
% o" q" k8 ?! D; PNAME:
( ^  b+ i" y& v- E/ Y   ctr run - run a container
9 A' d% Q; y3 f! d- ^9 F" F5 {/ J1 H) Q% l! C; i0 b2 ~0 O
......( f% F4 B* E* p5 b7 r
代码语言:text, L* R: v7 y' A! n8 ~  y. H
复制: d' j( o1 M* `( h, B. _
说明:7 ~4 }8 T( O# E7 x1 S+ q$ l
使用`ctr run`命令可以创建一个静态容器并使其运行。一步到位运行容器。
& E; t0 Z/ f. m  z/ r: f' r2 r$ o2.2 查看容器& x( J  u9 L6 \* R' v- b
container表示静态容器,可用c缩写代表container# K6 k1 d1 s5 n1 ^6 O1 o2 J
3 R& ], f: \1 c. A
代码语言:text
: C/ r0 c6 c! q2 K复制6 a. w7 Y  w0 H, H1 m2 C! b
# ctr container ls9 d! A- r# {' @6 T* R% K4 }
CONTAINER    IMAGE    RUNTIME
1 h6 V; u, C7 A$ H) R( {2 g+ J& X" H4 }. [/ f0 C. Y

$ E! Z& I: p+ Q; _9 J代码语言:text3 N, s% Z# {3 j) S1 n$ v) q
复制
1 I+ ~& f: m! u9 c# ctr c ls
3 @' @# s/ ]4 N5 G- P+ N* ^# lCONTAINER    IMAGE    RUNTIME
1 y& i/ e- e9 u3 M, d! o6 E5 O以上命令无法查看出来容器的静态的还是动态的
) X) A  i1 u; p# f8 O' Z' W5 V) G2 v  U' X
2.3 查看任务
6 E8 @9 o" n( C' w! a+ f+ Otask表示容器里跑的进程, 可用t缩写代表task- D! B9 D2 y$ B/ \) Q6 J' B

9 D3 }, E6 x; `1 `代码语言:text
; w& {' F; n. i; s" m7 `复制
7 o7 R- ~* {7 T# ctr task ls
! H1 I' B9 A9 C: a5 O2 @* TTASK    PID    STATUS7 I3 J6 ?8 T; e4 b7 r
% V- o9 p/ v' q% {
! L3 I" v2 a( Q! z& L1 k9 s4 q
代码语言:text
' l* z% w3 u% x% U; ~: t+ F复制
' b& j7 k' @/ C' D# ctr t ls- C: U9 y% q& n3 t3 A& ~
TASK    PID    STATUS
" v& B) S7 e: P, D. |- C2.4 创建静态容器
; A- X) J4 r/ e% n! P代码语言:text) w  }8 a6 w7 K( t; v
复制1 `; W" l9 G: ~, d8 w
# ctr c create docker.io/library/nginx:alpine nginx1' c) w* A2 p5 [% z) I9 {- o
代码语言:text3 H6 G2 I8 z" A6 I. K
复制
: K* C% R+ d( e# _0 D4 Y0 A: |# ctr container ls  N. v3 C. s5 C' c
CONTAINER    IMAGE                             RUNTIME% J1 m% Z& j. m3 `
nginx1       docker.io/library/nginx:alpine    io.containerd.runc.v21 L; |9 J4 n2 n( J
代码语言:text
- [7 |& p" o; k0 [! c8 `复制. ]1 Y) ^8 E  e9 X- G
查看容器详细信息* b" g; A* q' H! ]. T
# ctr container info nginx1
6 [) t5 Z% t- ^1 i9 N& I7 s2.5 静态容器启动为动态容器5 W1 t- \6 q  Z5 P* ?
代码语言:text
$ u4 Y2 K" C4 g1 ?8 V. M- ~复制6 l: Z5 V) S5 v. X* q
复制containerd连接runC垫片工具至系统
- c( c, ^( s5 P7 r: W/ C2 \, w# ls usr/local/bin/
0 G) k- r- F# L9 }& z8 J4 z  bcontainerd  containerd-shim  containerd-shim-runc-v1  containerd-shim-runc-v2  containerd-stress  crictl  critest  ctd-decoder  ctr
: H( w/ ~0 U! c[root@localhost ~]# cp usr/local/bin/containerd-shim-runc-v2 /usr/bin/0 }- ?  a3 a+ K% ~
代码语言:text/ V. l. x/ a- v; ~: A: j- W* Y# x
复制/ ^, y$ b: p% |' L: x. B
启动task,即表时在容器中运行了进程,即为动态容器。6 ~8 ^9 k7 r" h8 V6 X) @4 C
# ctr task start -d nginx1
  z7 J" D3 Z% E1 V/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
- R: t  `: R! e# g/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/1 I7 M6 E8 ]" U8 B# d
代码语言:text0 `2 d" T# a7 z1 q9 X
复制3 b4 @5 C8 J: C/ b7 H3 q9 V
说明:/ t" O$ _5 a3 v' s* G9 l5 E
-d表示daemon或者后台的意思,否则会卡住终端
* ]7 ], d$ }+ b3 Y! m代码语言:text
! t/ M: z$ W/ ^1 |复制
0 |4 h1 {) g9 u( I) T" V查看容器所在宿主机进程,是以宿主机进程的方式存在的。  y/ }: C, s* n; p* ~& {
# ctr task ls
* ]7 H4 n% ]( n' vTASK      PID     STATUS
' y9 \1 j; ^! Znginx1    3395    RUNNING- S3 M4 s, M' T! p* `, Q
代码语言:text
$ {$ b& p3 n/ G, a6 P8 m  L复制: k8 |4 h/ T" c: y, p# f$ K
查看容器的进程(都是物理机的进程)4 C1 @+ B; K  S) s+ |8 w! B
# ctr task ps nginx1
3 b9 n/ g5 T, A& U1 OPID     INFO! Y' u# D( ~' k6 o+ j' }" V
3395    -- x( A. Z+ _" i
3434    -
# H* E( v. a3 o- ^' _" b4 `代码语言:text
" N- B& p, s7 j% f5 j复制
0 o0 V5 D" I3 z' [/ g物理机查看到相应的进程
0 J" u( R9 W) U0 e6 R$ i' [# ps -ef | grep 3395/ I! n1 ]9 P' T/ @( N
root       3395   3375  0 19:16 ?        00:00:00 nginx: master process nginx -g daemon off;
0 D$ o/ z0 D8 _' D/ e& d2 K  H- x9 u) y101        3434   3395  0 19:16 ?        00:00:00 nginx: worker process: X& n% A& ?( s) b- H3 b. I
2.6 进入容器操作
3 Y9 J4 f6 J& [) [8 @代码语言:text
" F6 z, Y  s9 a( t1 f0 c9 {复制7 @  h. H2 j: c9 [1 f
# ctr task exec --exec-id 1 nginx1 /bin/sh5 x5 E  D/ ?( B% F1 L

- S# P* k5 j7 ]% m2 m# ifconfig 查看网卡信息6 l& m' l4 e5 j% \. ]; s  v
) E: z' |1 J" w! l  g
...
# B# w, `  m: E/ Z# J( i: Y+ b9 x. \4 f- h4 k8 d
# curl 127.0.0.1 访问本地提供的web服务2 O+ ~0 i( E' e' _
...% ?/ c0 n/ A% }. J/ [
代码语言:text
6 X  c0 E+ ]" R2 i复制
/ a1 u: z) P0 G9 g% B/ R说明:
5 f$ a0 @( v) e* g: ?* ^" y为exec进程设定一个id,可以随意输入,只要保证唯一即可,也可使用$RANDOM变量。
' f+ v" P) m4 B0 B4 [' G9 n2.7 直接运行一个动态容器* M5 u" Q4 _: w8 p" T
代码语言:text: E" M0 f) e6 Y7 h) v
复制
& f! S4 j* X5 v6 T; j- L4 p0 {# ctr run -d --net-host docker.io/library/nginx:alpine nginx2# S. O8 d, A8 e
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
& B% G9 [7 w' o# Z, Q5 y( o. s# G/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/  R. B& y/ b: U5 A
代码语言:text
1 {/ ]/ |- e- W/ g% B' D  E1 Q复制  u9 b, k+ N, L2 P  N6 n9 ~0 M) b
说明:' [, O, |# o  F$ j* u9 b. U/ z% M; b5 c
* -d 代表dameon,后台运行
% f$ W* \" c6 U" K- i* --net-host 代表容器的IP就是宿主机的IP(相当于docker里的host类型网络); u8 s, T, F# Y/ W
代码语言:text6 ?. [) k8 L( T4 l/ l
复制
6 B1 U7 k0 @$ k3 ], X+ B- R) e8 P查看已运行容器2 j# G! o; I" e8 D" f
# ctr container ls
2 p; Q* x7 V5 z( zCONTAINER    IMAGE                             RUNTIME9 ?) o) J7 y3 R( U4 H9 m/ e
nginx2       docker.io/library/nginx:alpine    io.containerd.runc.v25 P3 r7 b) Y: A5 k& B( v
代码语言:text9 b5 r$ w9 ?; c6 f& {& d( c0 a
复制7 z% Q/ s  `9 D* t. W0 B0 [. M
查看已运行容器中运行的进程,既tasks( `* T) z6 K7 U
# ctr tasks ls
9 Z, L* N& s3 ZTASK      PID     STATUS& O3 }$ @6 y# `; U* D
nginx2    4061    RUNNING; q3 P' _8 o- q$ r5 x
代码语言:text
0 B- ]. y& f) Q" v$ ?7 W3 S+ w8 w复制. M& h7 {8 l! V
进入容器
8 s- P; |6 a! t7 R7 W, Z5 b# ctr task exec --exec-id 1 -t nginx2 /bin/sh2 A/ }# [! z2 k: x2 s
代码语言:text
& a3 _! U4 d8 N  H) r复制$ L3 p* y) M$ ~
/ # ifconfig 7 D6 M, W% J. Z0 G3 ]& d. _4 H
ens33     Link encap:Ethernet  HWaddr 00:0C:29:B1:B6:1D& v) j- [4 `' |9 G* c" l. t
          inet addr:192.168.10.164  Bcast:192.168.10.255  Mask:255.255.255.0
, q0 f' n: e2 q0 o8 l          inet6 addr: fe80::2b33:40ed:9311:8812/64 Scope:Link2 \$ b# Y2 k  J8 a0 g! Q
          inet6 addr: fe80::adf4:a8bc:a1c:a9f7/64 Scope:Link- W, J: y# O0 M) w3 A& }
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
. p6 {: P; E3 S7 V1 T          RX packets:55360 errors:0 dropped:0 overruns:0 frame:0" G; B. C# C" U5 f5 j0 U0 h
          TX packets:30526 errors:0 dropped:0 overruns:0 carrier:0
/ S, P% r" E$ y8 e- n" D  v          collisions:0 txqueuelen:1000+ I& s$ U) L" t. Z: w3 z9 |# s9 E' N3 r
          RX bytes:53511295 (51.0 MiB)  TX bytes:2735050 (2.6 MiB)* V6 W2 |! l" k* \1 e6 |

: S* a( o" h0 z( s& Klo        Link encap:Local Loopback8 P8 D" G1 f/ U' e* R
          inet addr:127.0.0.1  Mask:255.0.0.0- U( ^$ [/ @  l' O$ j1 W
          inet6 addr: ::1/128 Scope:Host
1 B; L: V. D8 N* }/ X3 Y5 g" @/ p          UP LOOPBACK RUNNING  MTU:65536  Metric:1
: \8 N( _$ P. i+ }* Y* _          RX packets:68 errors:0 dropped:0 overruns:0 frame:0" q: _7 V& ]; @# P" N' R$ E6 T
          TX packets:68 errors:0 dropped:0 overruns:0 carrier:0. U& h5 Z0 Y; \4 O
          collisions:0 txqueuelen:1000$ Z- `4 l6 v" S! ]7 G
          RX bytes:5916 (5.7 KiB)  TX bytes:5916 (5.7 KiB)' N: c  g4 y1 ?5 H1 @4 e  O
9 c" b2 j3 |; l+ A% n, a: B/ |
virbr0    Link encap:Ethernet  HWaddr 52:54:00:E9:51:82
) ^* A% ~# W2 ]( t& [          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0! h7 o# ^; A4 D- c
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
, A" f" ?$ w) V( |9 |7 g          RX packets:0 errors:0 dropped:0 overruns:0 frame:0: ?- C. e. ^- {- c+ _
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
; m8 C% ~$ k1 Q1 W) z8 ^% _          collisions:0 txqueuelen:1000
9 b/ o4 @6 h" S, r& W          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
1 R5 [% `& |6 ~8 n+ I) n代码语言:text
/ e3 }2 {5 d& t复制
% n7 G9 d) x& N2 W% p为容器中运行的网站添加网站文件
1 c2 H, g9 o/ S4 y/ # echo "nginx2" > /usr/share/nginx/html/index.html
& _6 k3 ^: c2 ~7 U( k$ t/ # exit/ l4 {4 S  i9 Z, e: h2 Q
代码语言:text
% d+ ~# V$ f3 U, {: a. L6 |复制$ y0 p6 u; M, [
在宿主机上访问网站
' D. G6 ]# H4 |$ c[root@localhost ~]# curl 192.168.10.164
0 g5 z# g% y2 {8 N# Vnginx2
6 [# Y& I+ ^7 O: h& z2.8 暂停容器
' _) ?9 r3 H8 Z, U7 Q1 r代码语言:text* P5 X2 R* c  B" X, n  _8 |
复制; B, N6 I# V" X5 A- h& i- n& V! A
查看容器状态
: A8 F  X% I; @; M  |5 a# ctr tasks ls& E  `- ~4 t6 D2 Q- y9 [3 Q
TASK      PID     STATUS+ P) [1 j$ G0 H& _: A. U  @  e; F
nginx2    4061    RUNNING
: I; c6 {0 P- E0 B8 C* t6 t2 u代码语言:text: H4 A" m9 ^) B; w5 @+ x
复制
: w9 I1 \* ^% L! g% j- o1 H' p暂停容器
- f3 F0 i2 k( x# ctr tasks pause nginx2
- C9 C! s( b- u6 y' U代码语言:text( {5 j3 k0 b9 K
复制
8 t+ N  P( c/ n0 s再次查看容器状态,看到其状态为PAUSED,表示停止。
$ M4 {1 S( q/ n/ v9 n) w# ctr tasks ls
9 R; U' H: r. U  G5 d- z; n% rTASK      PID     STATUS4 y2 e+ v7 Y% H* v1 J4 b& Q
nginx2    4061    PAUSED9 Q, t# o" Q7 @1 n/ c
代码语言:text9 [' H- q1 y4 N9 a+ Y: i3 S
复制
* L7 C& t8 r5 P2 I& r  f" @0 `[root@localhost ~]# curl http://192.168.10.164) c& z# j( R9 R3 r2 V' Z2 P
在宿主机访问,发现不可以访问到网站+ h. d+ c8 c- ]. I2 S
2.9 恢复容器
8 a9 b, z' b8 [2 E" ]1 U4 b2 z- \- s! L代码语言:text# Q* }( ~, B6 \5 L+ q  ?2 n+ ^+ S- s
复制3 w  C, H1 f9 Q& F# F
使用resume命令恢复容器
+ n9 |3 _& |, S+ [# ctr tasks resume nginx2
5 O7 E8 H7 a' m: Z% V9 m# R代码语言:text0 h( h$ k: Y  n
复制; K. B# N4 v7 u2 V# O8 N2 y
查看恢复后状态8 ?' K) D) B% j* N- l7 A
# ctr tasks ls
, D4 w/ y' f; p" ?8 K0 Z) VTASK      PID     STATUS& ?$ u6 W0 o" x, I' {
nginx2    4061    RUNNING4 @- Z) S  V' c, a
代码语言:text) y2 U' N7 A# i, r. g/ U$ n! ~
复制
2 j. l0 |5 \* {* C: k! e6 k在宿主机上访问容器中提供的服务
( Z+ E/ I+ e: b4 \% {# curl http://192.168.10.164+ L' }+ n/ D2 S
nginx2
' _7 T% ?. e6 L4 |* [4 b+ J2.10 停止容器6 T3 b) s5 o2 b* _' x
代码语言:text
4 {8 M/ ^# E! f- ]7 r+ M复制
% _: b, {2 |* ?$ z# ctr tasks --help
: P1 G1 t& l* I......
* Z/ p1 N: C3 Q7 a- w$ s代码语言:text$ y* o5 P# }; m# R* y' E; b
复制* H6 g& O  l( h& w2 {
使用kill命令停止容器中运行的进程,既为停止容器& J: g% x$ Q/ X; y# y1 V/ _
# ctr tasks kill nginx2
3 ?) h1 J  [9 ?代码语言:text
& E2 n8 Y+ [' v# P! `7 [! N复制4 F. c6 O( M7 e3 a+ p" B! [& p
查看容器停止后状态,STATUS为STOPPED
/ O# [- ?2 Y8 O8 c: s# ctr tasks ls
3 K) u+ X- R% a$ a0 ZTASK      PID     STATUS' Y( _2 R1 {7 H  N( b0 R
nginx1    3395    RUNNING4 m9 p# D. a8 Q+ C* W* ]$ s3 K
nginx2    4061    STOPPED
1 I1 t/ R- e' g$ B" G2.11 删除容器
+ o; S  u0 L- `$ ^4 c+ P9 K/ Z代码语言:text' t, ^' U* q* Z/ d" `; L
复制
# H7 Q. @% k% w4 Q0 v' ^# ctr tasks delete nginx2& F" M; k5 i! K9 y' L& ^
必须先删除task,再删除容器, p! w$ q9 X% E
代码语言:text
! x* B% o6 x" [! z+ c复制
2 h# {$ K  ~9 S0 q, p查看静态容器,确认其还存在于系统中
' |# W* {! L+ E; t# ctr container ls
# o. F! V# ?5 }" oCONTAINER    IMAGE                             RUNTIME) n  [& N" z/ `2 C  `
nginx2       docker.io/library/nginx:alpine    io.containerd.runc.v2& S9 J' U+ ~3 W  J* Y9 W
代码语言:text. }3 ?- R6 ~1 @/ N
复制
. ]7 P2 e9 d2 i9 G删除容器# G* v  G$ X# t1 L) }
# ctr container delete nginx2
7 }( n+ K- Q+ G3 A& ^3、Containerd使用私有容器镜像仓库 Harbor
, `9 H5 z. E8 V. ?* e0 }# D3.1 Harbor准备
! A3 T+ p- r8 D) E3 L7 z' h; X
! C- L) A% m: r4 c
5 V( [, H3 p+ |! [- N3.2 配置Containerd使用Harbor仓库" X2 u/ ^3 r1 p" e
3.2.1 Harbor主机名解析1 T' [+ g1 {; I) ~! }) s9 ?3 ~
在所有安装containerd宿主机上添加此配置信息。
; t4 Q1 l7 w- y! N) p' U- X! N) y# N, a0 [% p% ]
代码语言:text- a  u. k7 d$ t, n7 u3 y# y& ~! t; _
复制
" U6 `% Q- V1 ^- s% w# vim /etc/hosts
8 a0 @" X8 k5 f$ m, I# cat /etc/hosts$ J+ U- A) E% r
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
- p. Z  X0 M% h! Z$ X: I::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
: a/ E! V' q) c8 o$ @! X192.168.10.165 harbor.kubemsb.com: N( |! ?7 d& N: \6 w. G
代码语言:text
5 @3 k3 R7 q. U% x' x6 B: W/ m/ [复制
& M" k! I" Z' H# z$ t* t/ D说明+ d: S6 _0 O/ G. S9 T+ B
* 192.168.10.165是harbor的IP
0 L$ k% B3 ]9 b) |/ X9 \8 L2 J( X1 j
* harbor.kubemsb.com建议用FQDN形式,如果用类似harbor这种短名,后面下载镜像会出问题
  f0 N. G. U# @2 y- }3.2.2 修改Containerd配置文件4 g  S& S, K$ ]- a2 H7 x4 r  z! L
代码语言:text  l: l. k" S: ?
复制
8 @# n" }1 X7 N) \2 l此配置文件已提前替换过,仅修改本地容器镜像仓库地址即可。) M( O' n3 M5 |0 e9 N# R2 N* {
# vim /etc/containerd/config.toml  C' M5 I* `( @: d/ y# X, U/ M2 F
# cat /etc/containerd/config.toml
8 s! H! O: \3 W2 `root = "/var/lib/containerd"
& B! E  H3 S9 U# l/ Vstate = "/run/containerd"6 q5 z  x3 \3 F" E% _( F8 T
oom_score = -999
- ]4 {4 ?% G; F1 n# h$ t0 p9 B  D( Q
[grpc]
$ h2 ?. ^5 n9 |, J* ^( {  address = "/run/containerd/containerd.sock"# W+ A" z% {1 o, b1 S# ?9 [
  uid = 0! Y7 o+ Y4 L- Y6 a( ~
  gid = 0, _  q* ?4 i) P! u. }* `
  max_recv_message_size = 16777216
/ t; P) R& ?$ v5 O  max_send_message_size = 16777216
0 b- z# t- H8 T8 s& p9 ]& P1 K! _& A. {! s5 {) G4 \! C7 U1 w7 ]! w
[debug]
* W+ f# ?# S$ m* R. h  address = ""2 `$ ^/ H! i* Z! [- w3 i
  uid = 02 x3 j" E& d$ R$ l' O
  gid = 0
7 E! Y2 V, D% c4 v0 }" G  level = ""
' d9 b1 Z, W5 J6 U0 s1 G1 Q" S+ d) @. l+ X
[metrics]) e4 {' ?% y3 I' S% G
  address = ""
" O" V" R" O  b9 S' G; f" @  grpc_histogram = false
0 @' t6 K3 g0 p: l, i5 Z: `- E+ V( A0 |' s& S
[cgroup], E' N# u1 T* R* ]
  path = ""
# D, f$ n1 {. s
# ^, E) F$ _% I[plugins]. P9 t* _: r, G
  [plugins.cgroups]
+ ]4 K6 k. R; T) e' g% Q* {7 ^0 d; _    no_prometheus = false5 ~& Z0 N% E* d
  [plugins.cri]8 B* |3 d0 D- l1 |# w. H4 P2 T
    stream_server_address = "127.0.0.1"9 ]  T6 ~: Q& ?9 k3 b
    stream_server_port = "0"
/ G& b( E4 E2 T7 z. I4 y    enable_selinux = false
! Q2 _: t5 w: n& N, O2 }. ]    sandbox_image = "easzlab/pause-amd64:3.2"' k7 y! l# }7 y5 L: X& C
    stats_collect_period = 10
8 a" G& A; X7 I    systemd_cgroup = false
  S4 p/ U' b4 A    enable_tls_streaming = false, g  a8 d: n+ \
    max_container_log_line_size = 16384; P4 c3 J2 [. j3 r* _# Y% B) I- z  z) p
    [plugins.cri.containerd]' M" |* t( ]$ h6 d. h
      snapshotter = "overlayfs"
$ Q; y1 x# W/ o: z: H. \      no_pivot = false8 b0 k$ ^6 l8 A, N* O# c* A
      [plugins.cri.containerd.default_runtime]6 Y& C+ p/ {2 R5 v, e
        runtime_type = "io.containerd.runtime.v1.linux"
4 `) Q% T7 g5 X3 V, h        runtime_engine = ""# R, u. F/ q3 S( J, R% ?) t7 P
        runtime_root = ""2 a; w. F2 z2 w1 R
      [plugins.cri.containerd.untrusted_workload_runtime]
* ]- r6 Q: F( L( O        runtime_type = ""
* Y3 m' a) \' ^- M: Y        runtime_engine = ""
( q1 _# O& F/ b  f$ n        runtime_root = "", L7 A1 U3 J5 H; E& Y# U+ W
    [plugins.cri.cni]
4 n' |/ _- z  E9 I      bin_dir = "/opt/kube/bin"
( W1 `$ O3 a7 f, v5 H0 Q& p      conf_dir = "/etc/cni/net.d"* O& ~0 e1 D3 p) X8 J+ u+ `
      conf_template = "/etc/cni/net.d/10-default.conf"  q7 O' G7 _: Z
    [plugins.cri.registry]
; d+ h0 ?1 h, r8 [# `* D  V      [plugins.cri.registry.mirrors]
8 x  D5 ?: ~! a6 D0 {3 P, ^        [plugins.cri.registry.mirrors."docker.io"]  ^2 F7 M6 F) O& k
          endpoint = [% M' \$ l) r- Y  l
            "https://docker.mirrors.ustc.edu.cn",
. Z: {# @0 G" o, A            "http://hub-mirror.c.163.com"
5 W8 I6 `0 p  \( u  F+ C: v          ]9 O# k9 S5 j9 n5 ]( ]8 l* @
        [plugins.cri.registry.mirrors."gcr.io"]
; i, _6 E8 l; l4 W. `5 L/ }6 U          endpoint = [
* q: O. A0 c% B            "https://gcr.mirrors.ustc.edu.cn"
1 L& ]0 _) Z5 C2 H& h- \          ]2 A% n( {6 D/ L8 k
        [plugins.cri.registry.mirrors."k8s.gcr.io"]: O6 P# O: U" b
          endpoint = [7 g+ H6 }* y* q' R5 b
            "https://gcr.mirrors.ustc.edu.cn/google-containers/"7 Y+ c% @  A8 {9 W* W8 `5 a
          ]
0 W4 {$ S& a% N" j8 p, g" W        [plugins.cri.registry.mirrors."quay.io"]
5 B4 T0 H5 g" \& o" p          endpoint = [
0 I$ |! P5 S* I$ v6 c% x" O            "https://quay.mirrors.ustc.edu.cn"
! I6 s, U2 e% w- K1 y3 Z          ]
) X! x: K/ u9 `7 x5 s! @: e        [plugins.cri.registry.mirrors."harbor.kubemsb.com"]   在此处添加,在镜像加速器下面添加这一段6 i9 O# }7 z5 t: v' S
          endpoint = [
; J0 s$ h3 ]. n' D' `0 C* G            "http://harbor.kubemsb.com"/ c. M3 n  A6 T+ W8 K
          ]
2 {7 x! t" k6 {+ b+ F$ Z2 N    [plugins.cri.x509_key_pair_streaming]% M9 r" s- P  }1 E# X( F" q' Y
      tls_cert_file = ""9 j3 X# T5 F7 d
      tls_key_file = ""! [& L. A  b, p0 ^* ~: N2 L
  [plugins.diff-service]4 I0 Y/ d3 N4 M/ B* n; Y6 a
    default = ["walking"]% T4 s9 A' L7 Z
  [plugins.linux]
" Q+ K$ V  n( B+ n) m    shim = "containerd-shim"
3 k" G* c! Q, k* G6 ]. M0 H    runtime = "runc"# K/ }0 a$ R& C" ^6 b% ]
    runtime_root = ""
# X" G2 u! g0 [( O, o    no_shim = false: n( t9 [0 [8 @( t
    shim_debug = false
( Z2 Y" R  U4 p+ }. ?/ E; o  [plugins.opt]/ u+ y1 W- @2 A" w
    path = "/opt/containerd"
3 y  q! o/ r+ A, p* q  _3 P" b$ ~  [plugins.restart]8 ^: Z+ Q' `/ F8 e5 @2 L
    interval = "10s"
5 h  N" P8 u  L& g0 D7 J8 J; A  [plugins.scheduler], g. ~' r* }  p( V( e, s
    pause_threshold = 0.02; v3 u9 [/ E& N( D: ]: M
    deletion_threshold = 03 E: \2 ^0 T: i$ q4 b  k4 @
    mutation_threshold = 100* F" t, b; t" F& e6 g4 r. a/ x
    schedule_delay = "0s"
% j8 s& a9 L- v% l4 i    startup_delay = "100ms"# V4 R9 Q( a* S& m* `
代码语言:text
+ O4 v& F& r) F2 r1 @" {# \6 T. h" r复制) @7 T/ j; K) A" x/ H
重启containerd,以便于重新加载配置文件。
& M$ u5 G% X" R7 `5 x7 p# systemctl daemon-reload5 ^# j% v( F1 y" S% D- O/ s- M! X: V
# systemctl restart containerd
' F* R5 a8 Z6 @, u3.2.3  ctr下载镜像
' |6 e# }, ]  V* b. ^) _- `代码语言:text5 h7 C. I& Z8 x: V
复制* L" j4 S! S. M+ O" p
下载容器镜像
; _9 j( `2 l9 r  W5 i/ a# ctr images pull --platform linux/amd64 docker.io/library/nginx:latest$ M3 i& D; d, Q  ?- r
代码语言:text: m/ \0 U3 E6 N& @5 T2 I7 a
复制. t; K- c+ I4 w4 a
说明:
. D. T( i1 g( G" b* --platform linux/amd64 指定系统平台,也可以使用--all-platforms指定所有平台镜像。
. x) `1 j% D8 R$ Q8 @8 z( Z" |# E代码语言:text) Y& v6 K, ]2 \6 W1 |
复制+ h- ~' x9 N% N/ s& N0 x. ~
查看已下载容器镜像9 V! ?5 t) |( Y
# ctr images ls
: v9 v+ C- J, b! UREF                              TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                                                                          LABELS
1 P3 c' U& _! q% w7 N1 f4 Z0 d% [. q- A4 k2 k
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                            -* o+ s* J2 r% f+ O, z: U% F7 Q9 C  ?) M1 @
3.2.4 ctr上传镜像
6 y9 P( M! Y( k( d上传到Harbor library公有项目
  b8 ^1 p$ o, ]0 G( H/ x
) P! y- p+ J; s" X. _6 y" x/ G  l代码语言:text
9 F; o% U* U* r5 H复制
: p  k4 a" |* J( Q重新生成新的tag; R0 ]; G( y/ A) y4 {7 e' m# k( }
# ctr images tag docker.io/library/nginx:latest harbor.kubemsb.com/library/nginx:latest* {5 w! w" [  s1 G3 \2 L/ c
harbor.kubemsb.com/library/nginx:latest) q- o' _1 O* N0 A3 X' W: Q
代码语言:text
8 Y: c2 x5 c& g0 t5 e! T复制% T% D; n2 i! ?. O- K7 s/ q
查看已生成容器镜像
' ~0 F( k0 w& C# ctr images ls0 P- j& v% F' y' ~7 t: x0 s) e  W7 F3 y
REF                                     TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                                                                          LABELS/ ~! U8 L) t. @+ u. a
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                            -
( U+ b. j2 n" [; \# jharbor.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                            -
: z1 ^: U5 ?% T5 c# j4 U$ u0 z代码语言:text$ c  ]# c+ \( r
复制
. k/ @1 }# g0 n推送容器镜像至Harbor0 l& d, Q. g7 }
# ctr images push --platform linux/amd64 --plain-http -u admin:密码 harbor.kubemsb.com/library/nginx:latest
# ~: D- w8 A9 H" d: N( @8 Y4 u; p代码语言:text
0 x( K3 V. n) ?3 \& m/ ^  v复制/ S9 P3 ^: L. G4 s0 G
说明:8 t% ?$ k6 |  C8 m+ C5 u: G4 G

1 ^9 b2 u' j9 x7 Q# `* 先tag再push
/ [% A" P' D! A: ]* 因为我们harbor是http协议,不是https协议,所以需要加上`--plain-http`% N! ^9 ]% E1 A. Q$ h# E
* `--user admin:Harbor12345`指定harbor的用户名与密码" G1 U3 h* h; h) |. N/ t- W' y
代码语言:text
4 E/ d' z; z. I1 a$ B6 h! |) D复制
1 X1 ?5 j7 M3 X; u4 z输出:
6 P7 _/ ]8 {% Y  n# E: Fmanifest-sha256:0fd68ec4b64b8dbb2bef1f1a5de9d47b658afd3635dc9c45bf0cbeac46e72101: done           |++++++++++++++++++++++++++++++++++++++|
( W& s# f) i; O. z& Z2 j9 \$ e( bconfig-sha256:dd025cdfe837e1c6395365870a491cf16bae668218edb07d85c626928a60e478:   done           |++++++++++++++++++++++++++++++++++++++|0 t2 Q2 r8 G! q0 |
elapsed: 0.5 s                                                                    total:  9.3 Ki (18.1 KiB/s)% }1 g8 h' w7 Z$ ]2 ?. X
2 c# D; p) I4 }( @
代码语言:text
  t1 f/ B7 L- Y+ ?8 i0 J8 T5 v复制
3 S9 N* J: ^( p) D; D2 n下载已上传容器镜像
( [1 ^" T, Q; V# ctr images pull --plain-http harbor.kubemsb.com/library/nginx:latest
) ^1 o  L9 \# \! {+ w+ _
* M8 @+ L* _4 Q& i

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-23 13:50:42 | 显示全部楼层
Containerd 常用命令
9 a$ q3 c( t' ^( c& p' u( p
( b9 d$ }5 M8 o) i& l; [- o在 Containerd 作为容器运行时的情况下,可以通过 ctr 工具或 crictl 工具来与之进行交互:
% @6 U3 ]) {1 Bctr 是 Containerd 自带的客户端工具
2 D! m1 C  O' E0 u/ c' k4 s5 D: f
crictl 是 CRI 客户端工具,比较接近 docker 命令2 `+ t9 t$ a! U

% B  o: _  P: g7 E* J- U* ~* A! K此外还有 nerdctl 等类似工具,以后找机会给大家详细介绍。
2 g% ^% l- t5 J, {+ J6 w- ~! I9 _4 F3 q2 W- W

. O+ }1 _( A. u- s, V0 m! R
# Q8 W2 ]- `! L: d0 x) x- ?- ~3 D4 m1、ctr 命令( @7 ~( N5 b0 x1 }

6 {. p3 u$ K6 F* E# 镜像操作命令
  p: B+ b0 M# n( t3 z3 Rctr -n <ns> i xx                         # 镜像操作命令格式,默认 ns 为 k8s.io
  }, _: M- {9 Q" D8 Z+ D% R2 w* Bctr i ls                                 # 查看本地镜像列表,同 docker images8 X' S$ f0 W. s2 J9 D4 S
ctr i rm <镜像ID或镜像名>                  # 删除本地镜像,同 docker rmi -f <镜像ID或镜像名>
& m' T$ {6 Y7 b# u6 f4 V( u9 W/ jctr i pull <镜像名>                       # 拉取远程镜像,同 docker pull <镜像名>1 w! Z9 J) I. ^- c! f' m
ctr i tag <旧镜像名> <新镜像名>             # 修改镜像名称,同 docker tag <旧镜像名> <新镜像名>* G1 F: `- T$ f6 a: G% _
ctr i import xxx.tar                     # 从本地文件导入镜像,同 docker load -i xxx.tar& H3 p: D  i  u& z7 }4 `) c. s
ctr i export xxx.tar <镜像名>             # 导出镜像为本地文件,同 docker save <镜像名> -o xxx.tar" {5 _8 X& Z0 `6 v
( H+ U& K+ z1 ~: N. ^' t& u
# 容器操作命令5 I5 R4 g. {& D0 i, {0 {1 @  Q
ctr -n <ns> c xx                         # 容器操作命令格式,默认 ns 为 k8s.io7 [$ c( _: }: J* l& Y
ctr c ls                                 # 查看容器列表,同 docker ps -a,查看所有容器
! `6 h3 u4 U4 Q$ L; b. e! Lctr c rm <容器ID或容器名>                  # 删除容器,同 docker rm -f <容器ID或容器名>
+ p! [. Z% [& u  C  ^/ I; E9 Xctr c info <容器ID或容器名>                # 查看容器信息,同 docker inspect <容器ID或容器名>
: [# B4 ^% S+ v) Mctr c create <镜像ID或镜像名> <容器名>      # 创建容器,同 docker create,仅创建容器(容器并未运行)
7 k+ \  x  Q5 e" i" ~5 o
9 `- W: v- F. r% m. t# E! H2、crictl 命令
- k# F9 y9 G% |$ p+ j# 镜像操作命令: r9 T1 s0 Q" I( C5 N% j6 z
crictl img                               # 查看本地镜像列表
0 s" U( z* C* R; b" kcrictl pull <镜像ID或镜像名>               # 拉取远程镜像2 Y/ o/ h/ E2 K: Q6 _- n
crictl rmi <镜像ID或镜像名>                # 删除本地镜像
% Z% _2 f4 K, R% d5 { 3 p  x# j. {; a5 \: U% k
# 容器操作命令
4 L) N; _) B8 x5 L7 a0 L, [crictl ps -a                             # 查看容器列表2 Q' W% o7 P8 h3 ?% v" i
crictl rm <容器ID或容器名>                 # 删除容器
* [3 s* r, E$ m4 g4 gcrictl logs <容器ID或容器名>               # 查看容器日志5 L( S& A) ]+ V5 _
crictl stats / statsp                    # 查看容器 / Pod 资源使用情况

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-23 13:51:15 | 显示全部楼层
# AMD架构
% z4 [/ {# A& h# Uwget https://github.com/containerd/co ... -linux-amd64.tar.gz2 M4 k, y- }7 ]
tar -xzvf containerd-1.7.21-linux-amd64.tar.gz -C /usr/2 \3 q" J6 w. P; }5 P- l
  ^2 k; s. ?/ V/ @
systemctl daemon-reload! U# J9 @7 G1 S" D) g* ?3 d
systemctl enable --now containerd
) O2 p+ \) m' C" \% T
" p$ E- b& q* Z2 `1 L* @) N1 }===================================================================================
. J1 k0 P& C" R# ARM架构* N5 ^5 E8 ]: I# X
wget https://github.com/containerd/co ... -linux-arm64.tar.gz
! ~, o+ q- I# Y0 @tar -xzvf containerd-1.7.21-linux-amd64.tar.gz -C /usr/
* k! f' Y7 z6 E1 c8 z. M4 b ; A! o: l6 L( Q) e8 Y' o9 _: c
systemctl daemon-reload
9 r; W8 H6 j/ h# z, T6 wsystemctl enable --now containerd

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-23 13:51:29 | 显示全部楼层
# 拉取一个镜像
% G( D6 V" l# v. `3 ?containerd ctr image pull docker.io/library/nginx:latest9 _; W* \  W: [8 b& R) Q& B; u
4 ^, _% a  j' }# A" @
# 创建并启动一个容器
, x! s; j! c- ucontainerd ctr run --rm docker.io/library/nginx:latest mynginx
0 F3 w- h- c9 [# E/ @# @% m5 L$ z' |+ x. c; H- l
# 停止并删除一个容器
5 G; g( ]- b. l6 D$ v' Gcontainerd ctr stop mynginx
; y7 e1 e2 @& b4 K9 Q" F  T& l# |containerd ctr container rm mynginx

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-23 13:52:38 | 显示全部楼层
配置Containerd
& B/ {1 c% d5 w  H; D- a3 M, O在配置文件/etc/containerd/config.toml中添加以下内容:( a( \7 T8 v9 v) _

1 r$ P0 T4 o7 R9 [7 k. T# \5 b1 d[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
" H! T, W  n; s4 ^# I) d$ p .../ d! A1 m8 E( Q% P. m9 [6 i
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]4 o9 ^  G# U1 Z( v7 ~. ^
   SystemdCgroup = true

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-23 14:01:01 | 显示全部楼层
containerd config default | \; ^* Z0 Y& T- m5 B
  sed 's@/var/lib/containerd@/data/containerd@g' | \' M6 [) c, h, J$ R) A
  sed 's@k8s\.gcr\.io@google_containers@g' | \  D* K& t8 r/ R# |
  sed '/SystemdCgroup/c \# j, o9 |% O8 i. K& I1 p$ F
            SystemdCgroup = true' |2 E$ e& k/ h: Y" q, R
  sed '/registry\.mirrors/a \
8 d. Q6 |# b, H2 g& X1 i9 j        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.1.10:8082"]\2 ]) t9 y8 @: W8 }
          endpoint = ["http://192.168.1.10:8082"]\% Q) {' e+ |6 ]' c; ?/ I
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\# |( C* V2 s" s
          endpoint = ["http://192.168.1.10:8082"]'> /etc/containerd/config.toml& u) \9 L: A4 z9 `$ S3 ]8 ~8 F
! t! u* e( B( |# S8 z( m
/ n: x, G  G3 X. E+ i

  Q- q% K1 h$ H6 J, s% W4 g
" n8 @* U- C* `! S1 d9 lhelm upgrade -i --create-namespace ingress-nginx ingress-nginx/ingress-nginx --version=4.0.19 \8 S/ z0 ~0 \4 b  k9 i( E$ y
/ ?' |7 ]$ W- M6 E$ y' \
    --namespace ingress-nginx \2 E6 E/ h5 t4 A- u9 t4 j
    --set controller.image.repository=ingress-nginx/controller \2 C( f* n0 u3 `( g' Z) G6 g
    --set controller.image.digest=null \4 |% u( y9 g' N5 n
    --set controller.dnsPolicy=ClusterFirstWithHostNet \, y5 m- m) y5 }, @/ \
    --set controller.hostNetwork=true \
- e6 r6 [0 N2 p" v2 s& T8 z    --set controller.kind=DaemonSet \( Y) X' F  j* Y1 t. r) _  C
    --set controller.service.enabled=false \% g  n0 a# E; l6 N2 f. W( k
    --set controller.reportNodeInternalIp=true \
, r. t( T! o! k. L) L5 Y0 L8 N    --set controller.admissionWebhooks.enabled=false \
' Y) z  _/ {2 o) n    --set controller.ingressClassResource.default=true \
6 c0 y4 Z6 M/ T+ m  ]    --set 'controller.tolerations[0].operator=Exists' \
& L" q' r/ C; b, z+ f9 y" H    --set 'controller.tolerations[0].effect=NoExecute' \. K1 x$ K( l0 g& W! d6 g; q1 n: F
    --set 'controller.tolerations[1].operator=Exists' \
) D# D* q3 K8 u' Y' N* ~  L    --set 'controller.tolerations[1].effect=NoSchedule' \
) ^' r2 ]7 Y  U2 s    --set controller.config.compute-full-forwarded-for=true \% T9 b* {3 N4 [& ^* A- D
    --set controller.config.hsts=false \% c, h1 Y' i/ I
    --set controller.config.use-forwarded-headers=true
8 R8 I) G: @$ D
' b( m' X& q( H4 ^$ ~' G
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-11 23:20 , Processed in 0.045541 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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