云原生工程师-1.容器相关

个人博客地址

一.docker容器相关

1.服务器虚拟机容器的区别基础知识

k8s1.24之前:docker 1.24之后containerd

docker主要制作镜像:docker build,dockerfile

1服务器,2虚拟机和3容器的区别:
1.完整操作系统的机器。
linux服务器不容易崩溃,耐用性,一年不关机也不会影响性能
2.软件模拟具有完整硬件系统功能的计算机系统:VM,VBox,KVM。Xen等
完全隔离,不影响主机
3.容器:沙盒技术,将应用运行在其中,装应用软件的箱子。可以被转移。不影响里面软件的运行

虚拟机需要模拟物理机的所有资源,在软件层通过计算资源实现。
容器仅在操作系统层面上,对所需的各类资源进行的隔离,具有敏捷和高性能,直接调用宿主机操作系统。不需要虚拟化软件处理。环境不同的操作系统docker可以直接封装转移。

镜像:封装了服务
1.环境的强一致性。提供了除内核外完整的运行时环境。
2.迁移方便,持续交付和部署。

docker:go语言开发,项目在github上进行维护
容器是完全使用沙箱机制,相互之间不会有任何接口调用

2.docker的基础使用

docker的优点:快,敏捷,灵活(应用和系统容器化,不添加额外),轻量(可以部署很多容器),便宜

docker的缺点:所有容器共用linux kernel,资源能否实现最大限度利用,安全也可能存在漏洞(内核问题)

1.安装docker:

