一、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