修改docker的默认IP地址范围
root@docker-server1:~# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=10.10.0.1/24
root@docker-server1:~# systemctl daemon-reload && systemctl restart docker
root@docker-server2:~# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=10.20.0.1/24
root@docker-server2:~# systemctl daemon-reload && systemctl restart doc在宿主机添加静态路由,将去往的目的容器网关(下一跳)指向目的容器所在的宿主机eth0网卡
如何按需创建网络
实现单机多服务间的网络隔离
在宿主机创建自定义容器网络
创建容器并使用自定义网络
ENTRYPOINT #也可以用于定义容器在启动时候默认执行的命令或者脚本,如果是和CMD命令混合使用的时候,会将CMD的命令当做参数传递给 ENTRYPOINT后面的脚本,可以在脚本中对参数做判断并相应的容器初始化操作。
Dockerfile 构建镜像
构建并验证镜像
基于镜像创建容器
root@docker-server1:/opt/ubuntu# docker run -it -p 80:80 harbor.magedu.net/myserver/nginx:v1手动提交镜像

默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源,Docker提供了控制容器可以限制容器使用多少内存或CPU的 方法,运行docker run命令创建容器的时候可以进行资源限制
Docker早期使用cgroupfs进行容器的资源限制管理,然后再调用内核的cgroup进行资源限制,而kubernetes后来使用systemd直接调用cgroup对进程 实现资源限制,等于绕过了docker的cgroupfs的管理,对资源限制更严格、性能更好,因此在kubernetes环境推荐使用systemd进行资源限制
"exec-opts": ["native.cgroupdriver=systemd"],
"exec-opts": ["native.cgroupdriver=cgroupfs"],
WARNING: No swap limit supp
解决办法
物理内存限制验证
假如一个容器未做内存使用限制,则该容器可以利用到系统内存最大空间,默认创建的容器没有做内存资源限制
# docker pull lorel/docker-stress-ng #测试镜像
# docker run -it --rm lorel/docker-stress-ng --help #查看帮助信息启动两个内存工作进程,每个内存工作进程最大允许使用内存256M,且宿主机不限制当前容器最大内存:
交换分区限制验证
交换分区限制
root@docker-server1:~# docker run -it内存大小软限制
关闭OOM机制
只给容器分配最多两核宿主机CPU利用率
# docker run -it --rm --name magedu-c1 --cpus 2 lorel/docker-stress-ng --cpu 4 --vm 注: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基于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验证
1.cgroup验证
2.systemd限制验证
查看service⽂件
centos安装containerd
# yum install -y yum-utils device-mapper-persistent-data lvm2
containerd相比docker多了一个命名空间的逻辑概念,ctr命令默认是在default命名空间里,而在使用nerdctl命令的时候,却是在k8s.io命名空间里,所以 不指定namespace会发现看到的镜像、容器等内容不一样。
验证runc环境
containerd配置⽂件
通过命令⾏测试下载镜像
containerd的命令⾏客户端有ctr、crictl、nerdctl等,containerd相⽐docker多了⼀个命名空间的逻辑概念,⾃身 的命令⾏客户端ctr命令默认是在default命名空间⾥、nerdctl也是在default,当使⽤crictl命令的时候,是在k8s.io 这个命名空间,⽽k8s的创建的pod也是在k8s.io命名空间,因此在使⽤nerdctl管理kubernetes环境的pod的时候 要指定命名空间为k8s.io,否则看不到kubernetes环境中的pod
root@containerd-server1:~# ctr images pull docker.io/library/alpine:latest验证镜像
ctr客户端创建测试容器
运⾏容器并使⽤宿主机⽹络
root@containerd-server1:~# ctr run -t --net-host docker.io/library/alpine:latest testcontainer sh通过官⽅⼆进制安装containerd、runc及CNI,kubernetes从 v1.24.0开始默认使⽤containerd作为容器运⾏时,因 此需要提前安装好containerd之后在安装v1.24或更⾼版本的kubernetes(如果要继续使⽤docker,则需要单独安装 docker及cri-dockerd、https://github.com/Mirantis/cri-dockerd)。
下载containerd⼆进制并创建service⽂件
编辑配置⽂件
部署runc
下载测试镜像并验证
ctr客户端创建测试容器
root@containerd-server1:~# ctr run -t --net-host docker.io/library/alpine:latest testcontainer sh配置crictl运⾏时环境
下载并验证镜像
https://github.com/containerd/nerdctl
安装nerdctl
nerdctl配置⽂件
安装CNI
创建Nginx测试容器并指定端⼝
创建Tomcat测试容器并指定端⼝
创建MySQL测试容器并指定端⼝
harbor 部署-htttp
docker使用http harbor:
部署 https 的 harbor 服务器
自建 CA,用于后续的 harbor 做证书签发
harbor 域名证书申请
准备签发环境:
https://goharbor.io/docs/2.6.0/install-config/configure-https/ Regardless of whether you’re using either an FQDN or an IP address to connect to your Harbor host, you must create this file so that you can generate a certificate for your Harbor host that complies with the Subject Alternative Name (SAN) and x509 v3 extension requirements. Replace the DNS entries to reflect your domain. SAN:Subject Alternative Name,主题别名,可以让一个证书适配于多个域名,
使用自签名 CA 签发证书
安装 harbor
客户端登录
将公钥分发的 docker
root@docker-server2:~# mkdir -p /etc/docker/certs.d/harbor.magedu.net/
root@docker-harbor2:/apps/harbor/certs#
配置域名解析
root@docker-server2:~# vim /etc/hosts
172.31.6.205 harbor.magedu.net登录 harbor
测试上传镜像:
目前有v1和v2两个版本,v1使用python开发、v2是后出的基于go开发的版本、v2有些命令与v1不兼容,目前主要是使用的v1版本, https://github.com/docker/compose
cat docker-compose.yml #示例文件
https://github.com/hantmac/lxcfs-admission-webhook
容器内⾥⾯是从/proc/cpuinfo中获取到 CPU 的核数,但是容器⾥⾯的/proc⽂件系统是物理机的,内存也是显示 的宿主机的/proc/meminfo的信息,因此不准确,⽽lxcfs 则是通过⽂件挂载的⽅式,把 宿主机cgroup 中关于系 统的相关信息读取出来,通过 docker 的 volume 挂载给容器内部的 proc 系统,然后让 docker 内的应⽤读取 proc 中信息的时候以为就是读取的宿主机的真实的 proc。
root@docker-server1:~# route add -net 10.20.0.0/24 gw 172.31.6.202 #去往10.20.0.0/24的下一跳是172.31.6.202
root@docker-server1:~# iptables -A FORWARD -s 172.31.0.0/21 -j ACCEPT #允许响应报文的转发
root@docker-server2:~# route add -net 10.10.0.0/24 gw 172.31.6.201
root@docker-server2:~# iptables -A FORWARD -s 172.31.0.0/21 -j ACCEPT
root@docker-server1:~# docker exec -it 6c10dcf457d8 sh
/ # ifconfig #当前容器ip
• eth0 Link encap:Ethernet HWaddr 02:42:0A:0A:00:02
• inet addr:10.10.0.2 Bcast:10.10.0.255 Mask:255.255.255.0
• UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
/ # ping 10.20.0.2 #测试容器跨主机通信
• PING 10.20.0.2 (10.20.0.2): 56 data bytes
• 64 bytes from 10.20.0.2: seq=0 ttl=62 time=1.018 msroot@docker-server2:~# docker network create --help
root@docker-server2:~# docker network create -d bridge --subnet 10.200.0.0/24 --gateway 10.200.0.1 magedu-net
root@docker-server2:~# docker run -it -p 8080:8080 --name magedu-net-test --net=magedu-net alpine:3.16.2 sh
/ # ifconfig
• eth0 Link encap:Ethernet HWaddr 02:42:0A:C8:00:02
• inet addr:10.200.0.2 Bcast:10.200.0.255 Mask:255.255.255.0
/ # ping www.jd.com #测试与外网通信
• PING www.jd.com (110.242.21.33): 56 data bytes
• 64 bytes from 110.242.21.33: seq=0 ttl=127 time=42.20root@docker-server2:~# docker run -it -p 8080:8080 --name magedu-net-test --ip 10.200.0.100 --net=magedu-net alpine:3.16.2
sh
• / # ifconfig
• eth0 Link encap:Ethernet HWaddr 02:42:0A:C8:00:64FROM centos:7.9.2009
#在整个dockfile文件中除了注释之外的第一行,要是FROM指令,FROM 指令用于指定当前镜像(base image)引用的父镜像(parent image)
MAINTAINER #(镜像的维护者信息,目前已经不推荐使用)
LABEL “key”=“value” #设置镜像的属性标签
LABEL author="jack jack@gmail.com"
LABEL version="1.0"
ADD [--chown=<user>:<group>] <src>... <dest>
#用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,会自动解压tar.gz格式的压缩包,但不会自动解压zip包
ADD --chown=root:root test /opt/test
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 ["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"案例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(当做参数传递给ENTRYPOINTFROM ubuntu:22.04
MAINTAINER "jack 2973707860@qq.com"
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.0 && ./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
ADD nginx.conf /apps/nginx/conf/
ADD frontend.tar.gz /apps/nginx/html/
EXPOSE 80 443
#ENTRYPOINT ["nginx"]
CMD ["nginx","-g","daemon off;"]root@docker-server1:/opt/ubuntu# bash build-command.sh
root@docker-server1:/opt/ubuntu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
harbor.magedu.net/myserver/nginx v1 4b6ec2cfda10 14 minutes ago 468MBroot@docker-server1:~# docker commit --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
-a, --author string #镜像作者信息
-c, --change list #Dockerfile中的指令
-m, --message string #镜像提交信息
-p, --pause #提交镜像过程中暂定容器,默认为true
root@docker-server1:~# docker commit -m "nginx image v2" -a "user1 2973707860@qq.com" -c "EXPOSE 80 443" 3ac3619d2b61
harbor.magedu.net/myserver/nginx:v2
root@docker-server1:~# docker run -it -p 81:80 harbor.magedu.net/myserver/nginx:v2root@docker-server1:~# vim /etc/default/grub
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 cgroup_enable=memory swapaccount=1"
root@docker-server1:~# sudo update-grub
root@docker-server1:~# rebooDocker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小
Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了
大部分的选项取正整数,跟着一个后缀b,k, m,g,,表示字节,千字节,兆字节或千兆字节
--oom-score-adj #宿主机kernel对进程使用的内存进行评分,评分最高的将被宿主机内核kill掉(越低越不容易被kill),可以指定一个容器的评分为较低的负数,但是不推荐手动指定。
--oom-kill-disable #对某个容器关闭oom机制 -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@docker-server1:~# docker run -it --rm --name magedu-c1 lorel/docker-stress-ng --vm 2 --vm-bytes 256M
root@docker-server1:~# docker statsroot@docker-server1:~# docker run -it --rm -m 256m --name magedu-c1 lorel/docker-stress-ng --vm 2 --vm-bytes
256M
root@docker-server1:~# docker stat--memory-swap #只有在设置了 --memory 后才会有意义。使用Swap,可以让容器将超出限制部分的内存置换到磁盘上,
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@docker-server1:~# docker run -it --rm -m 256m --memory-reservation 128m --name magedu-c1
lorel/docker-stress-ng --vm 2 --vm-bytes 2root@docker-server1:~# docker run -it --rm -m 256m --oom-kill-disable --name magedu-c1 lorel/docker-stress- ng --vm 2 --vm-bytes 256root@docker-server1:~# cat
/sys/fs/cgroup/docker/b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed/memory.max
536870912
root@docker-server1:~# cat
/sys/fs/cgroup/docker/b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed/cpu.max
200000 10000root@docker-server1:~# docker start b7b3755f2296
b7b3755f2296
root@docker-server1:~# ps -ef | grep nginx #过滤出目的服务的进程号
root 18770 18736 1 17:08 ? 00:00:00 nginx: master process nginx -g daemon off;
systemd+ 18816 18770 0 17:08 ? 00:00:00 nginx: worker process
root@docker-server1:~# cat /proc/18770/cpuset #查询进程的限制
/system.slice/docker-b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed.scope
root@docker-server1:~# cat /sys/fs/cgroup/system.slice/docker- b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed.scope/cpu.max #查询cpu限制范围
200000 100000
root@docker-server1:~# cat /sys/fs/cgroup/system.slice/docker- b7b3755f22962538418dc56c23c03941cd7f97178ed8e25c7d02fbc4ca9878ed.scope/memory.max #查询内存限制范围
53687091更新镜像仓库并安装依赖包:
root@ubuntu2204:~# apt update
root@ubuntu2204:~# sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
导入docker的公钥:
root@ubuntu2204:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
添加镜像源:
root@ubuntu2204:~#echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker- ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
更新镜像仓库:
root@ubuntu2204:~# apt update
验证containerd版本:
root@ubuntu2204:~# apt-cache madison containerd.io
containerd.io | 1.6.8-1 | https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu jammy/stable amd64 Packages
containerd.io | 1.6.7-1 | https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu jammy/stable amd64 Packages
安装containerd:
root@ubuntu2204:~# apt install containerd.io=1.6.8-1
root@ubuntu2204:~# containerd --version
containerd containerd.io 1.6.8 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6root@containerd-server1:~# cat /lib/systemd/system/containerd.service
# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.targetctr:
#ctr images pull docker.io/library/nginx:1.20.2
#ctr -n k8s.io images ls
#ctr images ls
运行容器并使用宿主机网络:
#ctr run -t --net-host docker.io/library/nginx:1.20.2 test-container1
#nerdctl-是一个兼容docker的containerd的客户端,https://github.com/containerd/nerdctl
# wget https://github.com/containerd/nerdctl/releases/download/v0.23.0/nerdctl-0.23.0-linux-amd64.tar.gz
# tar xvf nerdctl-0.23.0-linux-amd64.tar.gz -C /usr/bin/
cni:
# wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
# mkdir /opt/cni/bin -pv
# tar xvf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin/
创建容器并指定端口:
# nerdctl run -d -p 80:80 --name=nginx-web1 --restart=always nginx:1.22.0-alpine
# nerdctl ps
# nerdctl exec -it 858730bb0492 sh
# nerdctl run -d -p 8080:8080 --name=tomcat-web1 --restart=always tomcat:7.0.88-alpineroot@containerd-server1:~# whereis runc
runc: /usr/sbin/runc /usr/share/man/man8/runc.8.gz
root@containerd-server1:~#
root@containerd-server1:~# whereis containerd
containerd: /usr/bin/containerd /usr/share/man/man8/containerd.8.gz
root@containerd-server1:~#
root@containerd-server1:~# runc -v
runc version 1.1.4-0ubuntu1~22.04.1
spec: 1.0.2-dev
go: go1.18.1
libseccomp: 2.5.3
root@containerd-server1:~# containerd -v
containerd github.com/containerd/containerd 1.6.12-0ubuntu1~22.04.1root@containerd-server1:~# containerd --help
root@containerd-server1:~# containerd config --help
root@containerd-server1:~# containerd config default #查看默认配置
root@containerd-server1:~# mkdir /etc/containerd/
root@containerd-server1:~# containerd config default > /etc/containerd/config.toml
root@containerd-server1:~# systemctl restart containerd.serviceroot@containerd-server1:~# ctr images ls
root@containerd-server1:~# ctr -n k8s.io images ls #指定namespaces为k8s.io
REF TYPE DIGEST SIZE PLATFORMS LABELSroot@containerd-server1:/usr/local/src# wget
https://github.com/containerd/containerd/releases/download/v1.6.20/containerd-1.6.20-
linux-amd64.tar.gz
root@containerd-server1:/usr/local/src# tar xvf containerd-1.6.20-linux-amd64.tar.gz
bin/
bin/containerd-shim
bin/containerd-shim-runc-v1
bin/containerd-stress
bin/containerd
bin/ctr
bin/containerd-shim-runc-v2
#copy⼆进制
root@containerd-server1:/usr/local/src# cp bin/* /usr/local/bin/
#验证containerd执⾏结果
root@containerd-server1:/usr/local/src# containerd -v
containerd github.com/containerd/containerd v1.6.20
2806fc1057397dbaeefbea0e4e17bddfbd388f38
#创建service⽂件
root@containerd-server1:/usr/local/src# vim /lib/systemd/system/containerd.service
# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/usr/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
1.3.2:编辑配置⽂件:
1.3.3:部署runc:
1.3.4:下载测试镜像并验证:
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.targetroot@containerd-server1:~# mkdir /etc/containerd
root@containerd-server1:~# containerd config default > /etc/containerd/config.toml
root@containerd-server1:~# vim /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7" #61
[plugins."io.containerd.grpc.v1.cri".registry.mirrors] #153
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] #154
endpoint = ["https://9916w1ow.mirror.aliyuncs.com"] #155
root@containerd-server1:~# systemctl restart containerd && systemctl enable
containerdroot@containerd-server1:~# wget
https://github.com/opencontainers/runc/releases/download/v1.1.5/runc.amd64
root@containerd-server1:~# chmod a+x runc.amd64
root@containerd-server1:~# mv runc.amd64 /usr/bin/runcroot@containerd-server1:~# ctr images pull docker.io/library/alpine:latest
root@containerd-server1:~# ctr images ls
root@containerd-server1:~# ctr -n k8s.io images ls #指定namespacesroot@containerd-server1:~# wget https://github.com/kubernetes-sigs/critools/releases/download/v1.26.1/crictl-v1.26.1-linux-amd64.tar.gz
root@containerd-server1:~# tar xvf crictl-v1.26.1-linux-amd64.tar.gz -C
/usr/local/bin/
crictl
root@containerd-server1:~# crictl -v
crictl version v1.26.1root@containerd-server1:~# vim /etc/crictl.yaml
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 10
debug: falseroot@containerd-server1:~# crictl pull nginx:1.20.2
Image is up to date for
sha256:50fe74b50e0d0258922495297efbb9ebc3cbd5742103df1ca54dc21c07d24575
root@containerd-server1:~# crictl pull busybox
Image is up to date for
sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a
root@containerd-server1:~# crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/library/busybox latest beae173ccac6a 777kB
docker.io/library/nginx 1.20.2 50fe74b50e0d0 56.7MBroot@containerd-server1:~# wget
https://github.com/containerd/nerdctl/releases/download/v1.3.0/nerdctl-1.3.0-linuxamd64.tar.gz
root@containerd-server1:~# tar xvf nerdctl-1.3.0-linux-amd64.tar.gz -C /usr/local/bin/
root@containerd-server1:~# nerdctl version
Client:
Version: v1.3.0
OS/Arch: linux/amd64
Git commit: c6ddd63dea9aa438fdb0587c0d3d9ae61a60523e
buildctl:
Version:
Server:
containerd:
Version: v1.6.20
GitCommit: 2806fc1057397dbaeefbea0e4e17bddfbd388f38
runc:
Version: 1.1.5
GitCommit: v1.1.5-0-gf19387a6root@containerd-server1:~# mkdir /etc/nerdctl/
root@containerd-server1:~# vim /etc/nerdctl/nerdctl.toml
namespace = "k8s.io"
debug = false
debug_full = false
insecure_registry = trueroot@containerd-server1:~# wget
https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-pluginslinux-amd64-v1.2.0.tgz
root@containerd-server1:~# mkdir /opt/cni/bin -p #保存cni插件的路径
root@containerd-server1:~# tar xvf cni-plugins-linux-amd64-v1.2.0.tgz -C
/opt/cni/bin/
./
./loopback
./bandwidth
./ptp
./vlan
./host-device
./tuning
./vrf
./sbr
./dhcp
./static
./firewall
./macvlan
./dummy
./bridge
./ipvlan
./portmap
./host-local创建容器并制定端⼝
root@containerd-server1:~# nerdctl run -d -p 80:80 --name=nginx-web1 --restart=always
nginx
root@containerd-server1:~# nerdctl ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
936a48ea2c54 docker.io/library/nginx:latest "/docker-entrypoint.…" 36 seconds
ago Up 0.0.0.0:80->80/tcp nginx-web1
root@containerd-server1:~# nerdctl exec -it 936a48ea2c54 bash
root@936a48ea2c54:/#
root@containerd-server1:~# nerdctl run -t -d -p 3306:3306 -e
MYSQL_ROOT_PASSWORD=MySQL127336 -d mysql:5.6.39
29d6e0d997658c3390859a3a385da61dbeebd6d72f4274a0ccbb7aa28ec2df5e
测试远程连接MySQL:
root@containerd-server2:~# apt install mariadb-client
root@containerd-server2:~# mysql -uroot -pMySQL127336 -h172.31.6.201
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.39 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.002 sec)
MySQL [(none)]> create database myserver;
Query OK, 1 row affected (0.001 sec)
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| myserver |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)常见的公有镜像仓库:
Docker官方的镜像仓库:https://hub.docker.com
阿里云镜像仓库: https://cr.console.aliyun.com
Google镜像仓库: https://console.cloud.google.com/gcr/images/google-containers/GLOBAL
红帽镜像仓库:https://quay.io/search
商业镜像仓库:
AWS: https://aws.amazon.com/cn/ecr/
阿里云: https://cr.console.aliyun.com
Google镜像仓库: https://console.cloud.google.com/gcr/images/google-containers/GLOBAL
常见的私有自建镜像仓库:
Docker Registry:https://github.com/distribution/distribution
harbor:
https://github.com/goharbor/harbor
https://goharbor.iohttp镜像仓库:
1、安装docker:
root@docker-harbor1:~# cd /usr/local/src/
root@docker-harbor1:/usr/local/src# tar xvf docker-20.10.19- binary-install.tar.gz
root@docker-harbor1:/usr/local/src# bash docker-install.sh
2.安装harbor:
root@docker-harbor1:~# mkdir /apps
root@docker-harbor1:~# cd /apps/
root@docker-harbor1:/apps# tar xvf harbor-offline-installer- v2.6.1.tgz
root@docker-harbor1:/apps# cd harbor/
root@docker-harbor1:/apps# cp harbor.yml.tmpl harbor.yml
root@docker-harbor1:/apps/harbor# vim harbor.yml
hostname: harbor.magedu.net
http:
• port: 80
harbor_admin_password: 12345678docker主机登录
1.配置主机名解析
root@docker-server1:~# vim /etc/hosts
172.31.6.204 harbor.magedu.net
2.docker 服务器配置仓库信任:
root@docker-server1:~# vim /etc/docker/daemon.json
"insecure-registries": ["harbor.magedu.com","harbor.magedu.net",
"harbor.myserver.com","172.31.7.105"],
root@docker-server1:~# systemctl restart docker
root@docker-server1:~# docker login harbor.magedu.net
Username: admin
Password: xxxxxxxx #输入在自己的密码
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
3.上传镜像:
root@docker-server1:~# docker tag alpine:3.16.2 harbor.magedu.net/myserver/alpine:3.16.2
root@docker-server1:~# docker push harbor.magedu.net/myserver/alpine:3.16.2
4.验证镜像下载:
配置域名解析及仓库信任
root@docker-server1:~# docker pull harbor.magedu.net/myserver/alpine:3.16.2root@docker-harbor2:~# mkdir /apps/harbor/certs -pv
root@docker-harbor2:~# cd /apps/harbor/certs/
root@docker-harbor2:/apps/harbor/certs# openssl genrsa -out ca.key 4096
root@docker-harbor2:/apps/harbor/certs# openssl req -x509 -new -nodes -sha512
-days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=magedu.com" \ -key ca.key \ -out ca.crtroot@docker-harbor2:/apps/harbor/certs# openssl genrsa -out magedu.net.key 4096
root@docker-harbor2:/apps/harbor/certs# openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=magedu.net" \ -key magedu.net.key \ -out magedu.net.csr
root@docker-harbor2:/apps/harbor/certs# ll
total 16
drwxr-xr-x 2 root root 78 Oct 13 17:38 ./
drwxr-xr-x 3 root root 19 Oct 13 17:32 ../ -rw-r--r-- 1 root root 2041 Oct 13 17:35 ca.crt #ca 公钥
-rw------- 1 root root 3272 Oct 13 17:33 ca.key #ca 私钥
-rw-r--r-- 1 root root 1704 Oct 13 17:38 magedu.net.csr #harbor csr 文件
-rw------- 1 root root 3272 Oct 13 17:37 magedu.net.key #harbor 私钥root@docker-harbor2:/apps/harbor/certs# cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=magedu.com
DNS.2=harbor.magedu.net
DNS.3=harbor.magedu.local
EOF
root@docker-harbor2:/apps/harbor/certs#root@docker-harbor2:/apps/harbor/certs# openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in magedu.net.csr \ -out magedu.net.crt
Certificate request self-signature ok
subject=C = CN, ST = Beijing, L = Beijing, O = example, OU = Personal, CN = magedu.net
root@docker-harbor2:/apps/harbor/certs# ll
total 24
drwxr-xr-x 2 root root 114 Oct 13 17:47 ./
drwxr-xr-x 3 root root 19 Oct 13 17:32 ../ -rw-r--r-- 1 root root 2041 Oct 13 17:35 ca.crt -rw------- 1 root root 3272 Oct 13 17:33 ca.key
-rw-r--r-- 1 root root 2167 Oct 13 17:47 magedu.net.crt #签发后的 harbor 公钥
-rw-r--r-- 1 root root 1704 Oct 13 17:38 magedu.net.csr -rw------- 1 root root 3272 Oct 13 17:37 magedu.net.key
-rw-r--r-- 1 root root 279 Oct 13 17:39 v3.extroot@docker-harbor2:~# cd /apps/
root@docker-harbor2:/apps# tar xvf harbor-offline-installer-v2.6.1.tgz
root@docker-harbor2:/apps# cd harbor/
root@docker-harbor2:/apps/harbor# cp harbor.yml.tmpl harbor.yml
root@docker-harbor2:/apps/harbor# vim harbor.yml
hostname: harbor.magedu.net
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /apps/harbor/certs/magedu.net.crt
private_key: /apps/harbor/certs/magedu.net.key
harbor_admin_password: 12345678
root@docker-harbor2:/apps/harbor# ./install.sh --with-trivy --with-chartmuseuroot@docker-server2:~# docker login harbor.magedu.net
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 Succeededroot@docker-server2:~# docker pull alpine
root@docker-server2:~# docker tag alpine:latest harbor.magedu.net/library/alpine:latest
root@docker-server2:~# docker push harbor.magedu.net/library/alpine:latest
The push refers to repository [harbor.magedu.net/library/alpine]
8d3ac3489996: Pushed
latest: digest:
sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3
size: 528ubuntu apt:
root@docker-server1:~# apt install docker-compose
centos 7.x yum:
[root@centos7 ~]# yum install epel-release
[root@centos7 ~]# yum install docker-compose
pip:
root@docker-server1:~# apt install python3-pip
root@docker-server1:~# pip3 install docker-compose
二进制:
root@docker-server2:~# wget https://github.com/docker/compose/releases/download/1.xy.z/docker-compose-Linux-x86_64
root@docker-server2:~# cp docker-compose-Linux-x86_64 /usr/bin/docker-compose
root@docker-server2:~# chmod a+x /usr/bin/docker-compose
root@docker-server2:~# docker-compose version
docker-compose version 1.29.2, build 5becea4cversion: '3.6' #版本号,https://docs.docker.com/compose/compose-file/compose-versioning/
services: #定义服务
nginx-server: #当前容器的服务名
image: nginx:1.22.0-alpine #镜像名称
container_name: nginx-web1 #r容器名称
expose: #声明端口映射
- 80
- 443
ports: #定义端口映射
- "80:80" -root@docker-server2:~# docker-compose --help
Options:
-f, --file FILE #指定compsoe 文件,默认为docker-compose.yml
-p, --project-name NAME #指定功能名称,默认为当前所在的目录名
--profile NAME #指定一个服务名称,只对docker-compose.yml中某些指定的容器做创建、停止、重启、更新等操作
# docker-compose --profile frontend up -d
-c, --context NAME #指定Dockerfile的文件路径,也可以是链接到git仓库的url
--verbose #显示更多输出信息
--log-level LEVEL #定义日志级别,DEBUG, INFO, WARNING, ERROR, CRITICAL
--ansi (never|always|auto) #定义什么时候显示ANSI控制字符
--no-ansi #不显示ANSI字符,已废弃
-v, --version #显示docker-compose的版本信息
-H, --host HOST #连接到docker主机,默认为本机
--tls #启用tls
--tlscacert #tls ca私钥
--tlscert #tls ca公钥
--tlskey #服务私钥
--tlsverify #服务公钥
--skip-hostname-check #不对证书校验(跳过检查证书签发的主机名)
--env-file PATH #指定文件向容器添加环境变
#build #构建或重新构建服务、在修改Dockerfile后,可以通过docker-compose build重新构建镜像并重建服务
#bundle #从当前docker compose文件生成一个以当前目录为名称的从Compose文件生成一个分布式应用程序捆绑包(DAB)、已废弃
config -q #验证docker-compose.yml文件,没有错误不输出任何信息
#create #创建服务,但是容器不启动
down #停止并删除资源,默认会删除容器和网络
#events #从容器接收实时事件,可以指定json日志格式,如
# docker-compose events --json
#exec #基于service进入指定容器执行命令
# docker-compose ps --services
# docker-compose exec nginx-server sh
help #显示帮助细信息
images #列出本地镜像
kill #强制终止运行中的容器
# docker-compose kill -s SIGKILL nginx-server #SIG是信号名的通用前缀,KILL是指让一个进程立即终止的动作,合并起来SIGKILL就是发送
给一个进程使进程立即终止的信号。
logs #基于service查看容器的日志
# docker-compose logs --tail="10" -f nginx-server
#pause #暂停服务
# docker-compose ps --service
# docker-compose pause nginx-serve
#port #基于service查看容器的端口绑定信息
# docker-compose port --protocol=tcp nginx-server 80
ps #列出容器信息
pull #拉取镜像
#push #上传镜像
#restart #重启服务
rm #删除已经停止的服务
#run #一次性运行容器,等于docker run --rm
scale #设置指定服务运行的容器个数
# docker-compose scale nginx-server=2 #动态伸缩每个service的副本数,不能指定容器名和端口映射
start #启动服务
# docker-compose start nginx-server
stop #停止服务
# docker-compose stop nginx-server
top #显示容器运行状态
# docker-compose top
unpause #取消暂定状态中的server
# docker-compose unpause nginx-server
up #创建并启动容器,通常配合-d参数在后台运行容器
# docker-compose up -d
version #显示docker-compose版本信root@ubuntu:~# apt install lxcfs #对容器实现更加准确的限制,内存、⽹络、磁盘IO、读写速率、磁盘空
间⼤⼩等
root@docker-server1:~# docker run -it -m 256m --storage-opt size=10G centos:7.6.1810
/bin/bash
docker: Error response from daemon: --storage-opt is supported only for overlay over
xfs with 'pquota' mount option.
root@ubuntu:~# cat /etc/fstab #磁盘挂载选项
/dev/sdb /var/lib/docker xfs defaults,prjquota 0 0
#限制内存为指定⼤⼩
docker run -it -m 256m \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
centos:7.9.2009 /bin/bash
\#限制只能使⽤1核CPU并绑定⾄id为2的cpu核⼼
docker run -it --cpus 1 --cpuset-cpus "2" \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
centos:7.9.2009 /bin/bash
#限制磁盘IO
docker run -it -m 256m --cpus 1 --cpuset-cpus "2" --device-read-iops /dev/sdb:10 --
device-write-iops /dev/sdb:10 \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
centos:7.9.2009 /bin/bash
#限制磁盘速录
docker run -it -m 256m --cpus 1 --device-read-bps /dev/vda:10MB --device-write-bps
/dev/vda:10MB \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
ubuntu:22.04 /bin/bash
#只限制⼤⼩只加--storage-opt size=10G 即可
docker run -it --storage-opt size=10G centos:7.6.1810 /bin/sh
#同时限制内存和磁盘空间
docker run -it -m 256m --storage-opt size=10G \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
centos:7.9.2009 /bin/bash #同时限制内存和磁盘要挂载lxcs