首页 > 其他分享 >docker 第二课

docker 第二课

时间:2022-10-29 07:11:05浏览次数:56  
标签:awen 第二课 -- containerd io docker root

构建nginx镜像

Dockerfile 指令: FROM centos:7.9.2009 #在整个dockfile文件中除了注释之外的第一行,要是FROM ,FROM 指令当前镜像的用于指定父镜像(base image) ADD [--chown=<user>:<group>] <src>... <dest> #用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,会自动解压tar.gz格式的压缩包,但不会自动解压zip包 MAINTAINER #(镜像的维护者信息,目前已经不推荐使用) LABEL “ key”=“ value” #设置镜像的属性标签 COPY COPY [--chown=<user>:<group>] <src>... <dest> #用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,不会解压任何压缩包 ENV MY_NAME="John Doe" #设置容器环境变量 USER <user>[:<group>] or USER <UID>[:<GID>] #指定运行操作的用户 RUN yum install vim unzip -y && cd /etc/nginx #执行shell命令,但是一定要以非交互式的方式执行 VOLUME ["/data/data1","/data/data2"] #定义volume WORKDIR /data/data1 #用于定义当前工作目录 EXPOSE <port> [<port>/<protocol>...] #声明要把容器的某些端口映射到宿主机 关于CMD与entrypoint:  CMD有以上三种方式定义容器启动时所默认执行的命令或脚本  CMD ["executable","param1","param2"] (exec form, this is the preferred form) #推荐的可执行程序方式  CMD ["param1","param2"] (as default parameters to ENTRYPOINT) #作为ENTRYPOINT默认参数  CMD command param1 param2 (shell form) #基于shell命令的  如:基于CMD #镜像启动为一个容器时候的默认命令或脚本, • CMD ["/bin/bash"]  ENTRYPOINT #也可以用于定义容器在启动时候默认执行的命令或者脚本,如果是和CMD命令混合使用的时候,会将CMD的命令当做参数传递给 ENTRYPOINT后面的脚本,可以在脚本中对参数做判断并相应的容器初始化操作。  案例1: ENTRYPOINT ["top", "-b"] CMD ["-c"] 等于如下一行: ENTRYPOINT ["top", "-b", "-c"]  案例2: ENTRYPOINT ["docker-entrypoint.sh"] #定义一个入口点脚本,并传递mysqld 参数 CMD ["mysqld"] 等于如下一行: ENTRYPOINT ["docker-entrypoint.sh","mysqld"]  使用总结: ENTRYPOINT(脚本) + CMD(当做参数传递给ENTRYPOINT)

 

root@awen-UBuntu:~/nginx# cat Dockerfile
FROM ubuntu:22.04

#ADD sources.list /etc/apt/sources.list


RUN apt update && apt install -y iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute iotop unzip zip make

ADD nginx-1.22.0.tar.gz /usr/local/src/

RUN cd /usr/local/src/nginx-1.22.1 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/bin

RUN groupadd -g 2088 nginx && useradd -g nginx -s /usr/sbin/nologin -u 2088 nginx && chown -R nginx.nginx /apps/nginx

EXPOSE 80 443

CMD ["nginx","-g","daemon off;"]

root@awen-UBuntu:~/nginx# docker run -it -p 80:80 --name nginx nginx:v20221025

 

 

 基于 docker 实现对容器的 CPU 和内存的资源限制

 

默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源,Docker提供了控制容器可以限制容器使用多少内存或CPU的

 

方法,运行docker run命令创建容器的时候可以进行资源限制。

 

Docker早期使用cgroupfs进行容器的资源限制管理,然后再调用内核的cgroup进行资源限制,而kubernetes后来使用systemd直接调用cgroup对进程

 

实现资源限制,等于绕过了docker的cgroupfs的管理,对资源限制更严格、性能更好,因此在kubernetes环境推荐使用systemd进行资源限制。

 

"exec-opts": ["native.cgroupdriver=systemd"],

 

"exec-opts": ["native.cgroupdriver=cgroupfs"]

 

 cgroupfs是文件级别的资源限制控制器 ,现在使用systemd

