- 积分
- 16841
在线时间 小时
最后登录1970-1-1
|

楼主 |
发表于 2025-1-16 17:29:46
|
显示全部楼层
1、Containerd镜像管理
! H+ H0 o& R7 j1.1 Containerd容器镜像管理命令; |, T' R/ _ h$ f! g: p
docker使用docker images命令管理镜像, _# [. r/ s! S! a. v! y& E4 l2 S
单机containerd使用ctr images命令管理镜像,containerd本身的CLI
4 E: b+ D: q' o( |k8s中containerd使用crictl images命令管理镜像,Kubernetes社区的专用CLI工具
# p& C1 y+ u/ L; K- h" P代码语言:text
2 R+ Q2 V' n& l( q3 w j复制
* K9 z" z4 C, d; \4 b" m& D获取命令帮助; d% q# O! ^; \% `
# ctr --help! l7 S. d8 S# Q, v5 F
NAME:* O/ R& j- X1 R! [0 v
ctr -
) ^& M" j; w& A __
/ X0 B( I3 B; x9 Q _____/ /______2 h& y/ O# U( }7 K( H
/ ___/ __/ ___/3 p1 N8 n1 P7 a- x9 a# n: u8 Q
/ /__/ /_/ /6 h% U' |8 ~' x( d, s" ^% z
\___/\__/_/6 r$ H L5 \- o" t$ q
' Q' ~$ D% u$ k; h
......
, w* U, P& |' {* u$ ?9 p代码语言:text
: b4 {, u+ U( s2 c4 J. C" x/ Z- z复制
0 J/ r" o7 ]) l( F p获取命令帮助9 d- a1 A4 Q: g. j& G8 W# `3 R
# ctr images! P- [$ i/ k; Z" p& g
NAME:
/ ^ c4 r$ l3 T3 S4 ?. l1 r3 q( c ctr images - manage images0 r8 V% M: D# z7 o# m
8 U: b: h- [' r( Y' Q3 d0 r5 g8 A
USAGE:* G9 k4 O1 [' z
ctr images command [command options] [arguments...]
; D4 M0 h) Y' s* w5 S4 @8 C$ b$ J% D) e' C, ?. i/ A
COMMANDS:- O5 c8 B- W8 q a7 S; R3 L* D
check check existing images to ensure all content is available locally3 p" ?* s6 E$ q/ u$ \4 B
export export images/ S9 r* d+ ?* g% p6 X) {+ w
import import images
6 M: b/ Y2 h7 C/ @, W list, ls list images known to containerd! X" b# `, L6 [0 e2 C9 u
mount mount an image to a target path A" p* c" y* S! g% z
unmount unmount the image from the target
) X! B" s" T0 C; K" x pull pull an image from a remote( N+ W. x; z4 _0 z: e
push push an image to a remote" G+ \2 A) L) H7 x$ D- ?3 m
delete, del, remove, rm remove one or more images by reference7 V% Q( n4 C/ r4 Q2 n r ?
tag tag an image' M: C; \+ I. }# U& ]5 Y4 P
label set and clear labels for an image
7 O0 f3 c3 v5 l convert convert an image+ @# ^0 _. D$ E& }) p: o) Z
3 @) F* W( |" I0 HOPTIONS:8 e W8 V% ^( G9 g; _2 s
--help, -h show help
/ W4 V$ L/ `2 T6 n; t1.2 查看镜像
* P- A k& V* f7 s! \0 e代码语言:text
4 ?6 H8 x% u- @复制: l2 `; f9 g- {# H& L2 g! l
# ctr images ls
# r0 ?( e+ n+ U9 l2 E* nREF TYPE DIGEST SIZE PLATFORMS LABELS
. Q8 V" Y: c" W2 ~' E" i4 X1.3 下载镜像# s! w3 S9 U" N7 Z5 I
containerd支持oci标准的镜像,所以可以直接使用docker官方或dockerfile构建的镜像; W6 q$ p2 i; v$ q2 o8 o
0 e6 }% \" b3 u* Q- d代码语言:text' Y' a5 p$ j) C; j5 J/ o
复制
5 `6 G1 E4 j" b3 \& c3 Y8 z# 镜像名不能简写,--all-platforms:所有平台,不加的话下载当前平台架构& u4 S9 R! {+ ^7 i' v4 m9 R4 H9 g! W
# ctr images pull --all-platforms docker.io/library/nginx:alpine
1 M" t% b0 z; a# ctr images pull docker.io/library/nginx:latest
) c- v) k& Q) H5 c; ~# u2 p4 z8 J
# uname -a
1 v a1 L, z7 O6 B5 |1 S$ Z# y代码语言:text7 ^, s8 B6 P0 A# U, u
复制
- _" v) O' |4 M' a* z2 Z2 S( Y" J说明:6 Q" r5 \; A% s5 u. y: P& L
这里ctr命令pull镜像时,不能直接把镜像名字写成`nginx:alpine`1 H+ r5 X6 q" e& r9 d- }/ n% X
代码语言:text
& x# [4 Y7 ~ @1 W$ v' K复制
; ~: w& F' |" O查看已下载容器镜像" e# d* ]7 |, ~2 |/ {
# ctr images ls
1 s* ?( w) o# f5 l8 a, OREF 7 d3 F% s% w( j$ d7 A
1 \$ D6 l; M7 P! ~7 X1 _! d7 f
TYPE - N* ~0 ^3 e5 d! V1 k' t, a
; T6 L/ }) y* X/ @9 o c- `DIGEST
# v+ o3 G4 [* G: ~$ g
1 Q5 d7 D v3 C- u; i6 Vdocker.io/library/nginx:alpine, o8 Q9 `0 l% s. e
$ y$ H, p1 W& o
application/vnd.docker.distribution.manifest.list.v2+json! T4 X* ^8 z7 R$ H- j
% S8 r9 M$ k& t5 ^0 i2 M6 H. Gsha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3
- }# v$ [% B/ z! O) j; \5 P- d. ?+ |- L" i1 {. s5 V3 f
SIZE ( A% g1 G$ ~# v4 Z8 F: y
* N+ a; r9 z1 B2 z. gPLATFORMS $ F2 X0 f6 J$ E& T9 U7 L
( `2 R, \ ] T& T. Q6 z
LABELS
/ j2 f9 i- i3 h1 b5 @ S8 M+ ?" F# J4 ~2 Y% K* q3 A! P. S/ P0 u
9.7 MiB
' }' A+ Q0 s% y; [0 c" g* L- P) r& }5 z3 B# ?& W: g
linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x
; o7 E( p& V- Y4 c# W
/ r+ T) m! ^& i8 \& m, e代码语言:text; J. C, B9 J2 p# z P7 @; Q" X; J
复制* \# E; O/ b3 d e& f/ i
指定平台下载容器镜像
2 N! x: b2 R6 {' J4 o' h# ctr images pull --platform linux/amd64 docker.io/library/nginx:alpine
6 R0 s% A0 w' d$ U0 `没有镜像是无法运行容器的。
2 |3 `; I) M5 }, |6 e8 b( |1 l& |0 w% @( m( c7 p% \
1.4 镜像挂载7 i$ h, a( Q+ I. s- n
方便查看镜像中包含的内容。
) V# y, A) V, J0 h$ K, F/ |+ V
( j- ]( x3 s9 O$ [& |代码语言:text
j) c- t# i+ ^1 y* T复制
9 M& g3 x6 x) v) k. g) N' X3 T( a( j3 h把已下载的容器镜像挂载至当前文件系统 \& q& O6 o! H' c0 I# T9 Y
# ctr images mount docker.io/library/nginx:alpine /mnt2 s: K* |' v4 f6 Z7 n
sha256:af2fcce448e2e4451a5f4796a9bf9cb5c9b5f88e0d6d10029cada42fb9d268ac. N0 f! d8 s! @% _+ q
/mnt' |6 a0 l' D) D, M0 a$ q
[root@localhost ~]# ls /mnt6 p6 D2 W2 E0 P! D O7 U
bin dev docker-entrypoint.d docker-entrypoint.sh etc home lib media mnt opt proc root run sbin srv sys tmp usr var' X4 l4 t* L5 s4 h3 U# O
代码语言:text
- I% O) P% {1 x$ W) y/ L复制
) Q* ~" ^* s+ H9 n( s! m* ]卸载2 a2 B- i! i; D7 C, ]1 _/ C) q
# umount /mnt' G. y2 g j4 r! o
1.5 镜像导出
& X' V5 o: i! W代码语言:text
+ _7 R* ?/ K! U# X7 V复制' ]8 t. f1 t1 J9 z$ u
把容器镜像导出
, {% w# h; b9 ~& C* F# ctr i export --all-platforms nginx.img docker.io/library/nginx:alpine
7 T$ p' _: J) ]! @% n$ @代码语言:text( }# _7 K( v! R! F0 I- [& Y
复制
0 G3 u( u2 ]. F c# r说明
6 A7 p! m! Z7 H8 I--all-platforms,导出所有平台镜像,本版本为1.6版本,1.4版本不需要添加此选项。0 H) l3 @' I" q* ~% j2 D X; V0 z; _
代码语言:text
7 d& E( ?7 D& X7 a. k9 q) p复制
) L, C' ]! y7 |查看已导出容器镜像
% W! ~) r* ` u5 ?. ]# ls
% y( e, @" a" e: o: I% d" X7 Vnginx.img
( N) D4 S0 b% |3 |8 X) _: L) K7 [: \4 u( Y/ S9 X
# ls -lh' A% s! }! h; f1 m: J
总用量 196M7 j8 l: ]0 W5 ]
5 S. i w9 c! Z$ ~# i: E% U. e
-rw-r--r-- 1 root root 73M 2月 18 14:48 nginx.img" E& p2 l: ~0 N7 }1 X, a
1.6 镜像删除
6 a( k/ m: T/ g1 L8 m Y+ E& K代码语言:text7 m& R) ]3 q. T( M
复制" w: B1 U* T1 T7 }( J' O
删除指定容器镜像/ x5 s* e8 H/ I3 V/ d7 l
# ctr image rm docker.io/library/nginx:alpine3 ]! D% Y# X" u' |
docker.io/library/nginx:alpine2 P6 H& J, J7 C$ m7 q
) K# A' M* h5 V
再次查看容器镜像, u: d$ R2 Z# B8 P; U
[root@192 ~]# ctr images ls# @( z% p' U. ]# j! i
REF TYPE DIGEST SIZE PLATFORMS LABELS
5 a! }+ Y9 v2 p: ^* c1.7 镜像导入
' S) x- f# M- y4 s7 T4 x代码语言:text/ h; E9 D' {* u# c
复制
+ C5 g8 A' |0 G B! J% N导入容器镜像3 D2 j2 J i+ T; v3 Y6 ?% F( R8 m
# ctr images import nginx.img) ]. N9 Y% F3 j
unpacking docker.io/library/nginx:alpine (sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3)...done% H" \3 l% T+ e2 J6 U( w! O6 @+ G$ ^
1.8 修改镜像tag' w: P5 y$ `0 \. G7 Q' k7 C
代码语言:text5 _1 K6 |0 ^2 Q& `/ d8 \' o
复制$ L$ R$ Q8 s Y A! K6 N
# ctr images tag docker.io/library/nginx:alpine nginx:alpine
' C* r0 C! j! o/ v7 d- ?* anginx:alpine5 A7 _- \" s: \1 B' F- c: V4 W
* Z% H* t" `. s5 S+ U# 建议修改tag的名称为:镜像仓库地址/目录/镜像名% B$ s1 b* A- ~9 r5 _
代码语言:text) T7 f% Y/ d; I$ h
复制
) }3 `$ j, `2 _( J+ ]说明:. u1 c- J( z6 w% s6 E+ _$ k) R
把docker.io/library/nginx:alpine 修改为 nginx:alpine/ {8 \" J6 j% _* @; E
代码语言:text
' E+ P9 u; c9 g7 @% V! d* ?; r( T# H复制
$ L8 n, F- i& o5 W) B5 g U查看修改后的容器镜像$ x% o u! R1 t
# ctr images ls
3 M% u; M5 k9 iREF TYPE DIGEST SIZE PLATFORMS LABELS
: {9 l; n5 k5 Zdocker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 9.7 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -0 ]' e2 X: K4 l1 C4 }) I
nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 9.7 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -, N$ f# `2 ?0 }% w' b8 f. t
代码语言:text
) s9 t+ r6 L6 N: x复制
% F; P! F/ r- R* o修改后对容器镜像做检查比对
! F5 b' i9 M2 n% s9 F6 N& P: W# ctr images check. R" y' Q$ w" R0 L3 |% t
REF TYPE DIGEST STATUS SIZE UNPACKED
3 ] Z: }& k0 K: Q' i/ ~ ydocker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 complete (7/7) 9.7 MiB/9.7 MiB true
! v+ i, |! h$ H. T+ U8 F
7 g2 l5 H; i1 F4 V2 \nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3 complete (7/7) 9.7 MiB/9.7 MiB true
3 `) C4 @' G! u; S" ~9 a% K2、Containerd容器管理0 d9 K& g! {$ o" P. U7 u
2.1 获取命令帮助
7 E+ S1 C/ ?# _8 e( K( b; g4 p- \2.1.1 获取ctr命令帮助9 d/ g% ^- W, w: P) Q
代码语言:text* p% ~! l" I& Z" @
复制 F( w' Y) Z6 r6 |% d
[root@localhost ~]# ctr --help: P7 a( v1 m8 C
NAME:& Q( z a* w% P- l: }
ctr -
0 V2 I5 v6 M% w! e __. \8 ~. w- e6 M, o7 ~ H" ^7 f0 O
_____/ /______; x* ]7 h7 z: S4 N/ G$ \% W# e* r
/ ___/ __/ ___/) @$ x5 s4 A' ]" k/ i4 K
/ /__/ /_/ /
6 u; h* `/ w0 [# @7 m% P8 R\___/\__/_/7 b; Y2 f8 A! m' l- ?2 q3 m
+ g. z8 V s# C0 ~4 c$ v
containerd CLI
- p, I: ~; I0 c& l% Y+ I: }' r. @8 |* B+ t& A' i4 t/ q/ P4 z
4 h T. [7 U; ^0 w' N8 n: K......
) w$ R6 Q: z% M. p# p" M2.1.2 获取创建静态容器命令帮助
7 j2 Q8 \4 F8 e# U2 n代码语言:text
7 n" Y* k2 d# e6 {. |, t复制6 d. S9 X& ~; ?4 w2 g5 A$ L) v& A0 y. R
# ctr container --help- C/ B2 c" m% f7 Y3 @; p1 o o
NAME:. j) A$ [8 N8 t2 ]! }
ctr containers - manage containers$ P- w ]' \5 B' p8 _8 H
+ ]# S$ l* \' Y% h; J9 x. lUSAGE:
: e( f5 Z& S7 M# P& M ctr containers command [command options] [arguments...]
, O8 w: `5 L: y& O+ M' i
6 ?# S. N$ N2 o1 C1 B7 G' P7 gCOMMANDS:/ j" T, l0 A5 y9 O, p
create create container" O8 g# Y: A, \2 E( P( Z$ n9 A! h% k
delete, del, remove, rm delete one or more existing containers4 N B7 P M$ A
info get info about a container/ s2 V1 w! p+ `! G% F$ t. x
list, ls list containers
0 x& L0 t# J# V2 ` label set and clear labels for a container
: G4 P3 w9 g6 b3 I2 z3 {) Q/ w3 Z checkpoint checkpoint a container2 m5 b4 g9 B- n) P, G
restore restore a container from checkpoint
+ P w D& V) _0 J3 u d0 A+ ^8 }
OPTIONS:
T, o. ]( b, \2 q --help, -h show help. A. x* w3 r. ]& m! K" O/ v. K; v
代码语言:text
% W# q Y3 K! V' e7 V! }复制
& _" i6 v# X* S说明:
2 n6 ^ g% v( I$ }& B# _9 p* M3 ?& _, u0 A
使用`ctr container create `命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。这个 container 对象只是包含了运行一个容器所需的资源及配置的数据结构,例如: namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程(本案例为nginx)还没有启动。需要使用`ctr tasks`命令才能获取一个动态容器。# ?; i: J* N4 N8 p( m, r% n
2.1.3 获取动态容器命令帮助! `8 g& m" r T! B: u% J
代码语言:text
2 A) e4 o8 G, `9 p2 G- K8 s复制
. C' q/ @( }3 Z0 `' k0 H( ?# ctr run --help
3 m5 N5 P0 J, i# `0 E% w4 ]NAME:! Q' u# a+ b: f6 r
ctr run - run a container: `0 B/ ~' q4 I) `
/ }# e3 o* B. y" Q& a. e0 E......% p( b; @6 x; g+ c9 B, W+ ^
代码语言:text0 `' `& E/ s' e' y. B5 L8 `
复制' I) ] O* ^5 C0 V! w+ i! [$ ^
说明:
: {( `4 f: k# c+ A使用`ctr run`命令可以创建一个静态容器并使其运行。一步到位运行容器。
@) @! e1 B9 C" s2.2 查看容器8 u$ C, T* _. {( s/ P' T z) |
container表示静态容器,可用c缩写代表container
' J+ ]5 V/ Z" y6 Q- X' |# m% n2 E9 D6 c O+ D0 n
代码语言:text
$ T. N, \; g5 M8 R- e( |# ^6 ?* ^: ^复制! j' \* u9 @' a0 M1 M% p. c. T, M
# ctr container ls! [1 j# N, N, J& f7 G0 Y" V6 E
CONTAINER IMAGE RUNTIME
- Z- B) J" Y- G% D0 d1 x' z, [或
$ Z e) x6 L- m" n8 Q* Z5 F: m5 L
- x7 o, `' E9 Q9 p \- O代码语言:text8 s2 C8 H* q$ u+ i/ r: d/ b
复制
) y+ e8 m. q' J$ q: |/ `9 }1 t7 C( T. R# ctr c ls
t( f" Z9 R: Y9 z2 ]! ~8 H# uCONTAINER IMAGE RUNTIME0 @) E; k1 M. ?2 h# R
以上命令无法查看出来容器的静态的还是动态的
4 C% G# f+ P1 }3 Q: A
9 p+ X+ E `6 a$ q. M, g) J2.3 查看任务
j" }' l$ K8 o) |9 c& b: y! ?task表示容器里跑的进程, 可用t缩写代表task
0 N" g7 n- n+ }
! `1 y6 K2 i$ E' k" T代码语言:text
& [& N2 D9 P# k2 ]: K2 `. a+ x! W( \0 ?, Y复制
" Q( `# W; D& A' c2 h k! k# ctr task ls8 ^% O% M' R5 }& X/ T+ ^
TASK PID STATUS8 R- y, x; ], |9 M7 B
或
" R1 Q& Q1 `3 h3 B: Q' W# e4 n8 v+ _
1 E+ J$ O, G+ \5 L代码语言:text
c& g9 a8 b) S# w复制
3 S, d/ q1 q( Q: ]7 V+ u# N4 Y# ctr t ls2 K5 _3 u' v" ?9 C0 p
TASK PID STATUS
8 f# ]8 N4 z) S+ }& X' ~2.4 创建静态容器
, z7 E( Q1 U& h7 C3 l% q, O0 Q代码语言:text+ q0 y, n% E/ k5 V
复制2 X* {7 X5 j4 ]% l
# ctr c create docker.io/library/nginx:alpine nginx17 Z% i5 g9 O0 D5 s8 J7 ~% f, A
代码语言:text
7 O3 z& p7 |- Y7 h. C复制9 z" f3 ]; r) b
# ctr container ls. l9 P1 D5 K$ d& Z
CONTAINER IMAGE RUNTIME
' _, x7 A+ \: |* {/ qnginx1 docker.io/library/nginx:alpine io.containerd.runc.v2. c1 Y3 @+ |# U) {
代码语言:text
8 i0 @3 u% M1 a! H, h2 U5 \复制6 t y) z- O; ]) K# W) w
查看容器详细信息. p y' `( a9 t9 c
# ctr container info nginx1 G. P- P( m1 d; _ E4 f
2.5 静态容器启动为动态容器
& p5 I/ e8 J s9 O7 g代码语言:text1 s+ e+ K) v$ x6 v! \
复制$ N. f. a. v) @( ^! g- J+ Z# G7 N
复制containerd连接runC垫片工具至系统
3 h4 Q8 G# Q, f# ls usr/local/bin/
1 D+ _) v9 x% y& y* p, icontainerd containerd-shim containerd-shim-runc-v1 containerd-shim-runc-v2 containerd-stress crictl critest ctd-decoder ctr5 J" r* ?5 a K* K& d0 \
[root@localhost ~]# cp usr/local/bin/containerd-shim-runc-v2 /usr/bin/$ T( i E& Q) k( R; G& y( Y) n+ M/ Y
代码语言:text
0 C/ t0 K/ k& _复制
" l8 d" H4 x5 y9 I% L) w% X启动task,即表时在容器中运行了进程,即为动态容器。, m9 R6 k0 e m! D. c2 S
# ctr task start -d nginx1
* d1 f0 O: ^' P+ Q$ Q( P/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
6 |5 d- i/ U7 x/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
' v$ _. `% B: M# C, H+ k; y代码语言:text; D* X8 }/ K7 D2 c1 P
复制* ]" w6 @) ~, B/ s
说明:
6 M4 a! ~9 l+ F2 k* Y1 y-d表示daemon或者后台的意思,否则会卡住终端. s1 G H e8 M3 a8 z4 f
代码语言:text
- X# o& {! P( E* n" d复制1 `: v* y# [, v- I
查看容器所在宿主机进程,是以宿主机进程的方式存在的。, m4 x% P3 V; L7 V
# ctr task ls
8 I& F& T3 q/ Q. x1 \; j* w4 O! `- gTASK PID STATUS
# W. ]/ s) P: V! unginx1 3395 RUNNING
7 ^1 S9 i" Q2 `( J1 E' C* M代码语言:text1 h4 F5 X9 a2 [( r! ?, }- S
复制8 ]- B+ y8 o' \) F8 j
查看容器的进程(都是物理机的进程). g& @; L5 E M/ ]- v- D: @
# ctr task ps nginx1$ F3 l+ M* M% A; s" E0 B( \
PID INFO
6 A4 r! _6 {# R% k5 a3395 -
! `0 H, W0 c4 \- Q0 W1 A: C/ i3434 -+ y V- w3 @* Y8 a3 {
代码语言:text4 @: S1 z( O5 n4 }
复制/ E9 ^% h; z" l" U+ \
物理机查看到相应的进程# ]- X3 E; I$ Q3 T: {
# ps -ef | grep 3395
, m( x3 l% K( [2 c V. croot 3395 3375 0 19:16 ? 00:00:00 nginx: master process nginx -g daemon off;
7 j2 h# s' L- d6 G; f3 k& K3 {101 3434 3395 0 19:16 ? 00:00:00 nginx: worker process
3 I: Q Q" d* {$ J B3 }/ X% W8 y2.6 进入容器操作
" o5 t `2 W* V( O! l# M9 V代码语言:text1 c0 j( ~3 x' y- W
复制" F. b" v( L3 b% T6 K. m9 }6 O
# ctr task exec --exec-id 1 nginx1 /bin/sh
) g- K" G( D( d k0 w& {7 C
. ]6 V: y* U2 Y$ K d* Q( ~: L$ e$ N# ifconfig 查看网卡信息
, @' n3 \6 i5 v1 D1 j8 r+ ^
% `% g4 R& j- v/ N+ u...1 m+ @+ y1 { e$ w. w" c! t
$ z, ~ |+ i0 a4 m; z' d
# curl 127.0.0.1 访问本地提供的web服务; J6 l. ~1 F* l) H. N
..., @. O' D" B* X% g$ A4 ]1 P) ]9 g" O
代码语言:text
, ^6 a0 s3 |# j复制# K% d* f! @; l" L7 a
说明:" x" Z1 p5 g' ^0 M6 h% S, V4 V
为exec进程设定一个id,可以随意输入,只要保证唯一即可,也可使用$RANDOM变量。
6 ]' l/ z& x5 I; O7 c/ T# | |2.7 直接运行一个动态容器
8 G$ ?$ d+ R, y' O' U7 P代码语言:text* q" _- ?& w. G" Q& Y
复制& T( Q4 u7 ?* e! i8 z$ Q
# ctr run -d --net-host docker.io/library/nginx:alpine nginx2/ g. q! O$ n: e4 j9 o/ h( [6 {% B
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
& o8 F0 }. e# s7 f" a/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/4 D% |8 A$ D! C. {& [( W- |
代码语言:text
( o G3 }# V1 r0 [& r复制
5 D6 Q S8 ~! l, u1 \5 H说明:
/ f. o. O3 F( [/ q* -d 代表dameon,后台运行9 a L5 u, r5 Q$ H' n8 V0 `6 t
* --net-host 代表容器的IP就是宿主机的IP(相当于docker里的host类型网络)
1 m& T3 `/ Q( b) ^代码语言:text
0 ^4 L: e# N7 V/ N8 c* ]0 F复制
1 s6 l4 U @0 `查看已运行容器$ W7 ]) O- x- y, a8 ]- z
# ctr container ls
/ T6 i; N0 t7 {2 k m4 QCONTAINER IMAGE RUNTIME
# q3 |; e V5 Onginx2 docker.io/library/nginx:alpine io.containerd.runc.v26 A4 u W* J& `! d4 v( P) D/ J
代码语言:text
; O" S% c; x# S8 x. X. q4 [, U* A复制8 V$ a$ D8 E2 j
查看已运行容器中运行的进程,既tasks
! [2 h% p$ @2 T, P# z# ctr tasks ls
4 C/ S5 h4 s; p9 k5 R" c6 nTASK PID STATUS- ?4 r3 D% K8 G" u& J( j: |/ O4 G
nginx2 4061 RUNNING
; l/ f0 H/ U+ ?( ]2 Y' _$ z+ W- A代码语言:text
$ Q# i) p6 V& Y+ n }2 R# p复制/ Q% u. {0 x& o
进入容器9 ^2 W% z; @7 \" k" o
# ctr task exec --exec-id 1 -t nginx2 /bin/sh
: {" e" |: r) Z" S3 I6 r代码语言:text7 r! ^. b5 M3 L: q4 [
复制
* K, [1 Y9 M/ f/ G, V/ # ifconfig
7 a G5 B# q! l% |ens33 Link encap:Ethernet HWaddr 00:0C:29:B1:B6:1D
# `- Y5 L9 T/ ]% ] inet addr:192.168.10.164 Bcast:192.168.10.255 Mask:255.255.255.06 z) X) s8 q4 l1 n6 l- {' ~
inet6 addr: fe80::2b33:40ed:9311:8812/64 Scope:Link
: _' U' V: N# d1 s6 n! }! C# ]% O, I" I inet6 addr: fe80::adf4:a8bc:a1c:a9f7/64 Scope:Link/ m4 \1 {# s+ H7 B* c, ]/ b
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
5 a4 d, a- ? L* c. { RX packets:55360 errors:0 dropped:0 overruns:0 frame:0. R5 V! l4 n J- b
TX packets:30526 errors:0 dropped:0 overruns:0 carrier:00 x. g" j) U1 Y/ |
collisions:0 txqueuelen:1000* Z8 L6 j2 e# A, R
RX bytes:53511295 (51.0 MiB) TX bytes:2735050 (2.6 MiB)& z1 }& [/ B: Q
1 X) w! ~' K6 w% d
lo Link encap:Local Loopback
! l- x1 m5 D* r& R- c inet addr:127.0.0.1 Mask:255.0.0.0
. ~# m4 i! ]) X) y+ e inet6 addr: ::1/128 Scope:Host. }7 w) S; G" h1 y# _- w
UP LOOPBACK RUNNING MTU:65536 Metric:19 h+ v* i: M5 O/ O# \ w) |# ^
RX packets:68 errors:0 dropped:0 overruns:0 frame:0' K* F" x, x( \2 m. |* U# V3 u' n9 D
TX packets:68 errors:0 dropped:0 overruns:0 carrier:0$ X. m- O5 K" ]
collisions:0 txqueuelen:10000 j5 l5 f& S- ~9 y. S9 u
RX bytes:5916 (5.7 KiB) TX bytes:5916 (5.7 KiB)
5 r; h5 C, i- q- D/ P. ]2 n( f% {; _% R6 z) q+ w! ^
virbr0 Link encap:Ethernet HWaddr 52:54:00:E9:51:828 m# p2 C! A+ J0 J" s3 G
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
) ^; a: ?5 h% g0 S& R UP BROADCAST MULTICAST MTU:1500 Metric:17 e/ y# Q2 Q/ D! F! B- k$ q( F
RX packets:0 errors:0 dropped:0 overruns:0 frame:0, L" D- I' U! |# ?# J7 }6 y
TX packets:0 errors:0 dropped:0 overruns:0 carrier:03 J6 r7 o) N) w, i u9 G( e( f
collisions:0 txqueuelen:1000
8 S2 e( s6 d# q0 B3 h# Q RX bytes:0 (0.0 B) TX bytes:0 (0.0 B), v) S9 w- y3 ]+ l1 b' W* {
代码语言:text
F: I$ L+ W- [复制
# h# N3 E5 u; f" q为容器中运行的网站添加网站文件
5 [( {4 J! j0 j9 M/ # echo "nginx2" > /usr/share/nginx/html/index.html& m' e: ]9 X8 }$ i. q0 f' L# s
/ # exit
4 K W: ~0 {& Q4 m+ e! \, T代码语言:text
( T# F" W( i: ?4 Y0 q复制
! ~ C/ `* H+ O, v在宿主机上访问网站
% U# F6 L. @' w: A; r[root@localhost ~]# curl 192.168.10.1648 {# B9 r4 y8 @" E, J
nginx28 |$ b4 \, ]6 |/ ]5 b6 e% E$ q
2.8 暂停容器 e( p- F8 M4 W% L7 R
代码语言:text4 R6 x+ F( {: t S: y6 Q) p
复制
7 D: p6 A6 U+ _" B( P查看容器状态
* z- v" O D% t! N2 @# ctr tasks ls0 \- g2 {1 R9 |5 k
TASK PID STATUS
4 E! @( f) L7 |- n, ^% mnginx2 4061 RUNNING
, p' A; F# g, W" `+ r! d! \" j代码语言:text
4 b4 S+ U! a: m0 K, e- ~$ I5 ?' y复制! C9 Q9 {7 a9 y/ a3 I7 A2 r6 \6 Q+ H T
暂停容器* L% x$ Y2 M+ b% e) @
# ctr tasks pause nginx2
# c) ^( g: @+ L0 L- i5 e" _代码语言:text
- y/ v7 }7 d& M2 P, W0 e+ L: s' B复制
& m2 G: f" ~& w9 t再次查看容器状态,看到其状态为PAUSED,表示停止。
5 C$ F' f& e+ u5 F+ w' i: J# ctr tasks ls1 i* L9 W! {5 w3 k2 n1 \
TASK PID STATUS
( T: _3 N( Z' l1 m& Wnginx2 4061 PAUSED
8 F& K3 Y1 o& }+ r! A% ]7 r i代码语言:text& l( p6 [: D8 [# O
复制
I$ D0 Q$ s' o7 t. b( Y S8 O+ K[root@localhost ~]# curl http://192.168.10.1647 Y1 X6 O* `( v
在宿主机访问,发现不可以访问到网站
j, U1 t$ A4 A6 y* O- V* y3 g2.9 恢复容器+ }8 k# {4 ]: @5 E* [( h6 B( b
代码语言:text4 E: H* B' B" j# [! \& N0 y: m; i @5 g' [
复制
) \7 m. H) O+ u% `9 @" ^使用resume命令恢复容器 a% F/ L- @ X6 V9 U! j* z( [
# ctr tasks resume nginx2) U3 ~" i# n1 h2 ?
代码语言:text
" P# C4 t; X7 S; q& G. y' ]* w复制6 i6 b- K( Q9 p4 }" a1 [$ {
查看恢复后状态! P8 v, Y9 \6 t$ F C; @' O
# ctr tasks ls! K% F& H& l5 L. d8 g% R1 ]
TASK PID STATUS4 F) c, p6 m X
nginx2 4061 RUNNING
3 G/ Q6 a ^7 w7 O5 I5 i5 L代码语言:text& w% E. @4 I% q J p+ g, C
复制
: B9 H8 o& {1 W" X) [. ~# t7 _: y在宿主机上访问容器中提供的服务
$ R3 g# Z# M$ @" W# curl http://192.168.10.164
; ?+ Y1 Y# y6 [0 A0 u0 Knginx2
1 b/ C- U0 z6 L/ E$ }! O& C2.10 停止容器
% i/ [& u ~ ^+ x1 L6 A" k代码语言:text' ]5 L# z$ b! j5 y9 ~8 I8 M
复制. l- P" P( y* t
# ctr tasks --help
# F# T/ O5 y. y, T......5 ]2 u/ _& I$ M% }
代码语言:text. D* A% b5 K* Z4 M) A& L2 Y
复制
. [7 @' g- ~" Y# O) S; ?4 G使用kill命令停止容器中运行的进程,既为停止容器0 I: g9 |" ^- @# W& o
# ctr tasks kill nginx2
* k: u: w9 f8 J8 u代码语言:text
5 Y! W7 r5 q. N复制) G. F2 w7 U8 D: {
查看容器停止后状态,STATUS为STOPPED2 |7 A: s& g3 w5 q$ V7 [$ M
# ctr tasks ls2 l; r% B/ w' D! ~5 A& u+ B
TASK PID STATUS9 H3 H$ F. ~+ U7 q) w
nginx1 3395 RUNNING
* u1 D( Z- v9 |2 @; Z8 s3 tnginx2 4061 STOPPED; u/ W! R8 U- o
2.11 删除容器( o) T! n% Y+ H5 t2 Y, e7 [
代码语言:text; F& i$ S- k0 V4 c
复制
, }& L! M8 W6 M) ~: W" z7 a+ W# ctr tasks delete nginx2
' a$ W' f( f N" O2 h( x必须先删除task,再删除容器
# w7 ?0 [7 u. n代码语言:text, M7 f+ N5 {0 \8 Z2 v L5 ?! R
复制
+ `- v! `* m v3 @5 V! d _$ D查看静态容器,确认其还存在于系统中
7 L. ? ^ T" W- L. V8 ~$ R8 U3 t# ctr container ls
4 C% F3 \2 i8 f2 d2 uCONTAINER IMAGE RUNTIME
! L0 \- U1 B% E" j' O! Anginx2 docker.io/library/nginx:alpine io.containerd.runc.v2, n( Q( G- f. o9 N0 |0 F
代码语言:text
K6 k* o0 d' x0 j- l8 c: K复制
9 Z' b& t' t/ f* S删除容器8 E; A3 N- \) Q7 d' X
# ctr container delete nginx21 Y& i: n; Q5 Z: I7 J* @( W- u3 U8 n
3、Containerd使用私有容器镜像仓库 Harbor1 X3 P+ {- L* c
3.1 Harbor准备
4 h0 @3 d' S# v6 i( A$ F+ O# Y/ H4 d
4 y7 `! ]9 n; g8 o* c3.2 配置Containerd使用Harbor仓库9 I8 z' h# Y& o
3.2.1 Harbor主机名解析
0 I* t1 q! a* L) n8 A, T8 S: A在所有安装containerd宿主机上添加此配置信息。; `* G K1 U8 T: P% }
- F) B1 W) n% S+ |代码语言:text& u: ]: B% Z( y
复制- c: b8 O4 M- R) [ J
# vim /etc/hosts: X4 s5 L7 k) @+ @6 h, D2 C
# cat /etc/hosts
; L! [$ r# \! r3 c" K5 s Z127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 W# [( t0 w! N4 w
::1 localhost localhost.localdomain localhost6 localhost6.localdomain65 Q/ Q" `. ]. Y" _; ]4 [
192.168.10.165 harbor.kubemsb.com
0 ?' I+ x4 {) y代码语言:text
% o& ]: \' L. n1 E# ^ \复制, Z+ k/ c/ ~7 }1 k
说明2 p; A# x, X9 q6 I+ t6 Q
* 192.168.10.165是harbor的IP
+ x7 ?* y/ K$ [8 M' S( F1 B# K k& c. O
* harbor.kubemsb.com建议用FQDN形式,如果用类似harbor这种短名,后面下载镜像会出问题
$ O5 M3 R/ u* Q# ^+ b; j3.2.2 修改Containerd配置文件
2 p8 s2 \: Z1 c6 K5 O9 q- l% |代码语言:text
; N- f) C* Q' i7 V( \" w复制, R1 U" a$ K l/ `2 D+ }4 E
此配置文件已提前替换过,仅修改本地容器镜像仓库地址即可。
! P& h3 e$ }' d- ?" H# vim /etc/containerd/config.toml
# U6 a. z! [3 y) P" M. N: n) j# cat /etc/containerd/config.toml# f Y8 @) k- Q8 l0 `5 X
root = "/var/lib/containerd"9 g& u4 x, f) W1 z8 k' l
state = "/run/containerd"
1 V4 v) N1 x) D/ m. U- ^oom_score = -999# h7 J" e) V {5 X( A* b
( i2 c- d6 ]8 A/ P: P
[grpc]
% u; ?' ^% y6 O, p! A6 w address = "/run/containerd/containerd.sock"1 S# Y0 H/ ~' P2 _
uid = 0
3 f5 y7 g' `: H% V7 `9 K gid = 03 L0 d" X( ?1 c8 Y4 R, h% Q
max_recv_message_size = 167772169 w1 q0 F$ k9 U: [
max_send_message_size = 16777216
4 h6 ] m7 e- {/ j. v7 S& N+ S3 N9 g3 }& S
[debug]
) h$ s6 ]# U2 U7 o# c# w& e3 O+ P address = ""& _& R' z% e! F, G# {
uid = 0
5 n4 t, ~ H" R. v- @. t gid = 06 d5 x1 }* f' A6 o
level = ""* v3 V' d. ` i! ~
: a) Q3 s! N0 I6 n8 o) C" {& x[metrics]! @$ u* m' H: a- P
address = ""0 {4 p) J- K& |( |" s! ~! I4 i Z
grpc_histogram = false! E5 I& J- q' w* A
+ B G5 a; W/ w I- Y/ ^3 J[cgroup]3 Y# v% [# R9 L$ v" O0 N
path = ""
5 _' r- f: G) k3 x
( m& d, {5 D+ ]! ]# \" k0 _[plugins]' S# B) n f8 n- r6 h4 \7 g. @+ Q# R
[plugins.cgroups]& F; B* {; [# v! L- \" e% C
no_prometheus = false$ F! p7 n, m& G5 l2 O4 N- N5 B
[plugins.cri]
. Z2 u. w6 j3 r1 w8 o stream_server_address = "127.0.0.1"* ~& x5 z" L w( I" @
stream_server_port = "0"1 @* s- y% e; B. E6 `" U6 K
enable_selinux = false
2 R: j9 D1 X' [. V- t7 ] sandbox_image = "easzlab/pause-amd64:3.2"$ i. v, E, o3 j x: Z- X
stats_collect_period = 10, i1 Y) E* b, c) A3 E6 n, X* A+ o
systemd_cgroup = false
+ d8 M; S4 i8 c5 g enable_tls_streaming = false
, } ?4 z6 Y8 S5 J max_container_log_line_size = 16384
9 s" y& A2 X3 U- W/ V( C' p [plugins.cri.containerd]
9 ~6 |& _( H3 F snapshotter = "overlayfs"
8 o9 W! n; {9 ], s0 K5 }- X no_pivot = false) C) Q$ ]( P/ y W
[plugins.cri.containerd.default_runtime] r- N9 ~& V( Z5 H4 V8 W7 q. b; D
runtime_type = "io.containerd.runtime.v1.linux"
* [. v3 q$ _5 w runtime_engine = "" j+ G% y8 D1 i
runtime_root = ""
5 [% J; s. h4 u [plugins.cri.containerd.untrusted_workload_runtime]. n6 h4 I1 i& e0 H
runtime_type = ""
9 j$ I. q& i7 A2 K* @* `" \7 q8 U runtime_engine = ""
' e6 i9 _* y1 {2 e( O runtime_root = ""6 j3 J! O; }. |4 o$ n! S
[plugins.cri.cni]0 x- {6 G+ K' B' z4 Y
bin_dir = "/opt/kube/bin"
5 D. Y1 F1 |+ s, ]2 e- i7 y conf_dir = "/etc/cni/net.d"
0 P3 X& x4 d9 q6 C conf_template = "/etc/cni/net.d/10-default.conf"
2 z6 E8 G, s0 M: K0 y6 }( T6 ^ [plugins.cri.registry], i0 X- A( w6 ^- l
[plugins.cri.registry.mirrors]
, I0 ^4 l4 g) t+ W0 e [plugins.cri.registry.mirrors."docker.io"]
8 x/ U) W+ v4 x endpoint = [
+ F: I. G) u, d' U& ~" l8 n "https://docker.mirrors.ustc.edu.cn",
) W; s; K# a# I/ C "http://hub-mirror.c.163.com"
$ W" |. _4 S: i0 }: ?5 V8 _ ]/ r; X# q* s3 X: @& L& R: [
[plugins.cri.registry.mirrors."gcr.io"]
0 M. H2 n7 c) K4 m: ~* U8 e endpoint = [
* f% m/ M2 H' C& o; i; Q "https://gcr.mirrors.ustc.edu.cn"
! _, r% |! w; `, G3 l Z ]0 m7 O- j" l- d: F' I% K
[plugins.cri.registry.mirrors."k8s.gcr.io"]
1 t' y% l6 ~0 s/ T; e endpoint = [
" |- o1 g& k8 F& R "https://gcr.mirrors.ustc.edu.cn/google-containers/"
+ M$ X* w/ R; u8 [1 w5 b ]
' G. N( i1 \5 P! s+ k [plugins.cri.registry.mirrors."quay.io"]* \& {% E- M/ N Z( ]
endpoint = [# n+ }$ K1 l, m3 Q: P
"https://quay.mirrors.ustc.edu.cn"& P6 B% [$ L p E$ J$ @1 f& q$ e; t( a
] H/ C2 G3 B- Y* A
[plugins.cri.registry.mirrors."harbor.kubemsb.com"] 在此处添加,在镜像加速器下面添加这一段
2 L+ Q Z' Z; Z7 V: p! V4 g% q endpoint = [
# o- J2 @( H+ x. n) W& C "http://harbor.kubemsb.com"
9 k; y1 d/ @8 t: {2 e; |, H* g ]
( F# s* z- e6 g0 E5 a; M [plugins.cri.x509_key_pair_streaming]
( J1 L, x$ O9 W: @' n tls_cert_file = ""
0 d7 b8 Y/ l v* ]( ]6 Y: F5 ^ tls_key_file = ""$ X [3 b' [) M* ^! Y, D/ [
[plugins.diff-service]4 C5 A& u8 q; Z+ U; ?) R
default = ["walking"]
, l! {" v, n' H% @! d: I. l* ` [plugins.linux]
1 s) L( |" j, u) _6 q shim = "containerd-shim"
# S6 u* ?2 N) u1 W' V5 G7 p runtime = "runc"0 `' ]9 j9 }2 P# a) Y- E0 V4 J3 C
runtime_root = ""
8 d; C) c6 i8 @. R no_shim = false- I( R) p# G9 W7 D
shim_debug = false
( d g7 b1 {7 B [plugins.opt]
8 f8 w1 n, z8 s9 y% O4 } path = "/opt/containerd" L# J: j7 Q' f/ @8 ^% R
[plugins.restart]8 w" n5 e V6 K, Y- n/ Z7 u; b0 Z
interval = "10s" y4 x0 e$ ?7 N" H' e( d
[plugins.scheduler]. b+ H2 U! q2 q3 M3 g
pause_threshold = 0.02
: {1 J- v- C5 q# @( i/ R. k7 ?" B, c deletion_threshold = 0
: p" e/ |+ E7 M2 V& J2 V$ R' g mutation_threshold = 100+ Y4 D; K( \4 e3 X
schedule_delay = "0s"
; T# |3 ~% [+ y% S! r; f/ J) n7 v( I startup_delay = "100ms"
; P* |( `" ^ J' P) W5 s+ F代码语言:text
. ~3 Q4 ?2 w* s3 d ?- T. x O; k复制6 |$ {! C4 v# J# c6 V2 ]# F
重启containerd,以便于重新加载配置文件。
% S- m5 E0 t3 }9 [; r# systemctl daemon-reload: s3 }6 `5 k/ n8 Z2 @
# systemctl restart containerd
}. L" b! b) z; p3.2.3 ctr下载镜像
, e) i# |8 }# U代码语言:text5 [ v+ d2 i% Z+ z# M6 M* D+ @
复制
; }: B1 E. X8 L) C. Q$ ]下载容器镜像
1 G1 u5 T& t( k4 _0 ^% y# ctr images pull --platform linux/amd64 docker.io/library/nginx:latest
% J$ J. U, U U6 c _/ m( U代码语言:text7 u1 C- |' H W( N
复制3 ^) w8 {8 z/ p6 n% [* ? {; g6 {
说明:
8 p1 `. K7 P( T) f" V" c2 D* --platform linux/amd64 指定系统平台,也可以使用--all-platforms指定所有平台镜像。
" P& H' s% w8 Q2 x, h7 ]- ]9 s代码语言:text; A* c# w5 h" n* U& n' M& X
复制
1 Q0 {3 T7 f1 s& n/ V查看已下载容器镜像
& N1 N6 T& l z- H+ s |! F k4 L# ctr images ls: V) Z5 M5 d) J+ O! }
REF TYPE DIGEST SIZE PLATFORMS LABELS+ g) n7 l" l ?6 X
5 o K* l$ W) rdocker.io/library/nginx:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767 54.1 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x -4 q1 b8 F/ t: W# _
3.2.4 ctr上传镜像
; w! R1 u8 d+ u. q' H. W上传到Harbor library公有项目/ J; ?! R4 B" F$ f
* m0 x _0 u4 [8 m4 \代码语言:text
( ?$ O) r/ V: G$ d复制
5 c! ^) u( m! j" E. c& k8 q重新生成新的tag$ \' V# I7 ~0 w/ H. {. F
# ctr images tag docker.io/library/nginx:latest harbor.kubemsb.com/library/nginx:latest
% G* F7 [) W! ]4 D( u0 Z* u& _harbor.kubemsb.com/library/nginx:latest6 j% ^# @2 Y6 w
代码语言:text
! ~3 V8 A8 M$ }2 o# O2 s复制
8 K9 x& S1 v* V$ `查看已生成容器镜像3 i" k4 P6 g8 T. [# m6 Z. T
# ctr images ls [1 T7 g2 J6 k6 X+ w: P3 M3 Y/ J! _. ^; j
REF TYPE DIGEST SIZE PLATFORMS LABELS
: X0 _5 Z9 e2 d* W1 Q0 u5 edocker.io/library/nginx:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767 54.1 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x -; h" {5 f. g7 {& {7 L. a1 f' I
harbor.kubemsb.com/library/nginx:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767 54.1 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x -
+ n2 h4 I! L3 u. I' v4 E; `+ l1 _代码语言:text
: n* f" f" t$ H5 ^. l# G, l3 ]复制
5 j$ t2 H1 |) q3 H推送容器镜像至Harbor. C' l0 X# a- U. I
# ctr images push --platform linux/amd64 --plain-http -u admin:密码 harbor.kubemsb.com/library/nginx:latest
- D1 x" L2 t( D7 z代码语言:text
1 J9 c' h' g: g) q- k( y! m复制. A3 ^. S( C& u- F
说明:0 f4 K% [( d* U" N; U
' s, J- w' m: [$ ~; W* r* 先tag再push
+ W0 s3 d) b2 G6 N! V7 d2 G2 m6 ?0 i* 因为我们harbor是http协议,不是https协议,所以需要加上`--plain-http`7 V7 p& Y6 _% @7 j$ i
* `--user admin:Harbor12345`指定harbor的用户名与密码
+ F- m- h3 P, n I9 f代码语言:text1 H. {9 a) ?" Z" N( k
复制
( m. `" U( h1 U z1 u8 r7 @输出:
F8 }: L3 P' O, F8 s" x9 Kmanifest-sha256:0fd68ec4b64b8dbb2bef1f1a5de9d47b658afd3635dc9c45bf0cbeac46e72101: done |++++++++++++++++++++++++++++++++++++++|
+ r$ Z6 F; y. E& M% ?. N F( hconfig-sha256:dd025cdfe837e1c6395365870a491cf16bae668218edb07d85c626928a60e478: done |++++++++++++++++++++++++++++++++++++++|3 a8 {0 P: D- [$ ?7 j7 \
elapsed: 0.5 s total: 9.3 Ki (18.1 KiB/s)0 `5 `- p8 D# Q* h3 q
9 K; Y; g6 q8 `8 h+ C7 O; Y# q代码语言:text1 H8 M/ N. O! k6 k% d
复制
3 f0 L# ?/ q2 Q' g- f下载已上传容器镜像5 H2 b& T8 z! K, U' j0 K) b
# ctr images pull --plain-http harbor.kubemsb.com/library/nginx:latest
( t" J+ Y# s6 W& \8 g% a) ~8 E+ K( C5 b; }* J3 p
|
|