|
|
楼主 |
发表于 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 |
|