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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2025-1-16 17:19:41 | 显示全部楼层 |阅读模式
配置Containerd
" C+ K) }/ i8 s* B2 u: J" O0 b3 D在配置文件/etc/containerd/config.toml中添加以下内容:$ t/ c' n6 w6 V- _
0 t# L+ `! J$ {$ M
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  S, E) d& |8 U& O# z( k2 _ ...' y& n" g' Z2 U2 g! T! \6 Z: w
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
2 D1 Z4 Z! f& Q5 k- ~4 [   SystemdCgroup = true
/ n2 _9 \6 b* Y' p5 a
9 S1 O# e0 |; p, U0 C* k重新加载Containerd配置并启动服务
' L6 Z; Q  T+ \) t# Y0 M1 @使用以下命令重新加载配置文件并启动Containerd服务:; k% b6 m( t& {; I
3 w0 Y( c& ^3 ]# x) H2 p( N, L

' P  D+ k9 S# |sudo systemctl daemon-reload, M7 A1 [" d. z' s4 U8 p7 o
sudo systemctl restart containerd.service- [9 A/ i8 Z7 g! Z9 E: q& u
验证Containerd安装是否成功
+ R, k* O! G9 F1 _运行以下命令验证Containerd是否已成功安装:8 J1 l. z4 w3 A& V
  b) B6 M* \4 h" Q7 x2 O$ x

2 O! U' D1 c: ?# @
! O8 v( ~: b2 [sudo ctr version4 D5 }$ F+ o6 G$ |8 w8 p! ]. L# T
输出应为:
) v- B4 V: x" K
! m. @% ?3 A$ H! |: ^- k" ?% H; U5 ?$ v$ P" b
codeClient:' p) j! o5 y. {. a7 b  g. l8 v. b2 o
Version:  1.5.5
  \+ H( X! w$ {4 ^! L/ G Revision: 09a19cb71a40ac5ab8686245e5a5fb5e5d25c144
8 C) t" a9 N* w0 b) _ ...
4 C4 d- \% J% `" `4 v
- o$ r  z( W1 A5 b4 ]# YServer:
% p$ _0 x( S4 u Version:  1.5.5+ }$ X7 E9 W" y5 ^; A9 v& c
Revision: 09a19cb71a40ac5ab8686245e5a5fb5e5d25c144
% g5 f. o- ~9 P8 J( V0 A9 ^! | ...
6 \4 [8 A' J5 b. }# ]以上就是在Linux系统中安装和部署Containerd的步骤,在安装和部署完成后,可以使用CLI命令或者API接口来管理容器和镜像,例如:* Y* m, N; x; h& q* {/ S( K: y8 q! l

: s& ~) n* ]0 C  C
6 b' p8 S6 r4 L7 ~/ a; O8 L# z) U5 c: o' c* B
# 拉取一个镜像5 @5 Y8 ?6 `* z' f8 f
containerd ctr image pull docker.io/library/nginx:latest
. N7 i8 f, V/ D4 |% A
( x5 B& C$ r2 m3 H# 创建并启动一个容器
4 ?* G+ ?8 W- n3 i' Gcontainerd ctr run --rm docker.io/library/nginx:latest mynginx8 T9 G4 @' d+ J+ h5 k. r

+ g8 e9 T5 I( o; a  X0 U% B( ], V# 停止并删除一个容器
* o: P1 Z7 j) Xcontainerd ctr stop mynginx
0 N- K- C1 {) q' m3 ucontainerd ctr container rm mynginx; d* |/ p9 t- T2 {( P1 b, M2 L" J# C
Containerd还提供了CRI插件,可以用于Kubernetes集群中的容器运行时; r. U, X5 |0 ^0 b& B4 M% Y) t

2 W8 z) m& V, ?8 A7 w' q2 _
6 x: q4 a7 c$ D: q9 H( X9 \
* F1 q+ F( g! w5 d3 S- A

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-16 17:27:10 | 显示全部楼层
#查看镜像:
' l7 p, U' U5 Z7 W/ j3 X( ?: sctr images ls
3 I+ j3 W& V3 }' H--------0 N! _% k- }# N1 w# n  k

6 d0 I0 @$ C" Q; c  J1 N  u& p7 @. Y' Q
##下载镜像
/ [: r( S5 M) m$ ^8 R/ Ocontainerd 支持oci标准镜像 所以可以直接使用docker官方或dockerfile构建的镜像
6 ?' E. b. e% _& F) Q! y# O- i0 @
ctr images pull  --platfrom linux/amd64  docker.io/library/nginx:alpine, j& T" [( J- I3 m4 B8 w- }
1 J/ f. t8 i  k4 _
ctr images ls: p+ ^4 j3 d* a" |2 }
: S& }/ K4 e0 R
镜像挂载" ?8 t4 f) a# h0 A  u5 U
把已经下载的容器镜像挂载至当前文件系统
. n7 s" E' y$ xctr images mount  docker.io/library/nginx:alpine /mnt
& {7 q1 P5 R' u

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-16 17:29:46 | 显示全部楼层
1、Containerd镜像管理
- F3 _1 F8 K; D! O/ K0 ^5 J8 K1.1 Containerd容器镜像管理命令
, Z: k! W( w, q6 W; a- Fdocker使用docker images命令管理镜像
/ W$ K( `; O2 Q" T8 }单机containerd使用ctr images命令管理镜像,containerd本身的CLI
/ F0 a# O% |6 m& c. g, _k8s中containerd使用crictl images命令管理镜像,Kubernetes社区的专用CLI工具
: u: }# Q0 ], s代码语言:text
2 ^1 x/ a; l2 B5 z% ]+ F复制; ?" V3 i/ p$ J8 u. I2 r! D
获取命令帮助9 W( D# j6 x7 q$ Y) C
# ctr --help( L3 o6 M% N: ?/ n: f% O9 O
NAME:
, R6 F. L1 ]: w# M5 N) ?; Q   ctr -% b) M' _; |- K$ p! ]
        __
. \2 t" v# n: a  _____/ /______* G2 y1 F* W/ u; @* t( ]
/ ___/ __/ ___/1 r7 c0 U) d: `) `4 q
/ /__/ /_/ /
# V4 X6 G3 K& |2 a% a3 |\___/\__/_/3 e; ?* ?/ E  X, R& X. b! ?8 [

: p& Q6 u0 _. C8 H......
; W+ G( C( x6 m, Y* S8 f代码语言:text$ h, X; w% t  w9 T2 h% |5 ~
复制7 \# l6 x: Z& s+ K) U" t
获取命令帮助
( j& R: p5 n1 e7 e# ctr images, x% ^3 b: ?- e. M; m- d4 l
NAME:! c; r7 x/ y4 W2 Q7 O2 {6 S% L' ]
   ctr images - manage images
" \' ]) F0 s! `: G* N
& r" S% _. W; z+ eUSAGE:
1 ~; ]& K! I  I7 f+ B   ctr images command [command options] [arguments...]
" u$ [5 ^5 e- m5 a
* Z6 ^4 i, w5 s9 S! lCOMMANDS:
/ @0 x' X4 M' Z' ~( q2 F3 X7 u   check                    check existing images to ensure all content is available locally
/ _4 l$ K8 q' R! f5 b9 z8 c& r   export                   export images
9 h* h2 `* I9 E% f' ~: K; |/ y5 g+ n   import                   import images
3 o6 |( J0 h. S. ]* G, x   list, ls                 list images known to containerd
) I) R& K: w; l1 Z   mount                    mount an image to a target path1 z& a  S7 O; V* I
   unmount                  unmount the image from the target
6 i1 n5 Z4 L5 ^. b- c   pull                     pull an image from a remote9 k  Y5 x$ E- A8 y  {( \
   push                     push an image to a remote
5 |5 b2 z9 ]5 g4 }+ S1 w+ `0 a/ W   delete, del, remove, rm  remove one or more images by reference
# ]4 t% m, L1 o9 n- y   tag                      tag an image, x1 _# i! O1 [1 H  T
   label                    set and clear labels for an image& W# M  {/ p2 i  u* k8 H; Y
   convert                  convert an image) E, R8 L- t8 J
8 k9 y5 s7 c& [$ B4 ^8 {
OPTIONS:
3 H5 o. i  n" Z" A0 U, ]2 {   --help, -h  show help
5 \- P4 J5 l% \( i( v# t- @  B9 ^1.2 查看镜像
+ ^* ~- W, Q% y  T8 Q代码语言:text9 n& c2 K: g7 P! f6 R- Z
复制9 k! i% ?$ R1 m0 A: P2 @
# ctr images ls
4 j6 `7 W+ i% K3 jREF TYPE DIGEST SIZE PLATFORMS LABELS
- g/ n& g: j1 _) a3 O% V1.3 下载镜像! ]9 [3 ~! J' ^* W2 E
containerd支持oci标准的镜像,所以可以直接使用docker官方或dockerfile构建的镜像
' B( ?2 s0 a1 D1 ~7 P: z
5 j1 `$ K( x) A2 F8 g代码语言:text' r3 ^/ X! Q, `. A
复制; G) S1 q: L4 {. ?
# 镜像名不能简写,--all-platforms:所有平台,不加的话下载当前平台架构
4 x+ z' X' u) r$ t) |# ctr images pull --all-platforms docker.io/library/nginx:alpine3 M' I9 j) U/ q, g! W
# ctr images pull docker.io/library/nginx:latest
& ]( \5 N0 r1 K
1 i: U' T! f* P# uname -a
# p5 F" l+ t7 p代码语言:text
3 o% }2 l2 u- J4 P复制
) O' ^# C) G- B0 V- Z$ c% ?  F说明:
% A8 T8 H8 l8 \: M1 b% k这里ctr命令pull镜像时,不能直接把镜像名字写成`nginx:alpine`8 j& ]- ^/ u. ^9 B6 D- G  ^  H
代码语言:text
; E  I# O  ~7 H8 s; ^- X复制
* M4 W& O0 o! N. T6 B& l" `, h查看已下载容器镜像- w2 A* f: h; t& |" ]* Z
# ctr images ls6 B! Q0 o* f0 p, j& G  n
REF                           + Q! \- K! z+ w7 B# i" k: j9 J
+ j( ^' W+ Z0 w& e; a
TYPE                                                     : v. _% G9 l. ]( L
/ b' `4 }$ b, L% i8 x
DIGEST                                                      
" `; m/ P; X5 K: u" e$ T, |. I
/ l: P/ N6 w4 K) q% c: \docker.io/library/nginx:alpine" y) r+ V/ n# w* O, a+ g, e" r
8 l# u# S! X1 @! q. B4 ^; f7 ~
application/vnd.docker.distribution.manifest.list.v2+json4 v& a9 E+ F7 C6 t+ y, K& L& D% T