其中许多功能都要求宿主机的内核支持Linux功能,要检查支持,可以使用docker info命令,如果内核中禁用了某项功能,可能会在输出结尾处看到警 告,如下所示: WARNING: No swap limit support     容器资源限制: OOM优先级机制:  linux会为每个进程算一个分数,最终他会将分数最高的进程kill。  /proc/PID/oom_score_adj #范围为-1000到1000,值越高越容易被宿主机kill掉,如果将该值设置为-1000,则进程永远不会被宿主机kernel kill。 /proc/PID/oom_adj #范围为-17到+15,取值越高越容易被干掉,如果是-17,则表示不能被kill,该设置参数的存在是为了和旧版本的Linux内核兼容。 /proc/PID/oom_score #这个值是系统综合进程的内存消耗量、CPU时间(utime + stime)、存活时间(uptime - start time)和oom_adj计算出的进程得分,消耗内存越多得分越高,越容易被宿主机kernel强制杀死   Docker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小。 Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了。 大部分的选项取正整数,跟着一个后缀b,k, m,g,,表示字节,千字节,兆字节或千兆字节。  Most of these options take a positive integer, followed by a suffix of b, k, m, g, to indicate bytes, kilobytes, megabytes, or gigabytes. --oom-score-adj #宿主机kernel对进程使用的内存进行评分,评分最高的将被宿主机内核kill掉(越低越不容易被kill),可以指定一个容器的评分为较低的负数,但是不推荐手动指定。 --oom-kill-disable #对某个容器关闭oom机制。已经不支持了   root@awen-UBuntu:~# docker run -it -d --oom-score-adj -1000 -p 80:80 43.155.72.199/awen/nginx:v1  物理内存限制参数: -m or --memory #限制容器可以使用的最大内存量,如果设置此选项,最小存值为4m(4兆字节)。(最为重要) --memory-swap #容器可以使用的交换分区大小,必须要在设置了物理内存限制的前提才能设置交换分区的限制 --memory-swappiness #设置容器使用交换分区的倾向性,值越高表示越倾向于使用swap分区,范围为0-100,0为能不用就不用,100为能用就用。   --kernel-memory #容器可以使用的最大内核内存量,最小为4m,由于内核内存与用户空间内存隔离,因此无法与用户空间内存直接交换, 因此内核内存不足的容器可能会阻塞宿主主机资源,这会对主机和其他容器或者其他服务进程产生影响,因此不要设置内核内存大小。   --memory-reservation #允许指定小于--memory的软限制,当Docker检测到主机上的争用或内存不足时会激活该限制,如果使用 --memory-reservation,则必须将其设置为低于--memory才能使其优先。 因为它是软限制,所以不能保证容器不超过限制。   --oom-kill-disable #默认情况下,发生OOM时,kernel会杀死容器内进程,但是可以使用--oom-kill-disable参数,可以禁止oom发生在指定的容器上,即 仅在已设置 -m / - memory选项的容器上禁用OOM,如果-m 参数未配置,产生OOM时,主机为了释放内存还会杀死系统进程。   root@awen-UBuntu:~# docker run -it -d -m 512m -p 80:80 43.155.72.199/awen/nginx:v1

软限制

root@awen-UBuntu:~# docker run -it -d -m 512m --memory-reservation 511m nginx:1.18.0-alpine

  物理内存限制验证: 假如一个容器未做内存使用限制,则该容器可以利用到系统内存最大空间,默认创建的容器没有做内存资源限制。 # docker pull lorel/docker-stress-ng #测试镜像 # docker run -it --rm lorel/docker-stress-ng –help #查看帮助信息

root@awen-UBuntu:~# docker run -it --rm lorel/docker-stress-ng --help

-c N, --cpu N start N workers spinning on sqrt(rand()) 启动N个workers进行cpu的压测

--vm N             start N workers spinning on anonymous mmap   启动N个workers进行内存压测

--vm-bytes N       allocate N bytes per vm worker (default 256MB)  workers内存压测字节数  锁定一定的字节数给每个worker

