容器基础之(一)容器生态系统【1】
一、容器生态系统
对于像容器这类平台级别的技术,通常涉及的知识范围会很广,相关的软件,解决方案也会很多,初学者往往容易迷失,我们可以从生活经验中寻找答案。比如,当我们去陌生城市旅游会怎么做?大部分人应该会打开这座城市的地图:
1. 城市大概的位置和地理形状是什么?
2. 都由哪几个区或县组成?
3. 主要的交通干道是哪几条?
同样的道理,学习容器技术我们先这样看看:
1. 容器生态系统包含哪些不同层次的技术?
2. 不同技术之间是什么关系?
3. 哪些是核心技术哪些是辅助技术?
首先,得对容器技术有个整体认识。这样我们的学习才能够有的放矢,才能够分清轻重缓急,做到心中有数。接下来我会根据自己的经验帮大家规划一条学习路线,一起探索容器生态系统。学习新技术得到及时反馈是非常重要的,所以我们马上会搭建实验环境,并运行第一个容器,感受什么是容器。千里之行始于足下,让我们从了解生态系统开始吧。
(一)容器生态系统
一谈到容器,大家都会想到 Docker。Docker 现在几乎是容器的代名词。确实,是 Docker 将容器技术发扬光大。同时,大家也需要知道围绕 Docker 还有一个生态系统。Docker 是这个生态系统的基石,但完善的生态系统才是保障 Docker 以及容器技术能够真正健康发展的决定因素。大致来看,容器生态系统包含核心技术、平台技术和支持技术。
(1)容器核心技术
容器核心技术是指能够让 container 在 host 上运行起来的那些技术。 这些技术包括容器规范、容器 runtime、容器管理工具、容器定义工具、Registry 以及 容器 OS,下面分别介绍。
①容器规范
容器不光是 Docker,还有其他容器,比如 CoreOS 的 rkt。为了保证容器生态的健康发展,保证不同容器之间能够兼容,包含 Docker、CoreOS、Google在内的若干公司共同成立了一个叫 Open Container Initiative(OCI) 的组织,其目是制定开放的容器规范。
目前 OCI 发布了两个规范:runtime spec 和 image format spec。 有了这两个规范,不同组织和厂商开发的容器能够在不同的 runtime 上运行。这样就保证了容器的可移植性和互操作性。
②容器的runtime
runtime 是容器真正运行的地方。runtime 需要跟操作系统 kernel 紧密协作,为容器提供运行环境。如果大家用过 Java,可以这样来理解 runtime 与容器的关系:Java 程序就好比是容器,JVM 则好比是 runtime。JVM 为 Java 程序提供运行环境。同样的道理,容器只有在 runtime 中才能运行。
lxc、runc 和 rkt 是目前主流的三种容器 runtime:
lxc 是 Linux 上老牌的容器 runtime。Docker 最初也是用 lxc 作为 runtime。
runc 是 Docker 自己开发的容器 runtime,符合 oci 规范,也是现在 Docker 的默认 runtime。
rkt 是 CoreOS 开发的容器 runtime,符合 oci 规范,因而能够运行 Docker 的容器。
③容器管理工具
只有 runtime 还不够,用户得有工具来管理容器。容器管理工具对内与 runtime 交互,对外为用户提供 interface,比如 CLI。这就好比除了 JVM,还得提供 java
命令让用户能够启停应用不是。
lxd 是 lxc 对应的管理工具。
runc 的管理工具是 docker engine。docker engine 包含后台 deamon 和 cli 两个部分。我们通常提到 Docker,一般就是指的 docker engine。
rkt 的管理工具是 rkt cli。
④容器定义工具
容器定义工具允许用户定义容器的内容和属性,这样容器就能够被保存,共享和重建。
docker image 是 docker 容器的模板,runtime 依据 docker image 创建容器。
dockerfile 是包含若干命令的文本文件,可以通过这些命令创建出 docker image。
ACI (App Container Image) 与 docker image 类似,只不过它是由 CoreOS 开发的 rkt 容器的 image 格式。
⑤registry 仓库
容器是通过 image 创建的,需要有一个仓库来统一存放 image,这个仓库就叫做 Registry。
企业可以用 Docker Registry 构建私有的 Registry。
Docker Hub(https://hub.docker.com) 是 Docker 为公众提供的托管 Registry,上面有很多现成的 image,为 Docker 用户提供了极大的便利。
Quay.io(https://quay.io/)是另一个公共托管 Registry,提供与 Docker Hub 类似的服务。
⑥容器os
由于有容器 runtime,几乎所有的 Linux、MAC OS 和 Windows 都可以运行容器。但这不并没有妨碍容器 OS 的问世。
容器 OS 是专门运行容器的操作系统。与常规 OS 相比,容器 OS 通常体积更小,启动更快。因为是为容器定制的 OS,通常它们运行容器的效率会更高。
目前已经存在不少容器 OS,CoreOS、atomic 和 ubuntu core 是其中的杰出代表。
(2)容器平台技术
容器核心技术使得容器能够在单个 host 上运行。而容器平台技术能够让容器作为集群在分布式环境中运行。 容器平台技术包括容器编排引擎、容器管理平台和基于容器的 PaaS。
①容器编排引擎
基于容器的应用一般会采用微服务架构。在这种架构下,应用被划分为不同的组件,并以服务的形式运行在各自的容器中,通过 API 对外提供服务。为了保证应用的高可用,每个组件都可能会运行多个相同的容器。这些容器会组成集群,集群中的容器会根据业务需要被动态地创建、迁移和销毁。
大家可以看到,这样一个基于微服务架构的应用系统实际上是一个动态的可伸缩的系统。这对我们的部署环境提出了新的要求,我们需要有一种高效的方法来管理容器集群。而这,就是容器编排引擎要干的工作。
所谓编排(orchestration),通常包括容器管理、调度、集群定义和服务发现等。通过容器编排引擎,容器被有机的组合成微服务应用,实现业务需求。
容器的编排引擎有:
docker swarm 是 Docker 开发的容器编排引擎。
kubernetes 是 Google 领导开发的开源容器编排引擎,同时支持 Docker 和 CoreOS 容器。
mesos 是一个通用的集群资源调度平台,mesos 与 marathon 一起提供容器编排引擎功能。
②容器管理平台
容器管理平台是架构在容器编排引擎之上的一个更为通用的平台。通常容器管理平台能够支持多种编排引擎,抽象了编排引擎的底层实现细节,为用户提供更方便的功能,比如 application catalog 和一键应用部署等。
Rancher 和 ContainerShip 是容器管理平台的典型代表。
③基于容器的 PaaS
基于容器的 PaaS 为微服务应用开发人员和公司提供了开发、部署和管理应用的平台,使用户不必关心底层基础设施而专注于应用的开发。
Deis、Flynn 和 Dokku 都是开源容器 PaaS 的代表。
(3)容器支持技术
容器支持技术有:容器网络,服务发现,监控,数据管理,日志管理,安全性。
①容器网络
容器的出现使网络拓扑变得更加动态和复杂。用户需要专门的解决方案来管理容器与容器,容器与其他实体之间的连通性和隔离性。
docker network 是 Docker 原生的网络解决方案。除此之外,我们还可以采用第三方开源解决方案,例如 flannel、weave 和 calico。不同的方案设计和实现方式不同,各有优势和特定,我们可以根据实际需要来选型。
②服务发现
动态变化是微服务应用的一大特点。当负载增加时,集群会自动创建新的容器;负载减小,多余的容器会被销毁。容器也会根据 host 的资源使用情况在不同 host 中迁移,容器的 IP 和端口也会随之发生变化。 在这种动态的环境下,必须要有一种机制让 client 能够知道如何访问容器提供的服务。这就是服务发现技术要完成的工作。
服务发现会保存容器集群中所有微服务最新的信息,比如 IP 和端口,并对外提供 API,提供服务查询功能。 etcd、consul 和 zookeeper 是服务发现的典型解决方案。
③监控
监控对于基础架构非常重要,而容器的动态特征对监控提出更多挑战。针对容器环境,已经涌现出很多监控工具和方案。
docker ps/top/stats 是 Docker 原生的命令行监控工具。除了命令行,Docker 也提供了 stats API,用户可以通过 HTTP 请求获取容器的状态信息。 sysdig、cAdvisor/Heapster 和 Weave Scope 是其他开源的容器监控方案。
④数据管理
容器经常会在不同的 host 之间迁移,如何保证持久化数据也能够动态迁移,是 Flocker 这类数据管理工具提供的能力。
⑤日志管理
日志为问题排查和事件管理提供了重要的依据。docker logs 是 Docker 原生的日志工具。而 logspout 对日志提供了路由功能,它可以收集不同容器的日志并转发给其他工具进行后处理。
⑥安全性
对于年轻的容器,安全性一直是业界争论的焦点。openSCAP能够对容器镜像进行扫描,发现潜在的漏洞。
(二)容器的环境搭建
(1)环境选择
容器需要管理工具、runtime 和操作系统,我们的选择如下:
- 管理工具 - Docker Engine,因为 Docker 最流行使用最广泛。
- runtime - runc,Docker 的默认 runtime
- 操作系统 - Ubuntu,虽然存在诸如 CoreOS 的容器 OS,因考虑到我们目前处于初学阶段,选择大家熟悉的操作系统更为合适。等具备了扎实的容器基础知识后再使用容器 OS 会更有利。
(2)安装docker
本节我们将在 ubuntu 18.04 虚拟机中安装 Docker。因为安装过程需要访问 internet, 所以虚拟机必须能够上网。Docker 支持几乎所有的 Linux 发行版,也支持 Mac 和 Windows。各操作系统的安装方法可以访问:https://docs.docker.com/engine/installation/。Docker 分为开源免费的 CE(Community Edition)版本和收费的 EE(Enterprise Edition)版本。下面我们将按照文档,通过以下步骤在 Ubuntu 18.04 上安装 Docker CE 版本。
①配置ubuntu的root登录
- 输入命令 sudo passwd root
- 安装 SSH
- 安装SSH客户端,apt-get install openssh-client
- 安装SSH服务端,apt-get install openssh-server
- 启动SSH,/etc/init.d/ssh start
- 查看ssh是否启动成功,ps -e | grep ssh
- 配置/etc/ssh/sshd_config文件
- 配置/etc/ssh/sshd_config ,在文件中添加 permitrootlogin yes 允许root用户登录 。
- /etc/init.d/ssh restart
②配置 Docker 的 apt 源
-
安装包,允许
apt
命令 HTTPS 访问 Docker 源。$ sudo apt-get update $ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
-
添加 Docker 官方的 GPG
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-
检测指纹
sudo apt-key fingerprint 0EBFCD88
-
将 Docker 的源添加到 /etc/apt/sources.list
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
-
安装docker engine
$ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io
③运行第一个容器
# docker run -d -p 80:80 httpd
###浏览器中如何host的ip地址后提示it works!
④镜像下载加速
由于 Docker Hub 的服务器在国外,下载镜像会比较慢。幸好 DaoCloud 为我们提供了免费的国内镜像服务。
下面介绍如果使用镜像服务。
- 在 daocloud.io 免费注册一个用户。
- 登录后,点击顶部菜单“加速器”。
- copy “加速器”命令并在 host 中执行(你的命令可能跟我的会稍有不同)。
- 重启 Docker deamon,即可体验飞一般的感觉。
root@cuiyongchao:~# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
docker version >= 1.12
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
Success.
You need to restart docker to take effect: sudo systemctl restart docker.service
root@cuiyongchao:~# systemctl restart docker.service
root@cuiyongchao:~#