Docker相关知识点

容器和虚拟机的比较

特性容器虚拟机
启动速度秒级分钟级
性能接近原生较弱
内存代价很小较多
硬盘使用一般为 MB一般为 GB
运行密度单机支持上千个容器一般几十个
隔离性完全隔离完全隔离
迁移性优秀一般

镜像自身是只读的,容器从镜像启动的时候,会在镜像的最上层创建一个可写层

Dockerfile

dockerfile 一般格式

1
2
3
4
5
6
7
8
FROM
ENV
RUN
ADD(自动解压)
COPY(不自动解压)
EXPOSE
CMD
ENTRYPOINT

.dockerignore 忽略 build 的内容

基础镜像 alpine

apk –update add –no-cache

这样可以大幅度减少构建出来的 docker 镜像的大小

神秘镜像 scratch

其实这个镜像你去拉是会报错的,更多的是一种类似约定的东西,告诉 Docker,这个就是一个空的东西

1
FROM scratch

基本概念

docker 本质上是一个 C/S 架构

docker 服务端 unix://var/run/docker.socket

如果要以端口的方式暴露,则需要修改执行命令,设置地址和端口,比如 docker daemon -H 0.0.0.0:1234

客户端如果要连接不同的服务端,也需要额外指定,比如 docker -H tcp://127.0.0.1:1234 version

命令 ip addr show docker0 能看到 docker 网卡的相关信息

docker registry 可以配置 hooks 通知(pull or push)

docker 第三方安全检测工具:

  • docker -> docker bench
  • CoreOS -> clair

容器里的网络 eth0 <-> docker0 网桥上的 vethXXX(veth pair,当数据包发送到一个接口时另外一个接口也可以接收到相同的数据包)

docker 的 link 主要是添加一个所连接容器的主机名到容器内的/etc/hosts 文件中

查看 docker 网络信息 docker network ls

docker 网络分三种:null、host、bridge

etcd

简单: RESTful 接口
安全: 基于 HTTPS
快速: 支持每秒 1000 个写操作
可靠: 基于 Raft 算法

节点个数推荐为奇数个,最少为 3 个

越多节点能提供更多的冗余性,但会带来写数据性能的下降

Docker Swarm

docker swarm 也支持调度,亲和性这些 k8s 的概念

Kubernetes

Pod 为什么不能通过 IP 访问?

因为 Pod 随时可能会发生故障,重启后可能会被调度到其他节点上,IP 地址就会改变

通过 Service 来访问,Service 被创建后,会自动分配一个 Cluster IP,基于 kube-proxy 实现

kube-proxy 维护节点上的网络规则,作用是使发往 Service 的流量(ClusterIP + 端口)负载均衡到正确的后端 Pod

Label 主要是用来分类资源,比如 name=nginx,release=alpha|beta,有长度限制

Annotation 则主要是给对象增加更丰富的描述信息,可以是任意的,数据量可以很大,可以包含结构化或非结构化数据

Namespace

类似于租户的概念,同一个命名空间的资源不允许重名,但不同命名空间下则允许

default: 资源未指定命名空间的情况下,默认属于该命名空间

kube-system:由 Kubernetes 自身创建的资源属于该命名空间下

hyperkube:提供所有的 k8s 组件支持

etcd:提供数据库存储

pause:一个轻量级的基础设施容器,用于为每个 Pod 提前创建命名空间,其他什么也不做

Pod

Pod 的创建流程

  • kubectl 命令发起一个创建 Pod 的请求去到 kube-apiserver
  • kube-apiserver 完成基本的验证和授权操作,把 Pod 的相关信息写入 etcd
  • kube-scheduler 定时请求 kube-apiserver,确定 Pod 要调度的位置
  • kube-apiserver 写 etcd
  • kube-apiserver 将信息发给 kubelet 完成 Pod 的创建
  • kube-controller-manager 定时请求 kube-apiserver,看 Pod 是否挂掉

各个组件及其作用

名称作用
etcd记录所有节点和资源的状态
kube-apiserver接收来自客户端和其他组件的请求,更新 etcd 中的数据
kube-scheduler负责具体的资源调度工作
kube-controller-manager提供控制器服务,监视集群的状态,一但不满足状态则采取操作,让状态恢复正常
kubelet负责干活
kube-proxy网络转发(默认轮询)