两个内存worker 每个内存消耗256M 

Example: stress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 128M --fork 4 --timeout 10s

root@awen-UBuntu:~# docker run -it --rm --name haha lorel/docker-stress-ng --vm 2 --vm-bytes 256M

root@awen-UBuntu:~# docker stats

CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
40327a2417f9 haha 197.37% 516.4MiB / 1.896GiB 26.60% 946B / 0B 360kB / 0B 5

 

1、不限制容器内存:  启动两个工作进程,每个工作进程最大允许使用内存256M,且宿主机不限制当前容器最大内存: root@docker-server1:~# docker run -it --rm --name magedu-c1 lorel/docker-stress-ng --vm 2 --vm-bytes 256M root@docker-server1:~# docker stats 2、限制容器最大内存: root@docker-server1:~# docker run -it --rm -m 256m --name magedu-c1 lorel/docker-stress-ng --vm 2 --vm- bytes 256M root@docker-server1:~# docker stats   交换分区限制参数:  --memory-swap #只有在设置了 --memory 后才会有意义。使用Swap,可以让容器将超出限制部分的内存置换到磁盘上, root@awen-UBuntu:~# docker run -it --rm --name haha -m 265m --memory-swap 1024m lorel/docker-stress-ng --vm 2 --vm-bytes 256M 交换分区的值-物理内存的值=交换分区   WARNING:经常将内存交换到磁盘的应用程序会降低性能。  不同的--memory-swap设置会产生不同的效果:  --memory-swap #值为正数, 那么--memory和--memory-swap都必须要设置,--memory-swap表示你能使用的内存和 swap分区大小的总和,例如: --memory=300m, --memory-swap=1g, 那么该容器能够使用 300m 内存和 700m swap,即- -memory是实际物理内存大小值不变,而swap的实际大小计算方式为(--memory-swap)-(--memory)=容器可用swap。 --memory-swap #如果设置为0,则忽略该设置,并将该值视为未设置,即未设置交换分区。 --memory-swap #如果等于--memory的值,并且--memory设置为正整数,容器无权访问swap即也没有设置交换分区。 --memory-swap #如果设置为unset,如果宿主机开启了swap,则实际容器的swap值为2x( --memory),即两倍于物理内存大小,但是并不准确(在容器中使用free命令所看到的swap空间并不精确,毕竟每个容器都可以看到具体大小,但是宿主机的swap是有上限而且不是所有容器看到的累计大小)   --memory-swap #如果设置为-1,如果宿主机开启了swap,则容器可以使用主机上swap的最大空间。

root@awen-UBuntu:~# docker run -it --rm --name haha -m 265m --memory-swap 1024m lorel/docker-stress-ng --vm 2 --vm-bytes 256M

交换分区限制验证: 交换分区限制 root@docker-server1:~# docker run -it --rm -m 256m --memory-swap 512m --name magedu-c1 alpine:3.16.2 sh 内存大小软限制 root@docker-server1:~# docker run -it --rm -m 256m --memory-reservation 128m --name magedu-c1 lorel/docker-stress-ng --vm 2 --vm-bytes 256M 关闭OOM机制 root@docker-server1:~# docker run -it --rm -m 256m --oom-kill-disable --name magedu-c1 lorel/docker-stress-ng --vm 2 --vm-bytes 256M   CPU限制验证: #只给容器分配最多两核宿主机CPU利用率 # docker run -it --rm --name magedu-c1 --cpus 2 lorel/docker-stress-ng --cpu 4 --vm 4 注:CPU资源限制是将分配给容器的2核心分配到了宿主机每一核心CPU上,也就是容器的总CPU值是在宿主机的每一个核心CPU分配了部分比例   将容器运行到指定的CPU上: # docker run -it --rm --name magedu-c1 --cpus 2 --cpuset-cpus 1,3 lorel/docker-stress-ng --cpu 4 --vm 4 --cpuset-cpus 绑定在 第一个第三个cpu上, 基于cpu--shares值(共享值)对CPU进行限制,分别启动两个容器,magedu-c1的--cpu-shares值为1000,magedu-c2的--cpu-shares为500,观察最终效果,--cpu-shares值为1000的magedu-c1的CPU利用率基本是--cpu-shares为500的magedu-c2的两倍: # docker run -it --rm --name magedu-c1 --cpu-shares 1000 lorel/docker-stress-ng --cpu 4 --vm 4 # docker run -it --rm --name magedu-c2 --cpu-shares 500 lorel/docker-stress-ng --cpu 4 --vm 4   容器资源限制验证: 1.cgroup验证: root@docker-server1:~# cat /sys/fs/cgroup/docker/b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed/memory.max  536870912  root@docker-server1:~# cat /sys/fs/cgroup/docker/b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed/cpu.max  200000 100000 2.systemd验证 root@awen-UBuntu:~# docker run -it -d -m 512m --cpus 1  -p 80:80  nginx:1.18.0-alpine

