admin管理员组文章数量:1794759
【笔记】Enjoy Docker
1. 鸟瞰图
容器生态系统,包括核心技术,平台技术和支持技术。
容器核心技术,包括容器规范,容器runtime,容器管理工具,容器定义工具,容器OS,Registries。
- 容器规范由OCI指定,目前发布两个规范runtime spec和image format spec。
- runtime是容器真正运行的地方,runtime需要跟操作系统内核紧密协作,为容器提供运行环境。
- 容器管理工具帮助用户管理容器,runc的管理工具是docker engine,包含deamon和cli两个部分。
- 容器定义允许用户定义容器的内容和属性,这样容器就能够被保存,共享和重建。docker image是容器的模板,dockerfile是包含若干命令的文本文件,可以通过这些命令创建出docker image。
- docker hub
- 容器os是专门运行容器的操作系统,与常规os相比,体积更小,启动更快。
容器核心技术使得容器能够在单个host上运行,容器平台技术能够让容器作为集群在分布式环境中运行。
容器编排引擎就是docker swarm 和 k8s,容器管理平台就是rancher。
Rancher 是一个 Kubernetes 管理工具,让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托管服务提供商的集群,创建节点并安装 Kubernetes,或者导入在任何地方运行的现有 Kubernetes 集群。 Rancher 基于 Kubernetes 添加了新的功能,包括统一所有集群的身份验证和 RBAC,让系统管理员从一个位置控制全部集群的访问。 此外,Rancher 可以为集群和资源提供更精细的监控和告警,将日志发送到外部提供商,并通过应用商店(Application Catalog)直接集成 Helm。如果你拥有外部 CI/CD 系统,你可以将其与 Rancher 对接。没有的话,你也可以使用 Rancher 提供的 Fleet 自动部署和升级工作负载。 Rancher 是一个 全栈式 的 Kubernetes 容器管理平台,为你提供在任何地方都能成功运行 Kubernetes 的工具。
容器对外提供的技术能力,包括容器网络,服务发现,监控,数据管理,日志管理,安全。
- 容器与容器,容器与其他实体的连通和隔离,docker network以及第三方的flannel,weave
- 动态变化是微服务的一大特点,随着负载变化,client需要知道如何访问容器提供的服务,etcd和zookeeper
- 监控,docker ps/top/stats,docker stat API,sysdig
- OpenSCAP能够对容器镜像进行扫描,发现潜在漏洞
2. 核心技术
虚拟机提供整台机器(服务器)的虚拟化。虚拟机模拟物理机的硬件组件,例如 CPU、内存、网络接口卡、USB 控制器和声卡。您可以在虚拟环境中运行客户机操作系统和多个应用程序。 Docker 允许您在任何操作系统上运行应用程序。它采用隔离的用户空间实例,称为容器。
docker使软件具有超强的可移植能力,轻量级,可移植,自包含。
容器优势:build once,run anywhere,configure once,run anything
3. docker镜像
3.1. rootfs
3.2. copy-on-write
升级了docker版本,发现在构建镜像过程中,docker没有输出echo, ls, pwd等类似命令的类容,并且没有输出构建过程。老版本的docker则没有这个问题(具体哪个版本没有深究)
2. 解决方案
2.1. 方案一 (不推荐)
增加DOCKER_BUILDKIT参数,譬如这么执行构建命令:DOCKER_BUILDKIT=0 docker build .
2.2. 方案二 (强烈推荐)
增加--progress=plain参数,譬如这么执行构建命令:docker build --no-cache --progress=plain .
3.3. Registry
环境:172.16.7.151 CentOS 7.0 主机名:node1
[root@node1 ~]# docker run -d -p 5000:5000 --name wisedu_registry registry:2
本地push镜像到registry仓库:
代码语言:javascript代码运行次数:0运行复制[root@node1 ~]# docker pull ubuntu:16.04
[root@node1 ~]# docker tag ubuntu:16.04 localhost:5000/my-ubuntu
[root@node1 ~]# docker push localhost:5000/my-ubuntu
删除本地的ubuntu:16.04和localhost:5000/my-ubuntu镜像:
代码语言:javascript代码运行次数:0运行复制[root@node1 ~]# docker image remove ubuntu:16.04
[root@node1 ~]# docker image remove localhost:5000/my-ubuntu
从本地registry中拉取 localhost:5000/my-ubuntu 镜像:
[root@node1 ~]# docker pull localhost:5000/my-ubuntu
但是这种registry只是本地能使用,我们找另外一台主机172.16.7.152往该registry中push镜像就不行,需要HTTPS。
详见:
.html
4. docker容器
4.1. 容器分类
容器的生命周期依赖于启动时执行的命令,只要命令不结束,容器也就不会退出。
4.2. 资源限制
4.3. 底层技术
5. 容器网络
5.1. 3种原生网络
5.2. 创建自定义bridge
5.3. docker内通信
connect/docker server/join
5.4. docker外通信
5.5. 外界访问容器
docker-proxy 通过 iptables 实现了 nat 转发
6. docker存储
6.1. storage driver
6.2. bind mount
6.3. mount manger
6.4. 数据共享
volume数据放在host里
volume数据放在container里
docker 不会消除bind mount,删除数据的工作只能由host负责,对于docker manged volume,需要docker rm时带上-v参数,如果没用其他容器使用这个volume,就会删除容器的同时一并删除这个volume。
7. 多主机管理
1》 Docker Compose:单机,是用来组装多容器应用的工具,可以在 Swarm集群中部署分布式应用。 2》 Docker Machine:是支持多平台安装Docker的工具,使用 Docker Machine,可以很方便地在笔记本、云平台及数据中心里安装Docker。 3》 Docker Swarm:集群,是Docker社区原生提供的容器集群管理工具
它们可以说是几乎实现了容器化技术中所有可能需要的底层技术手段。
7.1. docker-compose
前面我们已经学习过使用一个Dockerfile
模板文件,可以很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器或者缓存服务容器,甚至还包括负载均衡容器等。Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose 中有两个重要的概念:
- 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。所以只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
7.2. docker-machine
负责在多种平台上快速安装 Docker 环境 创建docker虚拟机
ssh-copy-id -i .ssh/id_rsa.pub 用户名字@
有问题就查看:tail /var/log/secure -n 20
create前-D 可以debug
7.3. docker swarm
Swarm 集群 docker环境的集群 docker虚拟机的集群
8. 集群通信
可以看到有很多网络方案,那如此众多的方案是如何与docker集成在一起呢?答案就是libnetwork和CNM。
这里只学一个flannel就完了,既有overlay的网络模型,也有underlay的纯三层。
flannel是centos开发的容器网络解决方案,flannel为每个host分配一个subnet,容器从此subnet中分配ip,这些ip可以在host间路由,容器无须nat和port mapping就可以跨主机通信。每个subnet都是从更大的IP池划分,每个host上运行的flanneld的agent去从池子中划分subnet,然后为了各个主机间共享信息,会使用到etcd。数据包在各个主机转发使用的是backend实现,最常用的是vxlan和host-gw。
8.1. 安装etcd
代码语言:javascript代码运行次数:0运行复制mkdir -p /tmp/etcd-download-test
tar xzvf etcd-v3.5.15-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
/tmp/etcd-download-test/etcd --version
/tmp/etcd-download-test/etcdctl version
/tmp/etcd-download-test/etcdutl version
# start a local etcd server
/tmp/etcd-download-test/etcd -listen-client-urls http://192.168.134.31:2379 -advertise-client-urls http://192.168.134.31:2379&
# write,read to etcd
/tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
/tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
8.2. 安装flanneld
代码语言:javascript代码运行次数:0运行复制mkdir -p /tmp/flannel-download-test/
tar xzvf flannel-v0.25.5-linux-amd64.tar.gz -C /tmp/flannel-download-test
8.3. 测试
- 配置flannel网络地址池信息,并将配置存于etcd
- 在host1和host2启动flanneld,发现新增了网卡和两边host的互通路由
/tmp/flannel-download-test/flanneld -etcd-endpoints=http://192.168.134.31:2379 -iface=eth0 -etcd-prefix=/docker-test/network
就是这种感觉:
- docker.service配置
设置两边host的默认网桥地址
vim /usr/lib/systemd/system/docker.service
systemctl daemon-reload
systemctl restart docker.service
这里遇到一个小问题,修改docker.service文件不生效问题,原因应该是第二台主机使用的是docker machine安装,所以docker.service.d目录下会生成一个10-machine.conf的配置,因此它会优先加载docker.service.d中的启动项,我把这个目录删除就可以了:
就是这种感觉:
可见,同主机的还是通过docker0进行转发,跨主机的使用flannel.1转发
- 连通性验证
- 我抓个包,看看跨主机是不是vxlan,别忽悠我
9. Prometheus容器监控
Prometheus提供了一整套解决方案,包括数据的采集,存储,处理和可视化,告警,灰常牛。架构如下:
host上安装node expoter进行数据采集
配置Prometheus server
也可以自定义一个采集器exporter,client library一大堆,什么语言都有:
10. 日志
FileBeat导入容器日志到ELK
11. Reference
本文标签: 笔记Enjoy Docker
版权声明:本文标题:【笔记】Enjoy Docker 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754608705a1704334.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论