1.容器生态
容器技术的生态系统自下而上分别覆盖了IaaS层和PaaS层所涉及的各类问题,包括资源调度、编排、部署、监控、配置管理、存储网络管理、安全、容器化应用支撑平台等。如下图,其中docker、k8s、consul、etcd等都是此处需要关注的。
docker主要是轻量级容器引擎,起到容器(运行着服务)间隔离的作用,可以充分利用机器资源,自动化部署。
Kubernetes(k8s)主要用于管理容器集群,

1.1优势
- 持续部署与测试
- 跨云平台支持
- 环境标准化和版本控制
2.Docker使用
docker是虚拟化技术的升级,左图是一般的虚拟机,右图是docker,docker容器之间是共享底层操作系统的,自身不包含OS,这样就比传统虚拟机轻量级了很多,下图左是docker结构,右边是传统虚拟机。

Dockerfile描述镜像和容器,下图右侧显示了From指定的ubuntu基础镜像,基础镜像是只读的,最上层的容器层是读写层

2.1 三大核心概念
| Image镜像 | |
|---|---|
| Container容器 | 轻量级虚拟机 |
| Docker registry镜像仓库 | 类似与github等代码仓库,官方仓库https://hub.docker.com/ |
2.2 关联关系
3者的关系如下图,可以通过docker命令进行交互。

2.2.1 dockerfile VS Image VS Container
常用流程就是1.编写dockerfile,2.build生成一个镜像,(将镜像push到仓库 ,拉取镜像),3.启动容器。

Dockerfile用于描述镜像,
| 指令 | 解释 | 上例释义 |
|---|---|---|
| FROM | 指定基础镜像,执行from时会依赖传递 | 指定python3.6的基础镜像 |
| WORKDIR | 指定工作路径,类似于cd | 安装python的tornado包 |
RUN | 执行shell命令 | 把当前路径下的py文件添加到容器根目录下 |
| CMD | 启动服务,一个文件仅一个 | 服务启动命令 |
FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "/app/src/index.js"]
Image VS registry
本地创建的镜像也可以push到远程,从仓库pull拉取一个镜像。下图例子中,
- 先创建镜像
- 推送镜像到registry
- 根据registry的镜像启动容器,其实分了两步,先从registy拉取pull镜像到本地,再启动本地镜像。

2.2.2 命令
| 分类 | 命令 |
| 容器生命周期管理 | run、start/stop/restart、kill、rm、pause/unpause、create、exec |
| 容器操作 | ps、inspect、top、attach、events、logs、wait、export、port |
| 容器rootfs命令 | commit、cp、diff |
| 镜像仓库 | login、pull、push、search |
| 本地镜像管理 | images、rmi、tag、build、history、save、load、import |
| docker环境 | info、version |
| 类别 | 常用子命令 | 样例&功能 |
|---|---|---|
| 环境
| docker info
| Docker环境信息 Containers Images ... |
| docker version
| Client\Server: Version: 18.06.1-ce API version: 1.38 Go version: go1.10.3 Git commit: e68fc7a Built: Tue Aug 21 17:23:18 2018 OS/Arch: linux/amd64 Experimental: false | |
| 容器启动、关闭 | docker run
| 基于特定的镜像创建一个容器,并依据选项来控制该容器运行 docker run --name=mysqltest -d -p 3306:3306 mysql/mysql-server:5.7 该命令从mysql-server:5.7镜像启动一个容器,并执行echo命令 --name指定容器名字 -d 后台执行 -p 容器服务端口到主机端口映射 hostPort:container-Port |
| docker container ls -a | 查看容器 | |
| docker exec | | |
| docker start/stop/restart | 对于已经存在的容器,可以通过dockerstart/stop/restart命令来启动、停止和重启 docker stop ebed2fd3e3c5 | |
| docker rm | 删除容器 | |
| 镜像仓库
| docker pull | 从Docker registry中拉取image或repository docker pull docker.domain.com/username/ubuntu:18.04 docker pull mysql/mysql-server:5.7 从mysql仓库拉取tag是5.7的mysql-server镜像 |
| docker push | 将本地的image或repository推送到DockerHub的公共或私有镜像库
| |
| 镜像管理
| docker images | 可以列出主机上的镜像 |
| docker build | 用Dockerfile和docker build命令来完成一个新镜像的构建 docker build -t go/helloworld:1 -f Dockerfile.one . 还支持从 URL 构建,比如可以直接从 Git repo docker build https://github.com/twang2218/gitlab-ce-zh.git#:11.1 | |
| docker commit | 提交容器对镜像的修改 | |
| docker save | 保存镜像 | |
| docker rmi | 删除镜像 | |
| 容器运维 | docker ps | 查看容器的相关信息,默认只显示正在运行的容器的信息 |
3.Kubernetes
为了鲁棒性和更高的性能,我们通常一个服务有很多的实例,部署这些实例如果只靠docker,需要很多的人工干预,登陆一个机器,clone下来,再run,如果挂了还需要人工登陆再重启,扩容、缩容都需要很多人工。
Kubernetes的出现自动化了这些过程,自动执行扩容,管理,更新和删除容器的过程,换句话说它是一个容器编排的平台。用户只需要通过它的api去访问这个容器集群就可以了。