root@awen-UBuntu:~# ps -ef | grep nginx
root 9631 9602 0 Oct27 ? 00:00:00 nginx: master process nginx -g daemon off;
systemd+ 9768 9631 0 Oct27 ? 00:00:00 nginx: worker process

root@awen-UBuntu:~# cat /proc/9602/cpuset
/system.slice/containerd.service

root@awen-UBuntu:~# cat /sys/fs/cgroup/system.slice/docker-ffcaecc0957d18e6dab963c74737d489c012f9af929762a89cb38e2bdb636f98.scope/cpu.max
100000 100000

1个cpu是1000毫核

内存

root@awen-UBuntu:~# cat /sys/fs/cgroup/system.slice/docker-ffcaecc0957d18e6dab963c74737d489c012f9af929762a89cb38e2bdb636f98.scope/memory.max
536870912(单位是字节)

安装containerd

安装依赖包

root@awen-UBuntu:~# apt update

root@awen-UBuntu:~# apt install apt-transport-https ca-certificates curl software-properties-common

安装GPG证书

root@awen-UBuntu:~# curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

写入软件信息原

root@awen-UBuntu:~# add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

root@awen-UBuntu:~# apt update

root@awen-UBuntu:~# apt-cache madison containerd.io

root@awen-UBuntu:~# apt install containerd.io

root@awen-UBuntu:~# ctr --version
ctr containerd.io 1.6.9

docker 是命令发给dockerd  再发给containerd,

 

打印containerd配置文件

root@awen-UBuntu:~# containerd config default  
disabled_plugins = []
imports = []
oom_score = 0
plugin_dir = ""
required_plugins = []
root = "/var/lib/containerd"
state = "/run/containerd"
temp = ""
version = 2

[cgroup]
path = ""

[debug]
address = ""
format = ""
gid = 0
level = ""
uid = 0

[grpc]
address = "/run/containerd/containerd.sock"
gid = 0
max_recv_message_size = 16777216
max_send_message_size = 16777216
tcp_address = ""
tcp_tls_ca = ""
tcp_tls_cert = ""
tcp_tls_key = ""
uid = 0

[metrics]
address = ""
grpc_histogram = false

[plugins]

[plugins."io.containerd.gc.v1.scheduler"]
deletion_threshold = 0
mutation_threshold = 100
pause_threshold = 0.02
schedule_delay = "0s"
startup_delay = "100ms"

[plugins."io.containerd.grpc.v1.cri"]
device_ownership_from_security_context = false
disable_apparmor = false
disable_cgroup = false
disable_hugetlb_controller = true
disable_proc_mount = false
disable_tcp_service = true
enable_selinux = false
enable_tls_streaming = false
enable_unprivileged_icmp = false
enable_unprivileged_ports = false
ignore_image_defined_volumes = false
max_concurrent_downloads = 3
max_container_log_line_size = 16384
netns_mounts_under_state_dir = false
restrict_oom_score_adj = false
sandbox_image = "registry.k8s.io/pause:3.6"
selinux_category_range = 1024
stats_collect_period = 10
stream_idle_timeout = "4h0m0s"
stream_server_address = "127.0.0.1"
stream_server_port = "0"
systemd_cgroup = false
tolerate_missing_hugetlb_controller = true
unset_seccomp_profile = ""

