Docker-1

云计算:资源
IaaS(架构,计算,存储,网络等资源),PaaS(平台,软件运行时环境,数据库等),SaaS(软件)
容器云:覆盖了IaaS和PaaS
docker命令一般需root权限
info version run(-i -t ) start/stop/restart pull push images rmi(删镜像) rm(删容器)attach(连接到某容器进行观察) inspect (查看某容器或镜像)ps(查看各容器)commit(提交容器为镜像) events/logs(容器内进程的运行日志)/history
stats top(查看某容器中进程的运行情况)port(查看某容器的端口映射情况)

--link containerName:alias docker run时指定容器需连接到哪个容器,可指定多个,在容器内的/etc/hosts 加对应alias的ip记录

资源隔离namespace,通过clone_flags实现,即创建进程的同时创建相应的namespace,/proc/[pid]/ns目录下查看某进程的各namespace,
docker exec在运行的容器中执行新命令,实现:创建进程,通过setns系统调用使进程由原始namespace加入某namespace,但是pid namespace不可变动,再创建子进程(在新的pid namespace内)执行命令
unshare: 在已有进程上创建新namespace
UTS:主机名,域名隔离
IPC:进程间通信,信号量,消息队列和共享内存的隔离
PID:多个PID namespace 形成树状结构,父节点可以看到子节点的进程,反之不行,每个PID namespace的首进程(pid为1)需像init进程一样做孤儿进程的养父,为其收尸
Network:veth pair连接eth0网卡(容器的network namespace)和docker0网桥(主机的network namespace),veth pair建立前通过pipe通信
Mount:隔离文件系统
User:clone的新进程所属用户在新namespace内为root,即新namespace的root映射到外面可能就是普通用户

cgroups:限制,记录资源的使用,优先级分配(cpu,磁盘io),任务控制(挂起,恢复)
task(进程,线程) cgroup(控制组,带有资源控制标准,可含多个task) hierarchy(层级,多个cgroup形成的树状结构,多叉树,可绑定多个subsystem,操作系统可含多个层级) subsystem(可附加到多个层级,仅当目标层级无subsystem时可以)
task可以在不同层级的cgroup内,但不可在同一层级的不同cgroup内
docker处理方式: /sys/fs/cgroup/cpu/docker/容器id ,即为每个子系统创建一个同名的层级,类似说cpu子系统绑定的层级下创建docker控制组,docker控制组含对应具体容器的子cgroup,其他子系统(层级)同样
任务挂上钩子,当任务运行时涉及到资源,会触发钩子附带的子系统进行检测,(设置了OOM Control,默认)进程收到OOM信号而结束,或被挂起直到cgroup中其他进程释放了足够内存

Docker client发送请求,Docker daemon使用内部的API Server 接收请求,转发到内部模块或外部模块(volume,image,libnetwork)

client模式:docker 子命令,即发送请求给daemon并读取响应
daemon模式:docker daemon,即启动daemon进程
创建首进程dockerinit,并execv替换此进程的执行代码为用户指定命令(未指定为/bin/sh -c)

镜像:只读的容器模板,含文件系统结构和内容组成了rootfs(容器启动时内部进程可见的文件系统),联合挂载:一个挂载点挂载多个文件系统,在挂载点挂载了多层只读镜像层(rootfs),再挂载init-layer,再挂载读写层(容器层)
镜像由多镜像层组成,各容器共享镜像,只是大家容器层不一样
registry(Docker Hub,也可以搭建私有的) repository(某镜像的所有版本) tag(版本,默认latest) manifest(registry中镜像的元数据文件,拉到本地转化为config)
commit(容器的读写层打包,即原始的镜像上再多一层)
build(多种指定Dockerfile和对应资源文件的方式,daemon每条指令创建容器,运行指令,commit新镜像层,在新镜像上继续)
save:镜像保存至tar
load:从tar载入镜像
export:容器文件系统导出至tar
import:从tar中创建镜像

repositories.json: 各repository各tag的镜像id
镜像id对应文件:记录镜像的元数据,含diff_ids(即各层的diff_id)
chainID对应文件:diff_id可算出chainID,记录镜像层的元数据

docker daemon -s driver_name 指定存储驱动,默认aufs(联合挂载):diff目录下的各镜像层文件和init层和读写层(mountID)挂载到mnt目录下(mountID子目录下)
其他存储驱动:device mapper,overlay

volume(数据卷):绑定挂载,即保持容器内某目录和宿主机某目录一致,
创建 docker volume create 或docker run/create -v
-v /data (随机id) -v vname:/data(指定volume name) -v /host/dir:/data (指定宿主机目录)可多个-v
宿主机目录:/var/lib/docker/volumes/随机id或指定名称 或指定宿主机目录
Dockerfile: VOLUME /data 不可以指定宿主机目录,会破坏Dockerfile可移植性
–volumes-from containerName 创建容器时指定其和哪个容器共享volume,可指定多个
docker volume rm 或docker rm -v containerName 删除容器时删除volume 或docker run --rm 容器停止时删除容器和volume

网络:
CNM(容器网络模型):sandbox(容器网络栈,可以是network namespace或其他,含多个endpoint,可被多个network连接) network(连接多个endpoint,即连接了多个容器) endpoint(只属于一个network,一个sandbox)
内置驱动:
bridge:默认,网桥驱动,docker0,外界通信NAT,
host:不为容器创建网络协议栈(network namespace),即直接使用主机的网络环境
null:容器有自己的network namespace,但只有loopback网卡,如果不自己配置是无法使用
overlay:大规模云计算,需额外的配置存储服务如etcd
remote:无实现,remote驱动调用用户自己实现的驱动插件

docker network create/ls/rm
docker run --net networkName 创建endpoint加入网络,endpoint是网卡,容器内两endpoint即两网卡
docker network connect networkName containerName 创建endpoint加入网络

veth pair连接容器的eth0网卡(容器的network namespace)和docker0网桥(主机的network namespace),容器内查看route,默认网关的ip就是docker0(172.17.0.1),容器内的eth0分配一个docker0同网段的ip
docker daemon创建docker0时,可指定–bip (docker0的ip和子网范围,如192.168.100.1/24),–mtu
iptables: netfilter(防火墙,在内核空间),iptables是用户空间的命令行工具用于操作netfilter
规则:在哪个链上(如prerouting),在哪个表内(如raw),filter:过滤,nat:地址转换,mangle:拆解修改重新封装报文
规则匹配(srcIP,destIP等),处理动作(accept,drop,reject可能会给客户端一个应答,snat,masquerade类似snat,dnat,redirect为端口映射)
在这里插入图片描述

容器互相通信
1 docker network创建网络端点,docker daemon --icc (默认–icc打开的) forward链filter表加accept规则
2 --link,–link name:alias指可以从name指定容器接收数据,接收容器设置环境变量和修改/etc/hosts,修改iptables,源容器每个暴露的端口都添加2个accept规则(一个源到目标,一个目标到源)
容器对外通信:
出门规则:postrouting,masquerade(类似snat),对172.17.0.0/16(网络)下的ip做snat
进门规则:需要做端口映射,nat和filter表的docker链(不是初始的5链)各加一规则,做dnat和accept
对外通信需docker0和宿主机eth0的数据转发:内核的ip_forward功能需打开,daemon默认打开

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值