docker4--docker基础/namespace/cgroup/Dockerfile/docker数据持久化/harbor镜像/

一、docker基础

1、docker安装

参考文章:https://blog.youkuaiyun.com/weixin_44515412/article/details/118931101

2、docker命令

参考文章:
https://blog.youkuaiyun.com/weixin_44515412/article/details/107487614

3、版本信息

要求:系统内核版本3.10及以上
分为:CE社区版免费(17.03,17.06,17.09,17.12,18.03,18.06,18.09,19.03,20.10)和EE企业收费版

4、存储引擎

https://docs.docker.com/storage/storagedriver/select-storage-driver/
推荐使用:overlay2
故障案例:https://www.cnblogs.com/youruncloud/p/5736718.html

5、docker内部通信流程:
1. dockerd 通过 grpc 和 containerd 模块通信,dockerd 和 containerd 通信文件:/run/containerd/containerd.sock。
2. containerd 在 dockerd 启动时被启动,然后 containerd 启动 grpc 请求监听,containerd 处理 grpc 请求,根据请求做相应动作。
/usr/bin/dockerd -H fd://--containerd=/run/containerd/containerd.sock
3. 若是创建容器,containerd 拉起一个 container-shim , 并进行相应的创建操作。
4. container-shim 被拉起后,start/exec/create 拉起 runc 进程,通过 exit、control文件和containerd 通信,通过父子进程关系和 SIGCHLD(信号)监控容器中进程状态。
5. 在整个容器生命周期中,containerd 通过 epoll 监控容器文件,监控容器事件

gRPC:是Google开发的一款高性能、开源和通用的RPC框架,支持众多语言客户端。https://www.grpc.io/

二、基础的容器运行环境

1、Namespace:实现容器运行空间的相互隔离

属于内核层
所有容器共用宿主机内核

(1)MNT Namespace:文件系统、磁盘挂载点的隔离

#宿主机是Ubuntu,容器可以是centos。容器里起的服务如nginx的运行环境为centos,而无法访问主机资源。
# uname -r
#宿主机使用chroot技术将容器锁定到指定的运行目录里
#/var/lib/containerd/io.containerd.runtime.v2.task/moby/容器 ID

实验:

#启动三个容器用于以下验证过程:
# docker run -d --name nginx-1 -p 80:80 nginx
# docker run -d --name nginx-2 -p 81:80 nginx
# docker run -d --name nginx-3 -p 82:80 nginx

#Debian 系统安装基础命令:
# apt update
# apt install procps (top 命令)
# apt install iputils-ping (ping 命令)
# apt install net-tools (网络工具)

#验证容器的根文件系统:
# cat /etc/redhat-release
# docker exec -it 5a7c6090b8adae677c8c sh
#1s / #容器的根文件系统,每个容器都有一个独立且完整的根文件系统
bin boot dev etc home index.html lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

(2)IPC Namespace:进程间通信的隔离
允许一个容器内的进程间通信,不能跨容器访问

(3)UTS Namespace:主机名、域名的隔离
用于系统标识,包含主机名和域名,各容器唯一,互相独立

# hostname
# cat /etc/issue

(4)PID Namespace:进程的隔离
宿主机父进程init/systemd(pid=1)
容器内进程互相独立(可存在不同容器间pid相同,等)

#宿主机pid与容器pid关系:
# ps -ef |grep docker #1806之后的版本
systemd(1)-->dockerd(被client直接访问)-->docker-proxy(实现容器通信)
systemd(1)-->containerd(被dockerd进程调用以实现与runc的交互)-->containerd-shim(真正运行容器的载体)-->nginx(容器内服务)(master)-->nginx(worker)

# ps -ef |grep nginx
# top -n 1
worker-->master(pid=1)

(5)Net Namespace:网卡、监听端口、TCP/IP 协议栈等的隔离
docker0 虚拟网桥 数据链路层 mac地址划分网络

# ifconfig
# brctl show #查看宿主机桥接设备
# iptables -t nat -vnL #宿主机iptables规则
# iptables -vnL

(6)User Namespace:用户名、组名、UID、GID的隔离
仅在当前容器有效,互相隔离、互不影响

# id
2、Cgroups

属于内核层
宿主机对容器进行资源分配限制,如CPU、内存、磁盘、网络带宽、进程等

# cat /boot/config-4.15.0-20-generic | grep CGROUP  #内核层默认开启,ubuntu支持功能更多
# cat /boot/config-4.15.0-20-generic | grep MEM |grep CG  #cgroups中内存模块
# ll /sys/fs/cgroup/  #cgroups具体实现
	blkio          			#块设备 IO 限制
	cpu -> cpu,cpuacct    	#使用调度程序为 cgroup 任务提供 cpu 的访问
	cpuacct -> cpu,cpuacct  #产生 cgroup 任务的 cpu 资源报告
	cpu,cpuacct     		
	cpuset      		  	#如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存
	devices       			#允许或拒绝 cgroup 任务对设备的访问
	fre
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值