3.1 集群架构

用户通过api发送指令给master,master发信号给Node,master和node的组件如下:


3.2 核心概念
3.2.1 集群组件相关
| 节点 | 组件 | 功能 |
|---|---|---|
| master | API Server | 对外服务接口 用户操作的接口 |
| Scheduler | 资源调度 预定的调度策略将Pod调度到相应的机器上(Model) | |
| Controller manager | 管理控制器 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等 | |
| etcd | KV存储 用以保存了整个集群的状态 | |
| Node | Pod | 部署、水平扩展和制作副本的最小单元。 可以有多个容器Container(Docker 容器) Pod内的所有容器共享存储和网络,pod以外是node的OS、磁盘和IP
|
| Kubelet | 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理 | |
| kube-proxy | 负责为服务Service提供cluster内部的服务发现和负载均衡 监听 API server 中 service 和 endpoint 的变化情况 |
3.2.2 服务相关
Service & label &selector
service即服务,同一个node上可以混布很多不同的服务,每个服务上可以打上很多标签label,选择器可以根据一个或多个标签从集群中众多pods过滤出对应的pod。

可以在yaml中指定label,如下图4个pod是同一个App,不同阶段,上面两个是生产阶段,下面两个是测试阶段,左边两个是FE前端服务,右边两个是后端服务。

3.2.3 存储&网络
在容器中管理数据主要有两种方式:
- 数据卷(Data Volumes):一个可供一个或多个容器使用的特殊目录
- 挂载主机目录 (Bind mounts)
docker volume create my-vol
docker run -d -P \
--name web \
# -v my-vol:/wepapp \
--mount source=my-vol,target=/webapp \ #挂载到上面创建的数据卷
training/webapp \
python app.py
kubelet create volume
3.3 流程
3.3.1 定义pod by yaml
类似于通过dockerfile定义容器镜像,k8s的pod通过yaml文件定义,将yaml文件上传给master
k8s集群的master根据这样的yaml文件在集群的nodes中分配pod
样例1:启动一个pod,中运行两个容器



样例2:扩容成4个pod,每个pod两个web容器,分布是nginx,nginx转发my-app


3.3.2 定义service
Service


3.4 开放接口
#本地安装kubectl
#minikube
minikube start --driver=docker
| 命令 | 功能 |
|---|---|
| kubectl create -f xxx.yaml | 创建资源对象 |
| kubectl get nodes | 查看node |
| kubectl get pods -n <namespace> -o wide | 查看pods |
| kubectl describe | 描述资源,如node、pod |
| kubectl delete | 删除资源,如node、pod |
| kubectl exec <pod-name> date kubectl exec -it <pod-name> -c <container-name> /bin/bash | 执行pod第一个容器的date命令 执行指定pod、指定容器的bash命令 |
kubectl logs -f <pod-name> -c <container-name> | 查看日志(相当于tail -f 命令) |
本文介绍了容器技术的生态系统,重点讨论了Docker和Kubernetes。Docker作为轻量级容器引擎,提供资源隔离和自动化部署。Kubernetes(k8s)用于管理容器集群,实现持续部署、跨云平台支持和环境标准化。详细阐述了Docker的三大核心概念,Dockerfile与镜像、容器的关系,以及Kubernetes的集群架构、核心概念和服务相关组件,包括Pod、Service、Label和Selector的使用。


被折叠的 条评论
为什么被折叠?