[plugins."io.containerd.grpc.v1.cri".cni]
bin_dir = "/opt/cni/bin"
conf_dir = "/etc/cni/net.d"
conf_template = ""
ip_pref = ""
max_conf_num = 1

[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "runc"
disable_snapshot_annotations = true
discard_unpacked_layers = false
ignore_rdt_not_enabled_errors = false
no_pivot = false
snapshotter = "overlayfs"

[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime]
base_runtime_spec = ""
cni_conf_dir = ""
cni_max_conf_num = 0
container_annotations = []
pod_annotations = []
privileged_without_host_devices = false
runtime_engine = ""
runtime_path = ""
runtime_root = ""
runtime_type = ""

[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime.options]

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
base_runtime_spec = ""
cni_conf_dir = ""
cni_max_conf_num = 0
container_annotations = []
pod_annotations = []
privileged_without_host_devices = false
runtime_engine = ""
runtime_path = ""
runtime_root = ""
runtime_type = "io.containerd.runc.v2"

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
BinaryName = ""
CriuImagePath = ""
CriuPath = ""
CriuWorkPath = ""
IoGid = 0
IoUid = 0
NoNewKeyring = false
NoPivotRoot = false
Root = ""
ShimCgroup = ""
SystemdCgroup = false

[plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime]
base_runtime_spec = ""
cni_conf_dir = ""
cni_max_conf_num = 0
container_annotations = []
pod_annotations = []
privileged_without_host_devices = false
runtime_engine = ""
runtime_path = ""
runtime_root = ""
runtime_type = ""

[plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime.options]

[plugins."io.containerd.grpc.v1.cri".image_decryption]
key_model = "node"

[plugins."io.containerd.grpc.v1.cri".registry]
config_path = ""

[plugins."io.containerd.grpc.v1.cri".registry.auths]

[plugins."io.containerd.grpc.v1.cri".registry.configs]

[plugins."io.containerd.grpc.v1.cri".registry.headers]

[plugins."io.containerd.grpc.v1.cri".registry.mirrors]

[plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
tls_cert_file = ""
tls_key_file = ""

[plugins."io.containerd.internal.v1.opt"]
path = "/opt/containerd"

[plugins."io.containerd.internal.v1.restart"]
interval = "10s"

[plugins."io.containerd.internal.v1.tracing"]
sampling_ratio = 1.0
service_name = "containerd"

[plugins."io.containerd.metadata.v1.bolt"]
content_sharing_policy = "shared"

[plugins."io.containerd.monitor.v1.cgroups"]
no_prometheus = false

[plugins."io.containerd.runtime.v1.linux"]
no_shim = false
runtime = "runc"
runtime_root = ""
shim = "containerd-shim"
shim_debug = false

[plugins."io.containerd.runtime.v2.task"]
platforms = ["linux/amd64"]
sched_core = false

[plugins."io.containerd.service.v1.diff-service"]
default = ["walking"]

[plugins."io.containerd.service.v1.tasks-service"]
rdt_config_file = ""

[plugins."io.containerd.snapshotter.v1.aufs"]
root_path = ""

[plugins."io.containerd.snapshotter.v1.btrfs"]
root_path = ""

[plugins."io.containerd.snapshotter.v1.devmapper"]
async_remove = false
base_image_size = ""
discard_blocks = false
fs_options = ""
fs_type = ""
pool_name = ""
root_path = ""

[plugins."io.containerd.snapshotter.v1.native"]
root_path = ""

[plugins."io.containerd.snapshotter.v1.overlayfs"]
root_path = ""
upperdir_label = false

[plugins."io.containerd.snapshotter.v1.zfs"]
root_path = ""

[plugins."io.containerd.tracing.processor.v1.otlp"]
endpoint = ""
insecure = false
protocol = ""

[proxy_plugins]

[stream_processors]

[stream_processors."io.containerd.ocicrypt.decoder.v1.tar"]
accepts = ["application/vnd.oci.image.layer.v1.tar+encrypted"]
args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]
env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]
path = "ctd-decoder"
returns = "application/vnd.oci.image.layer.v1.tar"