. f# x9 k: i) bsha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d38 Z$ @9 Y6 f6 L" H% J# g

: W+ {- [/ D2 P- v' X" |6 H0 MSIZE   
( a5 M1 d$ B+ ~# ?/ |  `
, V9 Y, p7 i" K+ e4 x1 m% {. }. XPLATFORMS                                                   
! I8 V! Q$ `3 h; x  Y/ c  d" n# z, y. w5 ~
LABELS$ n. F4 ?4 ~- W5 u# z4 C" W

" T) [3 Q- ^! Y' a9 J* U) v+ y0 V9.7 MiB
) ?$ a' n7 K% X5 Z
2 C7 t* T9 @; T! I; r7 Rlinux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x$ R) |' q) a3 P2 s- Y! a

0 d: v8 |9 t5 O2 e( b代码语言:text  f5 u  z" X1 `1 d
复制) F7 k: h( n0 j2 |0 \. l4 `
指定平台下载容器镜像. [& _6 a2 D4 o8 d2 t
# ctr images pull --platform linux/amd64 docker.io/library/nginx:alpine
. R' l9 @! n' j( }' U没有镜像是无法运行容器的。3 }0 Y  ^- p4 i3 D

, V! y& H  R$ M  v5 B% G4 ~1.4 镜像挂载* _& t, F! k/ O4 ]! p& W
方便查看镜像中包含的内容。# H' X* \: C- @1 y# y
1 b2 z) j3 r& r" w7 [" G- W; Z
代码语言:text- L- E: T" H8 Q( n3 c) m
复制
$ e4 D1 q* X/ L( R/ b) n$ H把已下载的容器镜像挂载至当前文件系统; z5 _: X- k: [! n3 P* i
# ctr images mount docker.io/library/nginx:alpine /mnt* e1 {% ?9 R, N  V: t0 _; v( x/ c
sha256:af2fcce448e2e4451a5f4796a9bf9cb5c9b5f88e0d6d10029cada42fb9d268ac
/ A# D4 N/ B3 b" b/mnt
. Z  B7 {2 w2 l& B$ f6 i5 ?5 P[root@localhost ~]# ls /mnt
2 x, \5 O' Z0 |bin  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  C* X, N7 i* n! i
代码语言:text6 T2 l! I' H7 W
复制
* ~) P7 R$ K( j+ |0 V1 X卸载: Y- x/ W- Z" R0 H
# umount /mnt8 S3 Q/ D6 \9 G' U! g! |. `. f
1.5 镜像导出
0 L3 ~* w  L9 b, L代码语言:text
" r$ Y7 ^. ?, u7 H7 g7 o7 A7 u复制
% p; w. A' L3 [) ]9 g把容器镜像导出; B/ A2 d3 s" H3 U9 F1 H" Y2 O
# ctr i export --all-platforms nginx.img docker.io/library/nginx:alpine
2 `( H: n7 a+ f代码语言:text
; O7 h- \: j+ }2 q复制6 S+ U$ d+ b/ t
说明7 f' r8 d. n; M0 E  ]
--all-platforms,导出所有平台镜像,本版本为1.6版本,1.4版本不需要添加此选项。
6 M! N5 B* D4 C$ {5 @' g代码语言:text3 B6 L) v- m! q: A6 T! N
复制
9 v8 U: X3 e5 @8 V9 J查看已导出容器镜像: }' p3 Z+ {9 T$ A7 V  S
# ls2 x2 g, L  M" h# w* ~1 F: o
nginx.img" E* e8 x1 Y/ z( k, N% C4 `/ y

1 A' e5 {# U0 z, T5 L8 ]# ls -lh
8 r$ m# r+ g9 L* n* y总用量 196M8 r% B1 y" E5 J

& Z7 D: J: s- g+ w5 a-rw-r--r--  1 root root  73M 2月  18 14:48 nginx.img
* j# O0 |8 U. y* S$ J8 ]) m1.6 镜像删除
5 X- g* [. m' Z; P! u6 [0 Q代码语言:text
$ ]( ~' x9 ~3 [! p) p9 T1 U8 s复制, e& d- P# k& {: j: B
删除指定容器镜像8 h: Q4 T0 v7 a# m. \9 m: y) Y
# ctr image rm docker.io/library/nginx:alpine
" j" y; Q6 [2 v' z- [% p9 ~docker.io/library/nginx:alpine" y/ O- O9 g; X2 ?2 P# K) C6 H
! [# M- ]4 H7 v
再次查看容器镜像  M5 ~& d/ l" ?) |3 B
[root@192 ~]# ctr images ls4 U+ z7 O3 d* H6 a2 h3 @
REF TYPE DIGEST SIZE PLATFORMS LABELS
9 S& ]' N- X5 i! e$ V- w1.7 镜像导入
, ]# W, @8 {3 b) h4 C& i代码语言:text) i/ L3 N; f$ B! p" N
复制, m3 c; [$ c9 t0 ], }' a1 t
导入容器镜像
7 R8 O% {! e4 f7 F$ W4 o  A# ctr images import nginx.img+ J# ]) I: q, W# k  h
unpacking docker.io/library/nginx:alpine (sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3)...done; Y& m8 M* `) ]! F' A* J
1.8 修改镜像tag' z) p# T* d- W9 ~5 c
代码语言:text+ V( A7 m6 r9 e6 o  j" D
复制
/ ^" s3 B! r4 }/ L  J* Q  @# ctr images tag docker.io/library/nginx:alpine nginx:alpine0 G+ K- K- y) t$ r( m
nginx:alpine
9 l, I7 k7 F( x5 N+ r. M/ ^1 o1 j4 ~1 d7 X2 Y
# 建议修改tag的名称为:镜像仓库地址/目录/镜像名" c2 [% \8 [0 |- _3 o
代码语言:text
$ u* g6 L, F" B3 D! H* x6 |复制
3 ?* i3 R1 ]6 l: @. {6 J说明:( o' P) r+ J9 u2 p
把docker.io/library/nginx:alpine 修改为 nginx:alpine- H$ ~3 j& C+ f6 m8 {, x
代码语言:text- G* j  Y8 T. Y+ Q. a3 A% F7 Z& D+ T
复制
- N7 j' \. H# Y6 O查看修改后的容器镜像
9 Y, ?' O: J0 x* I6 `' ~3 U# ctr images ls
8 V/ E: d' Q) d2 D* w6 X3 K3 BREF                            TYPE                                                      DIGEST                                                                  SIZE    PLATFORMS                                                                                LABELS3 Y  }9 G. L2 o& |) M, l
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 -! }' X$ C8 \8 a6 [
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 -: g" Q- h+ X8 e! J
代码语言:text  M9 x! |  |" |8 r' C4 H- e
复制
' @2 K* y3 L6 E7 j修改后对容器镜像做检查比对
6 {& Y1 Q$ V9 s2 H& R# ctr images check
0 y! K( w( l; V3 }' j$ _REF                            TYPE                                                      DIGEST                                                                  STATUS         SIZE            UNPACKED) }; ^0 k% P8 K  `0 s
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- Q7 x; h6 x3 D8 o, Q. W' i
; |$ C3 [, F; ?* c( v
nginx:alpine                   application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 complete (7/7) 9.7 MiB/9.7 MiB true
8 Y0 p% d7 Y1 ]( g, O& I2、Containerd容器管理
+ j# e. J7 A  h/ e; t& P  H2.1 获取命令帮助; B- h5 \* W) w1 R% M* _# V
2.1.1 获取ctr命令帮助# O" g# ?  d) h: F
代码语言:text  g5 S/ c* ^$ ^: `
复制% ~5 ~( _8 h  @+ x/ c5 s5 f
[root@localhost ~]# ctr --help2 m6 Z( O, [) @. W! L" g
NAME:
8 `. s' B' w+ s9 X   ctr -
  D7 v4 b* [. D0 x        __# i) O8 B( v1 B+ q. n
  _____/ /______
! F- A8 [. x9 r; ?2 V / ___/ __/ ___/4 o- a* _. E# s; ^3 X8 h
/ /__/ /_/ /% _' ^1 _7 f: b% \' t
\___/\__/_/
# q" [$ i2 M8 I3 U7 v
3 D$ r+ R3 F% }( K/ K( \' ^containerd CLI
, C! y: X0 P# C" A; e7 \3 d6 O( ]3 O- B8 M3 b* N

. K, U2 K( @4 \! k% R4 D......
5 p) G- f2 ~/ }+ q2.1.2 获取创建静态容器命令帮助. U/ A# G+ w& f3 ^6 f8 Y
代码语言:text
  f' x% W1 B; W1 l5 ~复制5 K) U! {8 l8 Y8 h1 N6 V7 d
# ctr container --help
) u2 v! L. x5 `" n- LNAME:
. ]4 b" ]: I  H3 f" _9 N0 U% c7 |9 @5 W   ctr containers - manage containers/ v% Q. J) ~# g9 x0 x
/ u* N( M/ Z! G8 n0 L6 M
USAGE:% E4 p0 z; s' T' b
   ctr containers command [command options] [arguments...]
3 J+ v. M( j2 m
4 R7 Q5 x8 e' P# RCOMMANDS:5 ~. ?1 C9 A& ?" E* ]% j
   create                   create container) c, s7 [) R- n- a) H
   delete, del, remove, rm  delete one or more existing containers. @* I* R% F' D5 j  F5 o# v/ W
   info                     get info about a container
5 r0 Y( s. D* {$ c   list, ls                 list containers; U' O& g0 f5 S8 f- b
   label                    set and clear labels for a container
1 m7 q9 z5 x' D* r7 ]   checkpoint               checkpoint a container) V0 p% @0 G6 }0 d: Y5 [/ t
   restore                  restore a container from checkpoint% r. i, D3 F; S7 q; h
/ e) h$ n4 Q! Q; d6 ~# D3 O! r
OPTIONS:8 K' a) s% Y5 p" A' d" ^
   --help, -h  show help  c9 f3 |0 v& [, }
代码语言:text
! b/ F6 z9 v7 a/ U+ }" W复制8 B0 [4 Z7 ~, i' T) n
说明:
7 K! X& e1 V% l" Z2 J4 @9 j1 V7 T' K7 [/ k) v) X: e% U6 |
使用`ctr container create `命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。这个 container 对象只是包含了运行一个容器所需的资源及配置的数据结构,例如: namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程(本案例为nginx)还没有启动。需要使用`ctr tasks`命令才能获取一个动态容器。
$ }; T# B+ V9 i( _2.1.3 获取动态容器命令帮助& c, ], V$ Y9 }4 T6 L) {" L& Q9 H
代码语言:text
2 C; d* F* Y6 y' X* X2 n# o复制' y; d% G1 N- N+ v. U
# ctr run --help
2 {0 l9 o  y1 ]: g7 ?7 J4 _" M0 V2 xNAME:$ J% I4 U7 x. y" W' @
   ctr run - run a container4 M1 }, n# j- J1 \' Y

9 g) U9 ]! O/ p; ]% A  u......$ ~$ @: Z" H+ ]* g4 P
代码语言:text, ?- q. c1 P; U/ }& p4 [
复制3 v7 L  o! P# F8 Q9 h: }9 C3 y1 w
说明:- Y# q# G/ \; y: K) a& ]9 f+ i
使用`ctr run`命令可以创建一个静态容器并使其运行。一步到位运行容器。  E- |1 u! V, w# a
2.2 查看容器$ p( H9 S: B" E/ l% C8 ]+ a
container表示静态容器,可用c缩写代表container
0 `; T" F5 N- H3 J& ]9 w( Y0 C( ]1 n5 c( z
代码语言:text
" ]" Q6 S* @; ^- ]1 Y' i" }# @2 t复制
0 ]3 F- s9 e# c' S, M9 O# ctr container ls0 z7 _( U/ a/ t& `
CONTAINER    IMAGE    RUNTIME/ }% U4 o0 b8 I+ g
7 }$ L- i( E" V' L' H$ B

4 p: V- I, M1 I0 Q" Y代码语言:text* Z7 |( A1 Y, |& F
复制
5 ]5 J' Y2 k, R$ H6 @% K/ f6 F# ctr c ls0 _# v" n( @! B" ?% K! m+ d, L0 O: A
CONTAINER    IMAGE    RUNTIME: e* o% I  m' C9 `
以上命令无法查看出来容器的静态的还是动态的
' e4 ^) Y1 R3 E% Z- Y) a1 g# y* M/ [# ~
2.3 查看任务% P$ [. q! l' k% I7 T' o
task表示容器里跑的进程, 可用t缩写代表task+ V! _3 g. L% e& X5 _
& q3 g; f- L. J0 n' }
代码语言:text
4 r$ o. I: t2 J' e4 O复制  E9 f$ `& C2 O1 d; X' M
# ctr task ls! e0 O9 u4 e( c" D" s
TASK    PID    STATUS" f: K! a9 `3 }

. l# c$ x" H2 O9 p1 K8 y$ A
0 X7 ]. H3 T) ?5 Y, o代码语言:text
& {, [1 T1 T2 b' ~复制
0 g) ?( h- a2 a0 {# ctr t ls
5 N* Z% ?8 ?( ]8 P) y2 k, hTASK    PID    STATUS
% I$ X# K. W4 Q; W2.4 创建静态容器8 z4 \0 [" E* p9 |/ s2 w3 d
代码语言:text' e4 D) a8 k2 ?2 d& j/ Y; e$ E! H: _
复制: p% e# x4 n# Q3 R8 }2 i$ e
# ctr c create docker.io/library/nginx:alpine nginx1
" w5 ^6 k- w) A代码语言:text
' n  [  V$ b3 h$ G- E复制
: \& x/ r* G" S$ Y# ctr container ls
; F! e% m$ p) ?" y: yCONTAINER    IMAGE                             RUNTIME
9 p( Z7 \6 j! c* x# l! ~6 {% Lnginx1       docker.io/library/nginx:alpine    io.containerd.runc.v2
% ~$ k3 a5 h% @0 M代码语言:text
' M) t  `; ^% i复制2 p3 ^- }4 M( h4 W
查看容器详细信息
; Z6 A! W2 c" P+ u2 p7 ?# ctr container info nginx1
2 I' n$ W4 g$ X, D2.5 静态容器启动为动态容器
- z. n/ ^  y+ l$ }( I% R代码语言:text
4 ?1 z7 O# H! j) N1 P& ?5 o4 l复制4 C' I) a+ t) a; H. f
复制containerd连接runC垫片工具至系统% Z& O0 r" j% Y5 y; ?* Z; Q
# ls usr/local/bin/
  }# e( \' @4 G: s! @8 }$ Q3 ?containerd  containerd-shim  containerd-shim-runc-v1  containerd-shim-runc-v2  containerd-stress  crictl  critest  ctd-decoder  ctr" S/ k# h& \6 b) _7 W
[root@localhost ~]# cp usr/local/bin/containerd-shim-runc-v2 /usr/bin/. o8 x* ~( \2 ?5 ^5 G  ^% h
代码语言:text- B% [  v* A: V( J6 W
复制/ e- u: |2 Q2 J1 M
启动task,即表时在容器中运行了进程,即为动态容器。
; T. c: Y; E3 @: y# ctr task start -d nginx1
" C. }, k& W% K  f% Y/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
- u5 {! S/ E* m$ |8 V1 Q/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
1 D: Z& _1 v% l2 ^/ N+ y代码语言:text
! @  c8 q: Z$ H复制# w$ b+ ?8 U  }3 E* E7 H
说明:
8 S0 M  A+ T2 O: A; g-d表示daemon或者后台的意思,否则会卡住终端
* o+ x- k8 B- b2 Q  g6 O, i代码语言:text
! A: K$ u5 u& C/ l  l' e8 n" }复制
: K# z/ `% t5 k1 f4 g$ r& C查看容器所在宿主机进程,是以宿主机进程的方式存在的。' B! I+ u) \3 N8 d% h5 H
# ctr task ls
# A5 a; m/ E9 A5 }3 h' H3 D5 R4 ATASK      PID     STATUS, n9 C3 M# Z2 D/ g5 r( ?+ J( F
nginx1    3395    RUNNING
/ A5 @# b7 H4 `2 n代码语言:text: G+ S/ v# k/ z
复制
- f+ q% L/ j( W" |& _查看容器的进程(都是物理机的进程)
1 v* j% D# r3 I0 |6 r2 {# ctr task ps nginx1
( Q6 |3 G! z4 w+ \+ v0 ~) M5 U8 |* ZPID     INFO
" b9 Y/ W: K( `" T; W0 j, x; M. T3395    -& h$ F! A# W: R, D. A  l# _! O
3434    -. e5 s4 G7 o9 z  y* @
代码语言:text9 }/ U1 ^8 v8 s! l  Y/ H
复制! M& z# o. {" R2 Q+ n& _
物理机查看到相应的进程
! d2 I$ M3 I; x# I# ps -ef | grep 3395. W# ]3 Y4 h3 C( `
root       3395   3375  0 19:16 ?        00:00:00 nginx: master process nginx -g daemon off;$ I4 o# u0 }7 o) s
101        3434   3395  0 19:16 ?        00:00:00 nginx: worker process
! P. y+ Y. W$ b2.6 进入容器操作
6 Z% E8 O2 w6 q. |& E: O3 g代码语言:text
. _! U' u  M9 n" f  I复制
- E# L& s& r! T, ~+ H, k! v) ^# ctr task exec --exec-id 1 nginx1 /bin/sh
; x. a3 C/ k# M8 @7 r5 V8 l
& I% {+ h6 F! g2 ~5 a5 l# ifconfig 查看网卡信息9 ~4 F1 p3 }$ W0 U& [) q
9 U4 J6 ?6 a  W7 O
...
. H6 r. v5 ]  Q
( i/ i0 z1 K9 i, `# curl 127.0.0.1 访问本地提供的web服务
; |9 z9 }+ I4 _( c* [...! I/ H& b; B6 t8 y& G
代码语言:text1 w7 j* I/ p" v8 ]% |
复制4 h* }/ ~8 ?* n
说明:% \; [; Y& J& D4 Q
为exec进程设定一个id,可以随意输入,只要保证唯一即可,也可使用$RANDOM变量。
, k5 N+ X0 m- z8 m* @# t6 o. j2.7 直接运行一个动态容器' u4 }9 o6 A+ j& R
代码语言:text+ L) }3 I( ^9 q9 s+ p  Z3 q- j6 Z
复制
, a/ v7 Q0 s/ r3 W6 v( j8 |% _# ctr run -d --net-host docker.io/library/nginx:alpine nginx2
) h' }3 F* D, `1 ~4 z/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration  Z/ d3 G# _5 u! G8 u  P3 F
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/ G1 r+ S; Q4 X/ \) _! J代码语言:text2 P0 S$ O; p: P
复制  `; b/ K. k9 l7 @
说明:
3 C2 a$ I/ p+ a5 `* -d 代表dameon,后台运行
  Q6 [9 c- H6 t" p2 P8 A# Q7 w* --net-host 代表容器的IP就是宿主机的IP(相当于docker里的host类型网络); s; E! R2 w* I# w3 I3 p! l
代码语言:text
6 f) p5 {3 x2 p8 R7 @) w, |+ O复制
" Z$ m) d5 v) F& @5 ~9 G; Y( |3 \6 y查看已运行容器# i) T% H% f. g) `  }7 M
# ctr container ls
6 q3 K/ Y% d& iCONTAINER    IMAGE                             RUNTIME
1 y$ c' e- s+ X! d6 J3 qnginx2       docker.io/library/nginx:alpine    io.containerd.runc.v2
! I' _- p2 w3 }) f( x6 }代码语言:text' ^0 T+ D% m5 b) _  L! b7 s0 I
复制
" w$ B* F* E# I( C& m查看已运行容器中运行的进程,既tasks
4 @0 Q+ I9 x5 A  p0 N8 ]5 R# ctr tasks ls
3 v( ]0 J: `- S8 s" `3 YTASK      PID     STATUS
* Y+ T/ }3 s8 b" z  knginx2    4061    RUNNING3 M  ^0 m8 n$ U$ G
代码语言:text9 g, |+ ?. V) n0 T$ z& R
复制
  r( N0 i- W. c7 A8 n进入容器' ^$ t1 i4 |/ r5 {
# ctr task exec --exec-id 1 -t nginx2 /bin/sh! R# ~5 z! C% L* j1 E- S5 r6 l* V
代码语言:text6 M- k% ?2 _/ J3 ~4 y5 I- Q# Z
复制& v" f6 e- J4 s( |' S& J9 M
/ # ifconfig
8 N% h2 m3 g* M8 Z+ F2 f* [" fens33     Link encap:Ethernet  HWaddr 00:0C:29:B1:B6:1D
6 l) C( R" l! H. ^1 x9 Z1 |0 w% z          inet addr:192.168.10.164  Bcast:192.168.10.255  Mask:255.255.255.0
/ T, f8 O$ v* E7 R          inet6 addr: fe80::2b33:40ed:9311:8812/64 Scope:Link- i) F& v7 P. e6 T* X
          inet6 addr: fe80::adf4:a8bc:a1c:a9f7/64 Scope:Link
; v) |0 N, G" E# Q) r9 H  X' S          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1) L+ ?  {& c. a6 M2 N- D0 R' X
          RX packets:55360 errors:0 dropped:0 overruns:0 frame:0
8 e, |5 M$ T, t* D          TX packets:30526 errors:0 dropped:0 overruns:0 carrier:0
2 z2 U/ j( Q! F5 f% X          collisions:0 txqueuelen:1000
; o7 m9 j" F! ]4 `" ?& a/ L% a          RX bytes:53511295 (51.0 MiB)  TX bytes:2735050 (2.6 MiB)
1 D3 n. O( u; ?; Y
4 B- M! x4 E- \+ ]# vlo        Link encap:Local Loopback  \. y3 \/ g; H3 K
          inet addr:127.0.0.1  Mask:255.0.0.0
5 P! ^. o6 {8 W, u2 v' w          inet6 addr: ::1/128 Scope:Host3 g" c. t% t/ I: N( c. S1 p
          UP LOOPBACK RUNNING  MTU:65536  Metric:16 x5 z1 Q9 _/ ~  ~) e% c& q" A
          RX packets:68 errors:0 dropped:0 overruns:0 frame:0
$ S7 m3 p- C& L+ S% U' m2 J# e% Q          TX packets:68 errors:0 dropped:0 overruns:0 carrier:07 m8 ?9 H, w6 d: o1 v
          collisions:0 txqueuelen:10006 a# M; r. ]+ A* f$ A, C
          RX bytes:5916 (5.7 KiB)  TX bytes:5916 (5.7 KiB)
- z  M  v1 z1 l2 o' K3 V$ h+ T( J% R: L; b' D( ?6 u
virbr0    Link encap:Ethernet  HWaddr 52:54:00:E9:51:82
1 x- x2 m% ^; x0 L7 M% L. e          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
! T' Q( U7 k. F8 |$ ~1 l/ q          UP BROADCAST MULTICAST  MTU:1500  Metric:1: |4 Z2 X- w, t2 s% S! ~
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
- ]. q* t3 K7 X4 F3 M- J          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0+ d& V3 `% E$ }3 R2 I- M: Y
          collisions:0 txqueuelen:1000
7 G# c+ T! R$ a7 Z3 J          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)4 z. h  |4 W9 x& G" _$ p
代码语言:text
0 F. f( w1 u# q1 j复制
& x# }* \$ o+ `. d: f- p6 b为容器中运行的网站添加网站文件7 \: z8 {( t5 E4 M/ Q
/ # echo "nginx2" > /usr/share/nginx/html/index.html2 u# G  D* L3 P+ @. W
/ # exit
; o1 E/ v3 P3 w; g' `  f代码语言:text
9 s: s$ ~! w4 n8 ]复制' i+ Y! O) O5 a8 K3 h- y! c
在宿主机上访问网站1 r/ T# Q2 C: v  x) K" C+ b
[root@localhost ~]# curl 192.168.10.164# c$ x% m0 g# y& i  O# @4 n/ i' m
nginx2
; F( ^4 a1 }2 W7 V- Q2.8 暂停容器1 q6 Q; d( o! X3 K# c! A, A
代码语言:text
+ v5 {( I: a' x" _. b复制% b- g3 y# P5 E$ B! ~" g3 r
查看容器状态
8 V1 i, I" r8 c" l( ^# ctr tasks ls
- c( e7 Y- i; t# X$ @: STASK      PID     STATUS
: Y% Y9 a' j# p' mnginx2    4061    RUNNING& v; _1 s/ A% V0 Y/ u3 j; n
代码语言:text
8 A; d* H$ n* a复制
# u. Z1 p) [1 W( z暂停容器
* F+ Z3 @8 e0 q! L1 ]2 q" ]. Y* h# ctr tasks pause nginx2' X; X* |- U2 _  }3 C
代码语言:text0 M. c  z: L, _: n- ^; ]
复制5 p8 j+ Q* I) N! q5 R% l
再次查看容器状态,看到其状态为PAUSED,表示停止。# F  H. ^% o) m; p
# ctr tasks ls
/ c6 D" v* }! qTASK      PID     STATUS" C) o  G) U) x( i" ^2 q# P
nginx2    4061    PAUSED
, M" A- A# d) O& f& D: @代码语言:text6 ]# a) p; z* U7 {* S, @
复制3 B0 L; T, l! W7 a$ S5 X
[root@localhost ~]# curl http://192.168.10.164
2 S. x: B5 K# G$ I8 A在宿主机访问,发现不可以访问到网站+ `% N- F6 l& l9 Q
2.9 恢复容器" M2 [1 `: t4 C  Q9 ]# m
代码语言:text
3 n( Y4 J0 d: r6 ?: s9 U复制2 U8 I0 y3 b$ [/ L
使用resume命令恢复容器. p9 l+ b# S5 e8 h8 P
# ctr tasks resume nginx27 \6 f2 i0 O- e0 y3 B6 d7 e$ S. w
代码语言:text5 L$ J0 M4 j! c" o4 c
复制6 D1 R6 _* H# P
查看恢复后状态8 V5 [$ C" m! ~) K! c2 N* ~  M
# ctr tasks ls: T7 R) q  }- j
TASK      PID     STATUS6 g( h. X3 z+ }: ]6 v& S, T
nginx2    4061    RUNNING; J: R3 Y" l% l* w" o7 R
代码语言:text& n" X6 G! n2 F6 w/ h
复制" |1 k  z8 Y; ^; E! f* n7 `' P
在宿主机上访问容器中提供的服务: `$ K0 R8 D1 c! U
# curl http://192.168.10.164
8 F1 `$ L! U- W; w8 l6 }nginx2
9 W5 I# i$ ?- m3 u- k% e2.10 停止容器
" a( \& _  T$ _, j3 M代码语言:text, I! I# M$ U9 ^, e7 s
复制
, `, W% D2 `3 a% B6 Y, n# ctr tasks --help& i/ |+ f3 [# y3 u$ a/ i, _
......! I# B" E. m4 K8 o' v
代码语言:text
6 O7 [( f! M! s% ?复制
+ R  `! m4 J) T) K使用kill命令停止容器中运行的进程,既为停止容器
# d) F* }/ Z3 {5 q' _, z# ctr tasks kill nginx2  R; j8 s# \' K2 q* _
代码语言:text
6 K& E. ]( r- Z  [0 M复制
2 \; F" z4 V  [5 X' A查看容器停止后状态,STATUS为STOPPED* |" X- }9 f7 O5 d0 Y  U( G1 A
# ctr tasks ls
. K2 h; k4 [6 m. PTASK      PID     STATUS
9 G, u" X+ s8 bnginx1    3395    RUNNING# k) i" s) G1 c; _0 B% [' D
nginx2    4061    STOPPED
: t. [8 [' T: U0 _5 c* n0 [; q2.11 删除容器
; R. t! ?! @" r$ O" G代码语言:text$ M) X- T% Z; x: m
复制
6 `  p3 l& \3 L9 @/ r# ctr tasks delete nginx24 O9 O0 w* f, r! q* L2 r/ r$ P$ \
必须先删除task,再删除容器8 J0 c2 [% {8 B' _/ b
代码语言:text
) R' s' p4 O, H% f5 \7 U复制- K- v; T1 L0 P  X- E3 d( g9 j: N
查看静态容器,确认其还存在于系统中
& h: j1 H' X1 ]# ctr container ls2 _, P! M* P: l& n- k* g
CONTAINER    IMAGE                             RUNTIME
( N# y! P. r$ K0 l1 X  v9 W" jnginx2       docker.io/library/nginx:alpine    io.containerd.runc.v2
" E" F7 @+ ?( _代码语言:text5 A6 O7 `$ `4 K) [7 H: m  t- s
复制) e7 _- {8 S; b+ `
删除容器
% T; l! m+ x! F) V+ ?4 b; z4 f# ctr container delete nginx25 y) L" e" b* e0 F; v6 D/ u
3、Containerd使用私有容器镜像仓库 Harbor
/ R% r# h0 ~5 L% N: P3.1 Harbor准备* F& T3 Y: R; V" e* ]9 @4 \2 t$ S8 L
7 ]0 e( N5 O( o% ^4 [8 d
" K6 i8 G( e3 ~. T
3.2 配置Containerd使用Harbor仓库
& ~1 e! p: S( r) n3 Y3.2.1 Harbor主机名解析
5 h- l5 V" A0 f1 F% k6 ~3 ^在所有安装containerd宿主机上添加此配置信息。
# _, n, G! K; V0 H9 [: T2 b- c; E3 g7 x' {( j
代码语言:text
8 i' P; Q9 N3 b3 l; K  R复制
* Z, O7 p& Z% l% z+ `- w# vim /etc/hosts
& m$ V; w; V$ D: |+ c. @' \, `3 W( J# cat /etc/hosts5 [8 T$ D1 u' a
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4! U/ C- [* R2 i  V- D7 B
::1         localhost localhost.localdomain localhost6 localhost6.localdomain62 S2 S" l/ d" n8 G
192.168.10.165 harbor.kubemsb.com
1 Z8 b  x. l# f代码语言:text$ t2 x3 q% D, f0 ]6 ?
复制
% m/ f  L7 D' B8 ^0 ^说明1 H4 x7 m4 r7 L1 ^' Q
* 192.168.10.165是harbor的IP
5 V2 U3 ]& K: Y) c) N1 Q$ v$ H  Q$ e& q
* harbor.kubemsb.com建议用FQDN形式,如果用类似harbor这种短名,后面下载镜像会出问题) Q: r! u' [0 m, q& f! @
3.2.2 修改Containerd配置文件- ?" R$ C- D# q7 r9 y5 r. k
代码语言:text
1 T; G( S( X: @: @5 j" ?复制
. i+ Z" G# F' W% q1 C- k此配置文件已提前替换过,仅修改本地容器镜像仓库地址即可。, z0 R. U/ Z6 G# M! P: K
# vim /etc/containerd/config.toml% N  O+ K2 v2 ^5 \# ]
# cat /etc/containerd/config.toml6 f5 O/ S; |1 Y( `
root = "/var/lib/containerd"
- L! j# E$ d( ~) ~state = "/run/containerd"
" Z/ h' D# K. ^8 \* S1 \0 [oom_score = -999$ U/ ^5 n  c$ t

+ X% p! }! p" P8 s[grpc]
! V& B3 |9 w0 @) F8 C# i6 f+ F  address = "/run/containerd/containerd.sock"8 O6 c# y+ U% V5 I6 D
  uid = 0
  a3 n; T9 ]9 n2 ^8 i* d5 {  gid = 0& N, m3 [7 F6 s
  max_recv_message_size = 16777216
7 L' H( N/ R3 m$ k7 z  max_send_message_size = 16777216
- i9 d  J5 W3 i) j. ]3 U5 Z/ J2 q  a) t* _
[debug]
# C# m/ K; s* \# l) b2 `( ?$ t4 {/ O  address = ""
7 P* b2 G3 i( F* O  uid = 0+ H* m, p) N+ t- g( U9 |. w; H2 e
  gid = 0
% _! D! E4 ?# t  @  level = ""
# P( k: S3 B* m) N! m
6 n3 f; r0 P/ Y; F% {[metrics]
! @, ^7 e. G$ Y' O2 L: u  address = ""
4 v7 i, P7 e; {( N: L, W  grpc_histogram = false
& x; |& X% O& H% ~, n, O6 m  ?+ n
, @9 U/ M* ~8 i/ K" t[cgroup]3 P. Y1 l# \& p
  path = "". f& G7 @6 h3 Z# B8 l/ ?
4 }: }2 s; s# V/ u! t- H6 b
[plugins]
4 _' t. Z5 n- K4 S) ~- T  [plugins.cgroups]: u6 R" H0 L- r
    no_prometheus = false$ b% s( m! H: {, |
  [plugins.cri]
% B( R0 L* E4 L    stream_server_address = "127.0.0.1"+ b) x  r2 Z5 z4 \% L
    stream_server_port = "0", Y4 S! ^  R% \$ r9 x% @
    enable_selinux = false2 |; Y- e% P# d
    sandbox_image = "easzlab/pause-amd64:3.2"0 g  Y/ T1 _9 X. \3 O( A, H* o
    stats_collect_period = 10
. _5 d6 ?: i- j/ h3 q* [( y    systemd_cgroup = false, ?) [" S) f5 _! }1 D
    enable_tls_streaming = false  O5 d# C: d& K
    max_container_log_line_size = 16384* P& C. ~; z. Y0 ~) [
    [plugins.cri.containerd]
2 o2 H& Z$ a8 q5 [. N) N* S/ K% G      snapshotter = "overlayfs"
$ J: w6 y  A1 s  {      no_pivot = false
- f8 K6 E! }$ s      [plugins.cri.containerd.default_runtime]
! K  P4 P; m; n5 e* S0 W7 A        runtime_type = "io.containerd.runtime.v1.linux". D' x- d! J4 P  c. b& L
        runtime_engine = ""  l! W; f4 G; s4 S
        runtime_root = ""
- F( y$ _( E/ r- B      [plugins.cri.containerd.untrusted_workload_runtime]
( ]7 a" r$ y; z9 @( x  M        runtime_type = ""
: U6 ^$ W5 I2 t7 M$ s        runtime_engine = ""
& U% q5 N* o5 P% Y* g        runtime_root = ""
: @0 r/ D, Y* b5 I( }    [plugins.cri.cni]
( O# }  n$ I4 z      bin_dir = "/opt/kube/bin"
( x0 _- h  {( @1 B7 y4 W      conf_dir = "/etc/cni/net.d": _7 T5 _2 W+ F( L9 S
      conf_template = "/etc/cni/net.d/10-default.conf"+ o* I6 @, B6 P# a% @2 p
    [plugins.cri.registry]
: `: v+ {: P% P7 G      [plugins.cri.registry.mirrors]
! W3 J& y% E1 @+ g2 H        [plugins.cri.registry.mirrors."docker.io"]) P4 x1 G9 A' ~6 Z) S
          endpoint = [/ e8 v, ]8 J6 v; C" b$ }
            "https://docker.mirrors.ustc.edu.cn",
4 `6 `6 ^9 }' {+ i& E            "http://hub-mirror.c.163.com"& \  u' t) P# C3 T! }! e3 N2 J
          ]0 O. h$ S! C0 l4 W; I6 _
        [plugins.cri.registry.mirrors."gcr.io"]
* _2 ]; f9 W6 i          endpoint = [" i7 [. x, i2 O4 i- }/ e- i  c
            "https://gcr.mirrors.ustc.edu.cn"* I0 Z+ }! L9 r
          ]
  a! I9 x) s' ^3 G7 a$ q9 W        [plugins.cri.registry.mirrors."k8s.gcr.io"]4 s0 V. n1 A' R  P5 \- |# \: Q
          endpoint = [2 w, S# |* [) a5 N! ~0 Y0 h
            "https://gcr.mirrors.ustc.edu.cn/google-containers/"2 u+ `% l1 F9 Y- Q0 P  h: _
          ]1 B; P, j1 }: f  {/ X4 ^  @0 X
        [plugins.cri.registry.mirrors."quay.io"]
0 R# \/ M6 Z8 i! f3 k          endpoint = [" t* @8 W! g' k' B' @( ?9 r
            "https://quay.mirrors.ustc.edu.cn"
3 {& E8 h9 G% z( n& t  {8 ^          ], o5 A5 w* ~+ b% J+ |& `$ s: v
        [plugins.cri.registry.mirrors."harbor.kubemsb.com"]   在此处添加,在镜像加速器下面添加这一段
2 V- H% l! Y% f% b. X: F9 i          endpoint = [
: ?4 ]% V$ u, U2 Z/ o* k; D$ E            "http://harbor.kubemsb.com"
8 |% m9 I1 ]& w( y' g! e+ ~' \- Q          ]+ {9 j8 w3 l" `# N6 ?
    [plugins.cri.x509_key_pair_streaming]9 j$ f! Q6 O+ Y. Y, x
      tls_cert_file = ""
/ D# M# ~. E, b# v+ O  v      tls_key_file = ""8 y# R$ w( t2 p! h
  [plugins.diff-service]
/ k" v. q0 s  T) u- o: V    default = ["walking"]8 \" g# y) P# b9 g
  [plugins.linux]' M$ A7 W! A. k8 Y/ h
    shim = "containerd-shim"
: ?' t- n. b) ?7 t    runtime = "runc"
6 A* w0 y* E4 \5 A2 I3 s, w+ `6 K    runtime_root = ""
3 |* [& B$ Y+ I) F+ I8 q  M6 l: z    no_shim = false2 J- T( M8 G6 q# p/ B# P1 y) N* c* [8 z
    shim_debug = false
' F0 s& q" @  f( k2 @9 I  [plugins.opt]
- A2 @" r6 C5 h$ p/ D9 }7 Q    path = "/opt/containerd"& |5 J+ v3 S6 L+ r5 y) H
  [plugins.restart]& R, M+ `& |2 r" A
    interval = "10s"6 x: c1 f( ?  o* V8 d% _1 V
  [plugins.scheduler]) W- V. K" @; y5 z1 p) u
    pause_threshold = 0.027 b6 w) D9 @0 d2 h* X0 V( L& c
    deletion_threshold = 0" {7 X2 @) N) [1 }$ T
    mutation_threshold = 100
8 o) U2 v0 X5 E- C1 B# U    schedule_delay = "0s"
: x8 z* P. J5 F/ {5 l" t/ {    startup_delay = "100ms"% i0 H$ |3 \( ?$ j+ R9 y2 V9 R& L: n
代码语言:text
5 F8 j0 T$ y" r4 z9 o3 u1 Z复制
( U; G9 Z  y+ ?+ V: o' L重启containerd,以便于重新加载配置文件。& H. @3 k9 ?9 V% d1 s" c& \
# systemctl daemon-reload8 X. V" L% H+ Z
# systemctl restart containerd
8 c6 V( g: T  j% P6 I3.2.3  ctr下载镜像2 Q9 `( |% R0 w
代码语言:text0 n: Z% N4 Y* a3 Q0 {0 G% o0 `! K
复制
1 D2 ~7 M0 x# I8 F下载容器镜像4 U" O4 R. ?- A2 b* K
# ctr images pull --platform linux/amd64 docker.io/library/nginx:latest
, Q) w% H( X# s7 g代码语言:text6 o# d, Y/ t9 W$ ~3 z
复制& \, k. a2 V5 `4 q
说明:% R+ B! o8 ^5 `6 b/ W) X5 k
* --platform linux/amd64 指定系统平台,也可以使用--all-platforms指定所有平台镜像。3 A( ?7 W8 ]6 j6 w: t8 w# W
代码语言:text% w# N" s' ?( S6 Z! _' W$ d4 D" K
复制
7 D2 G  [  K- E7 L5 X查看已下载容器镜像- P+ X* r* e- o& x6 u2 F
# ctr images ls
: L% z- B6 G7 [& D0 n+ {REF                              TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                                                                          LABELS  N/ T9 O3 ^5 q. D7 m2 X

8 g( S7 p9 y* z7 udocker.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                            -0 C2 V- V9 w" M, m! Z
3.2.4 ctr上传镜像" H! {, T, f; F9 Q$ Z  Y' ~8 X. t
上传到Harbor library公有项目4 S. n) e  _' A, ^9 q8 i; M: n
. }2 f, M4 L" [4 l+ m
代码语言:text+ h3 B0 p4 q. A
复制
/ W1 O3 q! m4 L% ^, |) x( n# }; \重新生成新的tag
+ ]' z. H$ R- N' [# P# ctr images tag docker.io/library/nginx:latest harbor.kubemsb.com/library/nginx:latest& @: y3 z3 _) [( m- i( c% _
harbor.kubemsb.com/library/nginx:latest
9 u# @5 h+ w( b代码语言:text
4 w4 |# H! F" \) {. u2 U复制7 n' u7 [% R6 Y9 r. U
查看已生成容器镜像
! k" O' J8 [/ Y. B" z. \, K; V# ctr images ls& z( K: }! Y  s$ T! z+ O; v7 J$ w
REF                                     TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                                                                          LABELS* L: W- ]6 @' f) Y' H3 F
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                            -
( b5 y6 R4 z3 Y1 o! F  Zharbor.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                            -$ e: E( k. A! g( d& j/ o" x
代码语言:text6 `" R; B4 w0 e) Y3 B4 d
复制
0 a1 p  X' T/ h; n+ g推送容器镜像至Harbor( C, f3 a$ z* x) c2 R, }
# ctr images push --platform linux/amd64 --plain-http -u admin:密码 harbor.kubemsb.com/library/nginx:latest% v+ a; ~5 T4 A* O4 d; _" n8 m
代码语言:text7 ~! n: V& X/ h4 ]0 ?, p6 ~
复制5 x. L8 f) ~+ G$ n
说明:
& V' H" \: j8 N8 W5 R  K) ?/ l/ c, ^1 D( K8 g
* 先tag再push
* L" E' X9 P* F/ k( S$ r$ M* 因为我们harbor是http协议,不是https协议,所以需要加上`--plain-http`
  P/ X) B) l9 o2 E* `--user admin:Harbor12345`指定harbor的用户名与密码" q4 k( N1 i; O
代码语言:text; E, }' }, M. Q! j6 l
复制* G4 Z' \, N" f: s, Z/ c0 y
输出:& n/ s: l; s) v. o! s
manifest-sha256:0fd68ec4b64b8dbb2bef1f1a5de9d47b658afd3635dc9c45bf0cbeac46e72101: done           |++++++++++++++++++++++++++++++++++++++|
$ k, P4 s, K$ ~% `* V5 Dconfig-sha256:dd025cdfe837e1c6395365870a491cf16bae668218edb07d85c626928a60e478:   done           |++++++++++++++++++++++++++++++++++++++|
% @1 O( m/ u' W3 H# _' Ielapsed: 0.5 s                                                                    total:  9.3 Ki (18.1 KiB/s)
, l# o  j* H( }. G% b% ^" Q) g; f; F3 f% h0 B1 B0 b# [: G+ M9 K9 x
代码语言:text
" H( w& [6 ]( z9 P5 D1 v复制: z1 s& M) @6 [' C2 I2 X$ X
下载已上传容器镜像
6 L' p6 c( l! D# ctr images pull --plain-http harbor.kubemsb.com/library/nginx:latest
, a% ]& H& {0 b% R! ~/ V' c. b! X/ W/ F9 D2 y4 ^

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-23 13:50:42 | 显示全部楼层
Containerd 常用命令, v* i$ n4 m+ I% p9 ^1 x: t
! M. Y; ]) U( h% k3 `; [
在 Containerd 作为容器运行时的情况下,可以通过 ctr 工具或 crictl 工具来与之进行交互:$ q( X+ k; S0 B1 R, i/ c
ctr 是 Containerd 自带的客户端工具; a/ L/ ]( h: |; a) b
: h8 i& A5 l0 `" i4 t
crictl 是 CRI 客户端工具,比较接近 docker 命令0 {) ?# {% X# e1 H0 B
/ ^) }- ^% C+ [( I$ Q# Q1 h5 o2 s
此外还有 nerdctl 等类似工具,以后找机会给大家详细介绍。* R  K6 W9 I3 N4 }4 [

9 @+ d1 e$ U, Z
. L6 {7 }5 Y' ^3 S; v# _/ j( \. C! i) C  `9 U; C. y/ {
1、ctr 命令
( t% a0 A2 E* B0 y5 i- n" I: G. V3 P* X# o! L: ?, Z  S# L
# 镜像操作命令5 n* w" u1 w4 R& R
ctr -n <ns> i xx                         # 镜像操作命令格式,默认 ns 为 k8s.io
  Q' E  V- h& e9 _ctr i ls                                 # 查看本地镜像列表,同 docker images
) h5 l7 ~. Y* X5 uctr i rm <镜像ID或镜像名>                  # 删除本地镜像,同 docker rmi -f <镜像ID或镜像名>" R7 B: a/ N/ V
ctr i pull <镜像名>                       # 拉取远程镜像,同 docker pull <镜像名>
0 m9 Z& S. b7 Q' mctr i tag <旧镜像名> <新镜像名>             # 修改镜像名称,同 docker tag <旧镜像名> <新镜像名>
" O8 [5 ^$ c7 {ctr i import xxx.tar                     # 从本地文件导入镜像,同 docker load -i xxx.tar  v$ c1 G* t& @
ctr i export xxx.tar <镜像名>             # 导出镜像为本地文件,同 docker save <镜像名> -o xxx.tar( o/ W: W; C& U+ ^

6 D) H/ r0 A. Q2 ~/ H5 y2 u# 容器操作命令
/ k! k7 ~# V- J. M# y1 }ctr -n <ns> c xx                         # 容器操作命令格式,默认 ns 为 k8s.io
7 ~- l3 ]; f3 ?2 G) j+ `ctr c ls                                 # 查看容器列表,同 docker ps -a,查看所有容器* q& o+ ]2 U; b) }6 p  u* I
ctr c rm <容器ID或容器名>                  # 删除容器,同 docker rm -f <容器ID或容器名>
; `' K0 R% S1 s! Tctr c info <容器ID或容器名>                # 查看容器信息,同 docker inspect <容器ID或容器名>
" Z& h, W6 J& U! [6 f! i5 M, r$ ^$ v9 sctr c create <镜像ID或镜像名> <容器名>      # 创建容器,同 docker create,仅创建容器(容器并未运行)
' k+ I6 U0 F: I) J6 p
% r& `0 p4 J8 M1 G  j( f2、crictl 命令) ^5 K# G: r% N% o5 G9 t  R9 P
# 镜像操作命令
& C+ e( S3 v; b( ~: pcrictl img                               # 查看本地镜像列表
9 J. x" H6 q9 n. {% h) Acrictl pull <镜像ID或镜像名>               # 拉取远程镜像/ ~1 I) T# L9 v
crictl rmi <镜像ID或镜像名>                # 删除本地镜像5 P1 n& O  L2 V' A1 K2 R% o

- S4 d, C9 W  S) w6 [  o1 o# 容器操作命令
; @0 w  d; A+ z) V, }% K9 }% S. mcrictl ps -a                             # 查看容器列表+ \9 }: g& g, a+ `* s5 n: `. [
crictl rm <容器ID或容器名>                 # 删除容器# e3 V1 u) _  R& s1 f
crictl logs <容器ID或容器名>               # 查看容器日志
+ \; K, e8 {" R. {1 c+ }7 tcrictl stats / statsp                    # 查看容器 / Pod 资源使用情况

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-23 13:51:15 | 显示全部楼层
# AMD架构
  `% j/ |* ?3 b0 Rwget https://github.com/containerd/co ... -linux-amd64.tar.gz3 @  W1 u% e( G! c5 O
tar -xzvf containerd-1.7.21-linux-amd64.tar.gz -C /usr/
; I7 T9 F3 m5 t3 [) {; I4 Y0 l; A- n" D
$ I* K4 I1 H% B1 D2 ~& nsystemctl daemon-reload
) J9 X) w/ a3 m8 {3 q- osystemctl enable --now containerd
- @& _$ d5 E% ~ ! H, r) o5 X8 ^( q* [0 L5 A
===================================================================================
. i  u4 d" N% I3 b( C4 P3 t# ARM架构$ B( U. d+ M9 @4 z, C0 {
wget https://github.com/containerd/co ... -linux-arm64.tar.gz
" G- _# h% _) `+ P6 [3 g+ ztar -xzvf containerd-1.7.21-linux-amd64.tar.gz -C /usr/
% b3 T& W3 }: \3 x" h( V$ c
' Z+ G' L# W* Q( ~7 q# L( U+ ysystemctl daemon-reload
* l; R0 u: y, E5 vsystemctl enable --now containerd

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-23 13:51:29 | 显示全部楼层
# 拉取一个镜像
& H( d7 E( _0 X" kcontainerd ctr image pull docker.io/library/nginx:latest! E5 |# r# N0 ]

0 g# y; _' H9 _) @) T! F) l# 创建并启动一个容器
# s2 t- J% l* ^/ J6 h, Zcontainerd ctr run --rm docker.io/library/nginx:latest mynginx6 W7 z  ]' T8 N
, C' G4 `' J' C; ]
# 停止并删除一个容器
2 ]  @; K  \% `, J1 ^containerd ctr stop mynginx0 L( y$ e3 N2 h
containerd ctr container rm mynginx

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-23 13:52:38 | 显示全部楼层
配置Containerd' D% j$ m6 G# g2 C% m
在配置文件/etc/containerd/config.toml中添加以下内容:& W& b* O! p* M, w

" [, d/ J, y' N, n& {[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
. Z# T; ?; U4 T3 M7 p ...) K; u5 n5 J, Z* s, n
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
/ |- y+ j2 Y4 e   SystemdCgroup = true

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2025-1-23 14:01:01 | 显示全部楼层
containerd config default | \3 q- r; `( z' V6 o. `
  sed 's@/var/lib/containerd@/data/containerd@g' | \' i; `. S; h7 k# B( a9 Q
  sed 's@k8s\.gcr\.io@google_containers@g' | \. y: a; a  g0 n% a% Q6 p( a+ W
  sed '/SystemdCgroup/c \
( @1 v, J# ^2 t; }( e- _5 D* H            SystemdCgroup = true' |
3 F: j# O& m$ p8 g7 \  sed '/registry\.mirrors/a \7 o( R; \: @) q$ M  [$ h
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.1.10:8082"]\
: a& y; `' b5 }+ ?1 ]          endpoint = ["http://192.168.1.10:8082"]\
0 D! |8 U: V; E. O' Q        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\
3 @$ ~# _1 f7 U7 X/ }          endpoint = ["http://192.168.1.10:8082"]'> /etc/containerd/config.toml* U6 }1 m; p9 z

+ o& T/ }  b3 z5 m9 I0 x* S2 j) ]. o% [
2 [  f2 q7 q7 o
$ q# w+ P. g& m# I
9 I. K5 x$ \$ ~5 \9 k& v1 i% E+ M( Xhelm upgrade -i --create-namespace ingress-nginx ingress-nginx/ingress-nginx --version=4.0.19 \4 I3 c. H3 P: |8 q' F

  R! m0 O* F( V) d- O, }    --namespace ingress-nginx \8 ?6 q, |% u- J7 P9 I$ b
    --set controller.image.repository=ingress-nginx/controller \
) r6 w0 Q0 \' z, D- v    --set controller.image.digest=null \% l8 i- w( M- q1 N4 b+ `% p" V6 X9 |
    --set controller.dnsPolicy=ClusterFirstWithHostNet \
6 p% }5 M/ q" x: S, z6 G    --set controller.hostNetwork=true \
* |4 w( m6 V" D5 U0 `, N% `1 a  L9 F7 U    --set controller.kind=DaemonSet \
4 w. {( ~* ~7 ^5 y. Z  B. r    --set controller.service.enabled=false \
0 L& P$ X- K& G1 O: f0 {    --set controller.reportNodeInternalIp=true \
( b- m8 l- O( O) W    --set controller.admissionWebhooks.enabled=false \
# s/ z4 Y0 [7 E$ s# t: |9 f    --set controller.ingressClassResource.default=true \
9 ]( n7 I- a2 {  L4 P! c  B    --set 'controller.tolerations[0].operator=Exists' \
0 u4 l* f/ w4 ?7 I& f    --set 'controller.tolerations[0].effect=NoExecute' \
6 J. l0 S4 ~( b! @2 j    --set 'controller.tolerations[1].operator=Exists' \" B6 K( [0 W/ Y: T' l0 g
    --set 'controller.tolerations[1].effect=NoSchedule' \
. D5 Q3 A- P  A5 ?- s) P    --set controller.config.compute-full-forwarded-for=true \
; t: g1 d" d( Z0 O- d  j    --set controller.config.hsts=false \
# v$ }) e  J/ P3 u    --set controller.config.use-forwarded-headers=true  v7 i9 E- c  U7 o
, o$ }% H4 V& e+ G! E' x# ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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