`yum install yum-utils -y`
`yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#!/bin/bash
#需要epel源
yum install -y epel-release
systemctl stop firewalld
systemctl disable firewalld

sed -i  's/SELINUX=enforcing/SELINUX=disabled/'  /etc/sysconfig/selinux
sed -i  's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

swapoff  -a

sed -i 's/.*swap.*/#&/' /etc/fstab

yum install -y ntpdate
timedatectl set-timezone Asia/Shanghai
ntpdate cn.pool.ntp.org

yum install -y docker-ce 
yum install -y docker-compose

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://3ri333r1.mirror.aliyuncs.com","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2.常用命令

镜像篇:
查找 `docker search name`
拉取 `docker pull name:tag`
查看 docker images
删除 docker rmi name(ID)
离线压缩包 docker save -o name.tar.gz imagename
解压离线镜像包 docker load -i name.tar.gz

批量解压拉取镜像包:

#!/bin/sh
#当前路径
SUM=`ls -l|wc -l`
a=2
while ((a<+$SUM+1))
do
  NAME=`ls -l|awk -F ' ' 'NR=='$a'{print $9}'`
  echo $NAME
  docker load -i $NAME
  ((a++));
done
————————
#!/bin/sh
#手动输入路径
echo "INFO:Enter the pull path."
read ROUTE
SUM=`ls -l $ROUTE|wc -l`
a=2
while ((a<+$SUM+1))
do
  NAME=`ls -l|awk -F ' ' 'NR=='$a'{print $9}'`
  echo $NAME
  docker load -i $ROUTE"/"$NAME
  ((a++));
done
————————
容器篇:
以交互式启动进入容器 docker run --name=name -it image:tag /bin/bash
i 交互式 t分配伪终端 #退出容器也会退出
以守护进程启动容器 docker run --name=name -itd image:tag /bin/bash
进入容器:docker exec -it name /bin/bash
stop 停止 start启动 restart重启 rm -f删除
其他启动参数:
docker run --name=name 这里添加 -it image:tag /bin/bash
-p 宿主机端口:80 #映射容器80端口到物理机的指定端口
-P #指定随机端口映射
-e MYSQL_ROOT_PASSWORD=密码 #环境变量
-v /主机目录:/容器目录 #文件映射
docker容器互联
--net 指定网络模式
bridge 模式:使--net =bridge 指定,默认设置;
#通过DHCP获取IP地址 
host 模式:使--net =host 指定;
#共享主机网络
none 模式:使--net =none 指定; 
#没有网络地址,只有lo网卡
container 模式:使用--net =container:NAME orID 指定。
#指定其和已经存在的容器共享一个network namespace。共享其网络。
--link设置网络别名
--link=[CONTAINER_NAME]:[ALIAS] #容器名:别名 访问直接访问别名

3.containerd

1.Containerd和Docker之间的关系:

docker包含containerd,containerd专注运行时的容器管理,docker还有镜像构建之类的功能。containerd提供API偏底层,容器编排开发者才需要containerd。

containerd不是直接面向最终用户,而是主要用于集成到更上层的系统,如kubernetes容器编排系统。

containerd以daemon(守护进程)的形式运行在系统上,通过Unix domain socket 暴露底层的grpc API,上层系统可以通过这些API管理机器上的容器

2.K8S弃用docker,使用containerd的原因:

docker和kubernetes等工具运行容器时会调用容器运行时(CRI),比如containerd,CRI-O,通过容器运行时来完成容器的创建和运行等工作;docker使用的是containerd作为其运行时;kubernetes 支持docker,containerd,CRI-O等多种。这些都遵循了OCI(开发的治理结构的项目,容器行业标准)规范,并通过runc来实现操作系统内核交互来完成容器的创建和运行;

CRI是一个插件接口,容器运行时接口(CRI)是kubelet等容器运行时之间通信的主要协议。
简单来说docker:kubernetes(kubelet)->dockershim->docker->containerd->CRI(runc)
containerd: kubernetes(kubelet)->containerd->CRI
调用链变短,资源占用变小

3.安装部分
containerd的安装:
yum install yum-utils -y
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

初始化containerd配置:
containerd config default > /etc/containerd/config.toml #生成默认的配置文件
编辑里面的内容:

sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.3"
systemctl daemon-reload
systemctl restart containerd

ctr images pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.3

4.containerd相关操作
(ctr拉取镜像必须全名称)
ctr ns ls #查看namespace命名空间
ctr i ls #查看image镜像列表
ctr -n default i ls #指定命名空间
ctr -n=namesapce images pull name:tag #指定镜像拉取命名空间
ctr images export busybox.tar.gz docker.io/library/busybox:latest #当前目录下压缩镜像成包
ctr images import name.tar.gz #拉取镜像
ctr i tag 修改标签

containerd容器相关:
相关词,containers和task。docker是将其整合起来基于docker run运行容器
ctr 中containers是镜像实例化的一个虚拟环境,提供模拟空间,就好比电脑关机
ctr 中tasks就是将容器运行起来,电脑开机,初始化进程–停止容器前需要先停掉task

#创建task,运行容器
ctr run -d docker.io/library/busybox:latest busybox1
#查看PID
ctr task ls
#进入容器
ctr task exec --exec-id PID -t 容器name sh
#删除task
ctr task rm -f 容器name
#容器
ctr containers ls
ctr c rm 容器name

4.dockerfile

docker build -t nginx:v1 -f /root/dockerfile-nginx

Dockerfile 是一个用来构建镜像的文本文件
#实例文本(构建自定义web)
FROM centos  #基于哪个镜像
MAINTAINER eternal #作者
RUN rm -rf /etc/yum.repos.d/* #运行指令 
COPY Centos.repo /etc/yum.repos.d/ #拷贝repo源
RUN yum install wget -y
RUN yum install nginx -y
COPY index.html /usr/share/nginx/html/
EXPOSE 80 #声明端口,一个或者多个
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
dockerfile 构建过程:
从基础镜像运行一个容器
执行一条指令,对容器做出修改
执行类似 docker commit 的操作,提交一个新的镜像层
再基于刚提交的镜像运行一个新的容器
执行 dockerfile 中的下一条指令,直至所有指令执行完毕

——————————

1-RUN:指定在当前镜像构建过程中要运行的命令
包含两种模式
1、Shell
RUN <command> (shell 模式,这个是最常用的,需要记住)
RUN echo hello
2、exec 模式
RUN [“executable”,“param1”,“param2”](exec 模式)
RUN [“/bin/bash”,”-c”,”echo hello”]
等价于/bin/bash -c echo hello

————————————

2-CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
1、CMD 在 docker run 时运行。
2、RUN 是在 docker build 构建镜像时运行的
CMD[“executable”,“param1”,“param2”](exec 模式)
CMD command (shell 模式)
CMD [“param1”,”param2”](作为 ENTRYPOINT 指令的默认参数)

————————————

3-ENTERYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 entrypoint 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTERYPOINT [“executable”,“param1”,“param2”](exec 模式)
ENTERYPOINT command (shell 模式)
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下
示例会提到。
示例:
假设已通过 Dockerfile 构建了 nginx:test 镜像:
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
不传:  docker run nginx:test
容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
传参: docker run nginx:test -c /etc/nginx/new.conf
容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
nginx -c /etc/nginx/new.conf

——————————

4-COPY <文件路径> <目标文件路径>
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

——————————

5-ADD <文件路径> <目标文件路径>
ADD 指令和 COPY 的使用格式一致, 但是会自动解压。如果单纯复制文件,建议copy

——————————

6-VOLUME <路径>
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
1、避免重要的数据,因容器重启而丢失,这是非常致命的。
2、避免容器不断变大。
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点

——————————

7-WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。

——————————

8-ENV  <工作目录路径>
设置环境变量
ENV <key> <value>

——————————

9- ONBUILD
用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROMtest-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的ONBUILD 指定的命令。

——————————

10-LABEL metadata
添加元数据,如作者 LABEL image=eternal

——————————

11-HEALTHCHECK
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

——————————

12-ARG
和ENV一样,但是只有在构建中有效

——————————

5.容器调优-docker资源配额

1.通过cgroup限制CPU,内存,磁盘

#CPU篇

–cpu-shares size

**默认每个docker的cpu份额为1024.**在同一个CPU核心上时,加权效果才能体现。(A和B容器占用同一个CPU,分别为1000和500,A会比B多一倍的机会获得CPU的时间片。)

分配结果受:份额值,运行状态(A空闲B会更占用),CPU占用(B独占,即使份额低,也会全站)

2.CPU core核心控制

–cpuset

对于多核服务器,docker可以通过–cpuset-cpus和–cpuset-mems控制内核和内存节点。(多核可以对需要高性能容器进行性能最优配置)

3.CPU配额控制参数混合使用

cpu-shares 控制只发生在容器竞争同一个 cpu 的时间片时有效。 如果通过 cpuset-cpus 指定容器 A 使用 cpu 0,容器 B 只是用 cpu1,在主机上只有这两个容器使用 对应内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。

容器A和容器B cpuset-cpus绑定同一个cpu,配置cpu-shares可以看出效果

#–linux系统压力测试软件Stress

-c 产生 n 个进程 :每个进程都反复不停的计算随机数的平方根

-i 产生 n 个进程 :每个进程反复调用 sync(),sync()用于将内存上的内容写到硬 盘上,测试磁盘 io

-m --vm n 产生 n 个进程,每个进程不断调用内存分配 malloc()和内存释放 free()函 数 ,测试内存

stress -c 2 -i 2 --verbose --timeout 20s #产生 2 个 cpu 进程,2 个 io 进程,20 秒后停止运行

-----P42

#内存篇:

-m sizeM/G // --memory=sizem/g

docker run -it --cpuset-cpus 0,1 -m 128m centos #只使用2个核心128mb

#硬盘IO篇:

–device 参数:将主机设备添加到容器

–device-read-bps value #限制读速度

–device-write-bps value #限制写速度

示例:docker run -dit --name test --device /dev/sda:/dev/sda --device-write-bps /dev/sda:2mb centos

6.docker私有harbor仓库

#安装harbor:

安装基础软件包
[root@ harbor~]# yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncursesdevel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack

/root/harbor/ssl

openssl genrsa -out ca.key 3072

openssl req -new -x509 -days 3650 -key ca.key -out ca.pem

openssl genrsa -out harbor.key 3072

openssl req -new -key harbor.key -out harbor.csr

openssl x509 -req -in harbor.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out harbor.pem -days 3650

[root@harbor ssl]# ls
ca.key ca.pem ca.srl harbor.csr harbor.key harbor.pem

下载包Tags · goharbor/harbor · GitHub

[root@harbor harbor]# tar -zxvf harbor-offline-installer-v2.7.1.tgz

[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml

hostname: harbor 
certificate: /root/harbor/ssl/harbor.pem
private_key: /root/harbor/ssl/harbor.key

harbor 默认的账号密码:admin/Harbor12345

cd /root/harbor/harbor

配置:[root@harbor harbor]# cat /etc/docker/daemon.json

{

"insecure-registries": ["0.0.0.0","harbor"]

}

docker login

docker tag centos:latest 0.0.0.0/library/centos:v1

docker push 0.0.0.0/library/centos:v1

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永恒布gg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值