[stream_processors."io.containerd.ocicrypt.decoder.v1.tar.gzip"]
accepts = ["application/vnd.oci.image.layer.v1.tar+gzip+encrypted"]
args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]
env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]
path = "ctd-decoder"
returns = "application/vnd.oci.image.layer.v1.tar+gzip"

[timeouts]
"io.containerd.timeout.bolt.open" = "0s"
"io.containerd.timeout.shim.cleanup" = "5s"
"io.containerd.timeout.shim.load" = "5s"
"io.containerd.timeout.shim.shutdown" = "3s"
"io.containerd.timeout.task.state" = "2s"

[ttrpc]
address = ""
gid = 0
uid = 0

覆盖配置文件 

root@awen-UBuntu:~# containerd config default > /etc/containerd/config.toml

修改配置文件

61     sandbox_image = "registry.k8s.io/pause:3.6"    

sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"

 

配置镜像加速

cr

153 [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
154   [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
155     endpoint = ["https://9916w1ow.mirror.aliyuncs.com"]

加速地址

https://ydwu9nbq.mirror.aliyuncs.com

https://cr.console.aliyun.com/

 

 

重启container

root@awen-UBuntu:~# systemctl restart containerd.service 

安装runc


root@awen-UBuntu:~# wget https://github.com/opencontainers/runc/releases/download/v1.1.4/runc.amd64

root@awen-UBuntu:~# runc -v
runc version 1.1.4
commit: v1.1.4-0-g5fd4c4d
spec: 1.0.2-dev
go: go1.18.7
libseccomp: 2.5.1

网络自己配

安装cni

root@awen-UBuntu:~# wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz root@awen-UBuntu:~# mkdir /opt/cni/bin -pv root@awen-UBuntu:~# tar xvf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin/ 创建容器的客户端 ctr  nerdctl  containerd相比docker多了一个命名空间的逻辑概念(这个namespase是归纳容器和镜像的),ctr命令默认是在default命名空间里,当使用crictl命令的时候,都是在k8s.io这个命名空间里的,所以不指定namespace会发现看到的镜像、容器等内容不一样。 ctr pull镜像  得写绝对路劲 root@awen-UBuntu:~# ctr images pull docker.io/library/nginx:1.20.2   nerdctl  命令 nerdctl-是一个兼容docker的containerd的客户端,https://github.com/containerd/nerdctl root@awen-UBuntu:~# wget https://github.com/containerd/nerdctl/releases/download/v0.23.0/nerdctl-0.23.0-linux-amd64.tar.gz root@awen-UBuntu:~# tar xvf nerdctl-0.23.0-linux-amd64.tar.gz -C /usr/bin/ 查看帮助命令 root@awen-UBuntu:~# nerdctl --help   root@awen-UBuntu:~# nerdctl run  -it -p 80:80 --name=nginx-web1 nginx:1.18.0-alpine root@awen-UBuntu:~# nerdctl run  -d -p 80:80 --name=nginx-web1 nginx:1.18.0-alpine

root@awen-UBuntu:~# nerdctl exec -it bd311525042a sh
/ # ls

 

 

containerd可以使用docker镜像

1.24版本的k8s 使用docker 安装cri-docker.service

containerd构建镜像

 

 

 

 

 

 

 

 

 安装harbor

下载地址

https://github.com/goharbor/harbor/releases/

root@awen-UBuntu:~# wget https://github.com/goharbor/harbor/releases/download/v2.6.1/harbor-offline-installer-v2.6.1.tgz

root@awen-UBuntu:~# tar xf harbor-offline-installer-v2.6.1.tgz -C /apps

root@awen-UBuntu:~# tar xf harbor-offline-installer-v2.6.1.tgz -C /apps
root@awen-UBuntu:~# cd /apps
root@awen-UBuntu:/apps# ls
harbor
root@awen-UBuntu:/apps# cd harbor/
root@awen-UBuntu:/apps/harbor# ls
common.sh harbor.v2.6.1.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
root@awen-UBuntu:/apps/harbor# cp harbor.yml.tmpl harbor.yml

root@awen-UBuntu:/apps/harbor# vi harbor.yml

hostname: ip/域名

 

 

 --with-notary  做可行性验证  需要ssl

--with-trivy  对镜像进行漏洞扫描的组件

--with-chartmuseum  helm 中chart格式的镜像

root@awen-UBuntu:/apps/harbor# ./install.sh --with-trivy --with-chartmuseum

 登录harbor仓库

root@awen-UBuntu:~# docker login  10.4.7.128
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

 密码文件

root@awen-UBuntu:~# cat /root/.docker/config.json

解密harbor密码

root@awen-UBuntu:~# echo xxxxxxxxxxx| base64 -d

上传镜像脚本

root@awen-UBuntu:~# cat build-command.sh
#!/bin/bash
TAG=$1
docker build -t harbor.xxx.cn/awen/server-web1:${TAG} .

docker push harbor.xxx.cn/awen/server-web1:${TAG}

 

 

 

标签:awen,第二课,--,containerd,io,docker,root
From: https://www.cnblogs.com/tshxawen/p/16828185.html

相关文章

  • Docker 安装SqlServer、Mysql、MariaDB
    Docker安装SqlServer说明1.拉取镜像dockerpullmcr.microsoft.com/mssql/server:2019-latest2.运行dockerrun--namemssqlserver2019-d--restartunless-st......
  • Docker 安装elasticsearch、kibana
    Docker安装elasticsearch7.101.拉取镜像dockerpulldocker.elastic.co/elasticsearch/elasticsearch:7.102.运行dockerrun--nameelasticsearch7.10.0-p92......
  • Windows 安装Docker
    Windows安装Docker说明1.下载DockerDesktopDockerDesktop官网2.安装WSLdism.exe/online/enable-feature/featurename:Microsoft-Windows-Subsystem-Linux/all......
  • docker 中 apt-get update 失败解决方案
    1.更换apt的镜像源1.1进入目录cd/etc/apt1.2备份源文件cp/etc/apt/sources.list/etc/apt/sources.list.bak1.3更改镜像源cat<<EOF>/etc/apt/sources.listde......
  • docker学习笔记
    @目录前言1docker简介1.1是什么1.1.1为什么会有docker出现1.1.2docker理念1.2容器与虚拟机比较1.2.1容器发展简史1.2.2传统虚拟机技术1.2.3容器虚拟化技术1.2.4......
  • docker访问外部https数字证书问题
    一般我们构建的docker镜像使用的都是alpinelinux系统,默认是不带ca-certificates根证书的,导致无法识别外部https携带的数字证书。在访问的时候,会抛出​​509:certi......
  • detected "egroupfs" as the Docker cgroup driver. The recommended driver is
    修改/etc/docker/daemon.json文件vim/etc/docker/daemon.json#添加以下信息{"exec-opts":["native.cgroupdriver=systemd"]}dockerinfo|grep"CgroupDriver"......
  • 装有docker的虚拟机环境ping宿主机失败
    当我用dockernetworkcreate创建了一个网络后[root@localhost~]#dockernetworkcreatekong-net5c035564f9b4649b318b61697dad164f390d8b6a9a82e1819fdd5fe1d15481d......
  • docker笔记
    docker是linux容器的一种实现,也是现在最火的容器。容器就是一个隔离的进程,具有启动快、占用资源少、占用空间少等特点。dockerfile是文本配置文件imagefile......
  • Docker 网络管理--网络创建和通信
    一、网络驱动docker可以通过创建虚拟网卡,通过虚拟网卡转发到宿主机网卡和外部进行通信。除此之外,也可以不创建自己的虚拟网卡而是直接和宿主机共用网卡直接占用宿主机I......