首页 文章 精选 留言 我的

精选列表

搜索[入门],共9380篇文章
优秀的个人博客,低调大师

快应用入门

小程序自2016年推出以来,可以说是一路火爆,更是改写了移动互联网的格局,开辟了另一流量战场。正所谓,“哪里有商机哪里就有竞争”,据报道,中国九大安卓手机厂商华为、小米、OPPO、vivo、中兴、金立、联想、魅族、努比亚联起手来共同对抗微信小程序的迅猛扩张,他们将于3月20日将共同启动「快应用」标准,打造移动应用新生态,目的是遏制急剧扩张的微信小程序。 快应用简介 什么是快应用,快应用具有哪些特点: 1. 快应用是基于手机硬件平台的新型应用形态,标准是由主流手机厂商组成的快应用联盟联合制定。 2. 快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台,以平台化的生态模式对个人开发者和企业开发者全品类开放。 3. 快应用具备传统APP完整的应用体验,无需安装、即点即用。 打开华为市场,搜索“快应用”,可以看到很多的厂商已经上线了快应用。 点击一个运行,其体验丝毫不比原生体验差,下面是录的一个gif动画。 目前,并非所有的平台都上线了快应用,目前还有很多的厂商还在开发中,目前提供快应用的厂商有:小米、华为、金立。魅族、努比亚、OPPO、ViVo,其他平台目前还在开发中。 快应用上手 官网:https://www.quickapp.cn/ 开发文档:https://doc.quickapp.cn/ 既然是快应用,那就是快、方便。快应用使用JavaScript编写,部署即可见。那么如何搭建一个快应用并发布到应用市场呢?本文就这方面给大家做一个整理。 环境搭建 1,安装Node 任何使用JavaScript进行开发的平台都会用到Node,Node可以下载安装,下载的官方地址为:https://nodejs.org/en/download/。 2,安装hap-toolkit 使用npm安装命令安装hap-toolkit: npm install -g hap-toolkit 1 安装完成后,可以通过查看版本来确认是否安装成功。 hap -V 1 3,创建HelloWorld 快应用目前没有很好的开发工具,可以选择前端比较出名的一些开发工具来开发,如WebStrom、IDEA、vscode等。为了演示,本文以命令行的方式来创建一个HelloWorld项目。 创建一个快应用文件夹,选择一个合适文件,使用命令创建项目: hap init <ProjectName> 1 其中,ProjectName为你的项目名称,完成后会显示: prompt: Init your Project: (helloworld) 1 看到这个图不要傻傻等着,点击回车,系统会为你创建一个helloword的快应用。创建完成后,项目的目录结构如图: 然后,切换到helloword目录,执行npm命令行安装依赖包(webpack,babel等): npm install 1 然后,运行如下命令即可在dist目录下生成rpk包。其实,这和vue开发客户端,并使用Hbuilder开发跨平台APP的思路是一致的,有兴趣的童鞋可以了解下。 npm run build 1 注意:如果报错遇到Cannot find module ‘…/webpack.config.js’,请重新执行一次hap update –force。这是由于高版本的npm在npm install时,会校验并删除了node_modules下部分文件夹,导致报错。而hap update –force会重新复制hap-toolkit文件夹到node_modules中。 然后再次执行”npm run build“,即可看到效果。 安装生成的包 下载快应用提供的调试apk文件,并安装到手机上,下载地址:https://statres.quickapp.cn/quickapp/quickapp/201803/file/201803200129552999556.apk 不过对于有些手机你会发现,你安装上之后,什么也干不了,颜色都是灰的。 请注意这很正常,你还需要安装一个平台app 手机安装平台预览版 使用下面地址下载预览版:https://statres.quickapp.cn/quickapp/quickapp/201803/file/201803200130021102030.apk 你安装完成后应该是个白板,啥也没有,正常。你回到之前的安装调试器apk,会发现按钮都可以点击了。然后再次打开即可。 还记得刚才helloworld生成的rpk包么,可以使用以下的命令导入到sd卡中。 adb push xxx.rpk /sdacrd/ 1 push到手机根目录,然后选择本地安装,选择rpk包即可。

优秀的个人博客,低调大师

KM算法入门

KM算法的基本概念: http://baike.baidu.com/view/739278.htm http://baike.baidu.com/view/501092.htm 看这个算法之前,最好先看下匈牙利算法,KM算法 是建立在匈牙利算法基础上实现的 对于这个算法最有误区的地方,个人感觉还是在 X 集合 -d 和 Y 集合 + d之后 还要进行 操作,再加上 深搜递归操作 ,理解容易产生误区,在这里我给出一组模板的测试数据来帮助初学者理解 注意观察: visx[],visy[],lx[],ly[],linky[],在调用中的变化: 3 4 0 0 2 0 1 6 1 1 7 2 1 14 2 2 3 模板:(O ^ 4) #define M 505#define inf 0x3fffffffbool sx[M], sy[M];int match[M], w[M][M], n, m, d, lx[M], ly[M];//n:左集元素个数; m:右集元素个数void init (){ memset (w, 0, sizeof(w)); //不一定要,求最小值一般要初始化为负无穷!}bool dfs (int u){ int v; sx[u] = true; for (v = 0; v < m; v++) { if (!sy[v] && lx[u]+ly[v]==w[u][v]) { sy[v] = true; if (match[v] == -1 || dfs (match[v])) { match[v] = u; return true; } } } return false;}int KM (){ int i, j, k, sum = 0; memset (ly, 0, sizeof(ly)); for (i = 0; i < n; i++) { lx[i] = -inf; for (j = 0; j < m; j++) if (lx[i] < w[i][j]) lx[i] = w[i][j]; } memset (match, -1, sizeof(match)); for (i = 0; i < n; i++) { while (1) { memset (sx, false, sizeof(sx)); memset (sy, false, sizeof(sy)); if (dfs (i)) break; d = inf; for (j = 0; j < n; j++) if (sx[j]) for (k = 0; k < m; k++) if (!sy[k]) d = min (d, lx[j]+ly[k]-w[j][k]); if (d == inf) //找不到完美匹配 return -1; for (j = 0; j < n; j++) if (sx[j]) lx[j] -= d; for (j = 0; j < m; j++) if (sy[j]) ly[j] += d; } } for (i = 0; i < m; i++) if (match[i] > -1) sum += w[match[i]][i]; return sum;} 改进后的模板(O^3) /*其实在求最大 最小的时候只要用一个模板就行了,把边的权值去相反数即可得到另外一个.求结果的时候再去相反数即可*//*最大最小有一些地方不同。。*/#include <iostream>#include<cstring>#include<cstdio>#include<cmath>//赤裸裸的模板啊。。const int maxn = 101;const int INF = (1<<31)-1;int w[maxn][maxn];int lx[maxn],ly[maxn]; //顶标int linky[maxn];int visx[maxn],visy[maxn];int slack[maxn];int nx,ny;bool find(int x){ visx[x] = true; for(int y = 0; y < ny; y++) { if(visy[y]) continue; int t = lx[x] + ly[y] - w[x][y]; if(t==0) { visy[y] = true; if(linky[y]==-1 || find(linky[y])) { linky[y] = x; return true; //找到增广轨 } } else if(slack[y] > t) slack[y] = t; } return false; //没有找到增广轨(说明顶点x没有对应的匹配,与完备匹配(相等子图的完备匹配)不符)}int KM() //返回最优匹配的值{ int i,j; memset(linky,-1,sizeof(linky)); memset(ly,0,sizeof(ly)); for(i = 0; i < nx; i++) for(j = 0,lx[i] = -INF; j < ny; j++) if(w[i][j] > lx[i]) lx[i] = w[i][j]; for(int x = 0; x < nx; x++) { for(i = 0; i < ny; i++) slack[i] = INF; while(true) { memset(visx,0,sizeof(visx)); memset(visy,0,sizeof(visy)); if(find(x)) //找到增广轨,退出 break; int d = INF; for(i = 0; i < ny; i++) //没找到,对l做调整(这会增加相等子图的边),重新找 { if(!visy[i] && d > slack[i]) d = slack[i]; } for(i = 0; i < nx; i++) { if(visx[i]) lx[i] -= d; } for(i = 0; i < ny; i++) { if(visy[i]) ly[i] += d; else slack[i] -= d; } } } int result = 0; for(i = 0; i < ny; i++) if(linky[i]>-1) result += w[linky[i]][i]; return result;}int main(){ // freopen("g:/1.txt","r",stdin); while(true) { scanf("%d%d",&nx,&ny); int a,b,c; while(scanf("%d%d%d",&a,&b,&c),a+b+c) { w[a][b]=c; } printf("%d\n",KM()); break; } return 0;} 题目推荐: 第一题:hdu 2255 奔小康赚大钱 http://acm.hdu.edu.cn/showproblem.php?pid=2255 模板不解释 View Code 第二题:hdu 1533Going Home http://acm.hdu.edu.cn/showproblem.php?pid=1533 用 w[i][j] = -w[i][j]建图再套模板 求最大值 输出【-sum】 View Code 第三题:hdu 1853 Cyclic Tour 注意是有向图,和重边的判断 View Code 第四题:hdu 3488 Tour http://acm.hdu.edu.cn/showproblem.php?pid=3488跟第三题几乎一样 View Code 第五题:hdu 3435 A new Graph Game http://acm.hdu.edu.cn/showproblem.php?pid=3435跟第三题代码基本上一样,只是要双向建图,也有重边 福大 AekdyCoin 出的题,好险的题啊,时间跑了 2000+ ; View Code 第六题: hdu 2426 Interesting Housing Problem http://acm.hdu.edu.cn/showproblem.php?pid=2426 注意 题目输入 |Vi| <= 10000左集是学生,右集是房子,w[i][j] < 0 不可匹配,最后无法完美匹配输出-1 View Code 第七题:hdu 2853 Assignment http://acm.hdu.edu.cn/showproblem.php?pid=2853思路:让原有匹配更有优势就可以了实现:所有权值扩大100倍,原有匹配【例如a匹配b】w[a][b]+ +设结果是res最大值:res/100至少改变个数:n - res%100这种处理比较有意思 View Code 第八题:hdu 3718 http://acm.hdu.edu.cn/showproblem.php?pid=3718题目求的是两字符串的最大相似度思路:因为第一个串的一种字母只能匹配第二个串的一种字母,所以可以转化为求【字母的最大匹配值/n】 注意输入 scanf--%s 不要用 %c%*c View Code 推荐题目链接: http://972169909-qq-com.iteye.com/blog/1184514

优秀的个人博客,低调大师

Docker 容器入门

1.1 容器简介 1.1.1 什么是 Linux 容器 Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。 更加详细地来说,请您假定您在开发一个应用。您使用的是一台笔记本电脑,而且您的开发环境具有特定的配置。其他开发人员身处的环境配置可能稍有不同。您正在开发的应用依赖于您当前的配置,还要依赖于某些特定文件。与此同时,您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。您希望尽可能多在本地模拟这些环境,而不产生重新创建服务器环境的开销。 因此,您要如何确保应用能够在这些环境中运行和通过质量检测,并且在部署过程中不出现令人头疼的问题,也无需重新编写代码和进行故障修复?答案就是使用容器。容器可以确保您的应用拥有必需的配置和文件,使得这些应用能够在从开发到测试、再到生产的整个流程中顺利运行,而不出现任何不良问题。这样可以避免危机,做到皆大欢喜。 虽然这只是简化的示例,但在需要很高的可移植性、可配置性和隔离的情况下,我们可以利用 Linux 容器通过很多方式解决难题。无论基础架构是在企业内部还是在云端,或者混合使用两者,容器都能满足您的需求。 1.1.2 容器不就是虚拟化吗 是,但也不竟然。我们用一种简单方式来思考一下: 虚拟化使得许多操作系统可同时在单个系统上运行。 容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。 图 - 普通虚拟化技术和Docker的对比 这意味着什么?首先,让多个操作系统在单个虚拟机监控程序上运行以实现虚拟化,并不能达成和使用容器同等的轻量级效果。事实上,在仅拥有容量有限的有限资源时,您需要能够可以进行密集部署的轻量级应用。Linux 容器可从单个操作系统运行,在所有容器中共享该操作系统,因此应用和服务能够保持轻量级,并行快速运行。 1.1.3 容器发展简史 我们现在称为容器技术的概念最初出现在 2000 年,当时称为 FreeBSD jail,这种技术可将 FreeBSD 系统分区为多个子系统(也称为 Jail)。Jail 是作为安全环境而开发的,系统管理员可与企业内部或外部的多个用户共享这些 Jail。 Jail 的目的是让进程在经过修改的 chroot 环境中创建,而不会脱离和影响整个系统 — 在 chroot 环境中,对文件系统、网络和用户的访问都实现了虚拟化。尽管 Jail 在实施方面存在局限性,但最终人们找到了脱离这种隔离环境的方法。 但这个概念非常有吸引力。 2001 年,通过 Jacques Gélinas 的 VServer 项目,隔离环境的实施进入了 Linux 领域。正如 Gélinas 所说,这项工作的目的是“在高度独立且安全的单一环境中运行多个通用 Linux 服务器 [sic]。” 在完成了这项针对 Linux 中多个受控制用户空间的基础性工作后,Linux 容器开始逐渐成形并最终发展成了现在的模样。 1.2 什么是 Docker? “Docker” 一词指代多种事物,包括开源社区项目、开源项目使用的工具、主导支持此类项目的公司 Docker Inc. 以及该公司官方支持的工具。技术产品和公司使用同一名称,的确让人有点困惑。 我们来简单说明一下: IT软件中所说的“Docker”,是指容器化技术,用于支持创建和使用Linux容器。 开源Docker社区致力于改进这类技术,并免费提供给所有用户,使之获益。 Docker Inc.公司凭借Docker社区产品起家,它主要负责提升社区版本的安全性,并将改进后的版本与更广泛的技术社区分享。此外,它还专门对这些技术产品进行完善和安全固化,以服务于企业客户。 借助 Docker ,您可将容器当做重量轻、模块化的虚拟机使用。同时,您还将获得高度的灵活性,从而实现对容器的高效创建、部署及复制,并能将其从一个环境顺利迁移至另一个环境。 1.2.1 Docker 如何工作? Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用程序,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。 容器工具(包括 Docker)可提供基于镜像的部署模式。这使得它能够轻松跨多种环境,与其依赖程序共享应用或服务组。Docker 还可在这一容器环境中自动部署应用程序(或者合并多种流程,以构建单个应用程序)。 此外,由于这些工具基于 Linux 容器构建,使得 Docker 既易于使用,又别具一格 —— 它可为用户提供前所未有的高度应用程访问权限、快速部署以及版本控制和分发能力。 1.2.2 Docker 技术是否与传统的 Linux 容器相同? 否。Docker 技术最初是基于 LXC 技术构建(大多数人都会将这一技术与“传统的” Linux 容器联系在一起),但后来它逐渐摆脱了对这种技术的依赖。 就轻量级 虚拟化 这一功能来看,LXC 非常有用,但它无法提供出色的开发人员或用户体验。除了运行容器之外,Docker 技术还具备其他多项功能,包括简化用于构建容器、传输镜像以及控制镜像版本的流程。 传统的 Linux 容器使用 init 系统来管理多种进程。这意味着,所有应用程序都作为一个整体运行。与此相反,Docker 技术鼓励应用程序各自独立运行其进程,并提供相应工具以实现这一功能。这种精细化运作模式自有其优势。 1.2.3 docker的目标 docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行 构建:做一个docker镜像 运输:docker pull 运行:启动一个容器 每一个容器,他都有自己的文件系统rootfs. 1.3 安装Docker 环境说明 # 需要两台几点进行安装 [root@docker01 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@docker01 ~]# uname -r 3.10.0-327.el7.x86_64 [root@docker01 ~]# hostname -I 10.0.0.100 172.16.1.100 [root@docker02 ~]# hostname -I 10.0.0.101 172.16.1.101 在两个节点上都进行操作 wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo yum install docker-ce -y 修改在docker01配置: # 修改启动文件,监听远程端口 vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://10.0.0.100:2375 systemctl daemon-reload systemctl enable docker.service systemctl restart docker.service # ps -ef检查进行,是否启动 在docker02测试 [root@docker02 ~]# docker -H 10.0.0.100 info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 17.12.0-ce Storage Driver: devicemapper ··· 1.3.1 Docker基础命令操作 查看docker相关信息 [root@docker01 ~]# docker version Client: Version: 17.12.0-ce API version: 1.35 Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:10:14 2017 OS/Arch: linux/amd64 Server: Engine: Version: 17.12.0-ce API version: 1.35 (minimum version 1.12) Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:12:46 2017 OS/Arch: linux/amd64 Experimental: false 配置docker镜像加速 vi /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] } 1.3.2 启动第一个容器 [root@docker01 ~]# docker run -d -p 80:80 nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx e7bb522d92ff: Pull complete 6edc05228666: Pull complete cd866a17e81f: Pull complete Digest: sha256:285b49d42c703fdf257d1e2422765c4ba9d3e37768d6ea83d7fe2043dad6e63d Status: Downloaded newer image for nginx:latest 8d8f81da12b5c10af6ba1a5d07f4abc041cb95b01f3d632c3d638922800b0b4d # 容器启动后,在浏览器进行访问测试 参数说明 参数 说明 run 创建并运行一个容器 -d 放入后台 -p 端口映射 nginx 镜像名称 1.3.3 Docker镜像生命周期 1.4 docker镜像相关操作 1.4.1 搜索官方仓库镜像 [root@docker01 ~]# docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 3992 [OK] ansible/centos7-ansible Ansible on Centos7 105 [OK] 列表说明 参数 说明 NAME 镜像名称 DESCRIPTION 镜像说明 STARS 点赞数量 OFFICIAL 是否是官方的 AUTOMATED 是否是自动构建的 1.4.2 获取镜像 根据镜像名称拉取镜像 [root@docker01 ~]# docker pull centos Using default tag: latest latest: Pulling from library/centos af4b0a2388c6: Downloading 34.65MB/73.67MB 查看当前主机镜像列表 [root@docker01 ~]# docker image list REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB nginx latest 3f8a4339aadd 5 weeks ago 108MB 拉第三方镜像方法 docker pull index.tenxcloud.com/tenxcloud/httpd 1.4.3 导出镜像 [root@docker01 ~]# docker image list REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB nginx latest 3f8a4339aadd 5 weeks ago 108MB # 导出 [root@docker01 ~]# docker image save centos > docker-centos.tar.gz 1.4.4 删除镜像 [root@docker01 ~]# docker image rm centos:latest [root@docker01 ~]# docker image list REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 3f8a4339aadd 5 weeks ago 108MB 1.4.5 导入镜像 [root@docker01 ~]# docker image load -i docker-centos.tar.gz e15afa4858b6: Loading layer 215.8MB/215.8MB Loaded image: centos:latest [root@docker01 ~]# docker image list REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB nginx latest 3f8a4339aadd 5 weeks ago 108MB 1.4.6 查看镜像的详细信息 [root@docker01 ~]# docker image inspect centos 1.5 容器的日常管理 1.5.1 容器的起/停 最简单的运行一个容器 [root@docker01 ~]# docker run nginx 创建容器,两步走(不常用) [root@docker01 ~]# docker create centos:latest /bin/bash bb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204 [root@docker01 ~]# docker start stupefied_nobel stupefied_nobel 快速启动容器方法 [root@docker01 ~]# docker run centos:latest /usr/bin/sleep 20; 容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态! 查看正在运行的容器 [root@docker01 ~]# docker container ls 或 [root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8708e93fd767 nginx "nginx -g 'daemon of…" 6 seconds ago Up 4 seconds 80/tcp keen_lewin 查看你容器详细信息/ip [root@docker01 ~]# docker container inspect 容器名称/id 查看你所有容器(包括未运行的) [root@docker01 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8708e93fd767 nginx "nginx -g 'daemon of…" 4 minutes ago Exited (0) 59 seconds ago keen_lewin f9f3e6af7508 nginx "nginx -g 'daemon of…" 5 minutes ago Exited (0) 5 minutes ago optimistic_haibt 8d8f81da12b5 nginx "nginx -g 'daemon of…" 3 hours ago Exited (0) 3 hours ago lucid_bohr 停止容器 [root@docker01 ~]# docker stop 容器名称/id 或 [root@docker01 ~]# docker container kill 容器名称/id 1.5.2 进入容器方法 启动时进去方法 [root@docker01 ~]# docker run -it #参数:-it 可交互终端 [root@docker01 ~]# docker run -it nginx:latest /bin/bash root@79241093859e:/# 退出/离开容器 ctrl+p & ctrl+q 启动后进入容器的方法 启动一个docker [root@docker01 ~]# docker run -it centos:latest [root@1bf0f43c4d2f /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 15:47 pts/0 00:00:00 /bin/bash root 13 1 0 15:47 pts/0 00:00:00 ps -ef attach进入容器,使用pts/0 ,会让所用通过此方法进如放入用户看到同样的操作。 [root@docker01 ~]# docker attach 1bf0f43c4d2f [root@1bf0f43c4d2f /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 15:47 pts/0 00:00:00 /bin/bash root 14 1 0 15:49 pts/0 00:00:00 ps -ef 自命名启动一个容器 --name [root@docker01 ~]# docker attach 1bf0f43c4d2f [root@1bf0f43c4d2f /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 15:47 pts/0 00:00:00 /bin/bash root 14 1 0 15:49 pts/0 00:00:00 ps -ef exrc 进入容器方法(推荐使用) [root@docker01 ~]# docker exec -it clsn1 /bin/bash [root@b20fa75b4b40 /]# 重新分配一个终端 [root@b20fa75b4b40 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 16:11 pts/0 00:00:00 /bin/bash root 13 0 0 16:14 pts/1 00:00:00 /bin/bash root 26 13 0 16:14 pts/1 00:00:00 ps -ef 1.5.3 删除所有容器 [root@docker01 ~]# docker rm -f `docker ps -a -q` # -f 强制删除 1.5.4 启动时进行端口映射 -p参数端口映射 [root@docker01 ~]# docker run -d -p 8888:80 nginx:latest 287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9 不同指定映射方法 参数 说明 -p hostPort:containerPort 端口映射 -p 8080:80 -p ip:hostPort:containerPort 配置监听地址 -p 10.0.0.100:8080:80 -p ip::containerPort 随机分配端口 -p 10.0.0.100::80 -p hostPort:containerPort:udp 指定协议 -p 8080:80:tcp -p 81:80 –p 443:443 指定多个 随机映射 docker run -P (大P)# 需要镜像支持 1.6 Docker 数据卷的管理 1.6.1 挂载时创建卷 挂载卷 [root@docker01 ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest 079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09 容器内站点目录: /usr/share/nginx/html 在宿主机写入数据,查看 [root@docker01 ~]# echo "http://www.nmtui.com" >/data/index.html [root@docker01 ~]# curl 10.0.0.100 http://www.nmtui.com 设置共享卷,使用同一个卷启动一个新的容器 [root@docker01 ~]# docker run -d -p 8080:80 -v /data:/usr/share/nginx/html nginx:latest 351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42 [root@docker01 ~]# curl 10.0.0.100:8080 http://www.nmtui.com 查看卷列表 [root@docker01 ~]# docker volume ls DRIVER VOLUME NAME 1.6.2 创建卷后挂载 创建一个卷 [root@docker01 ~]# docker volume create f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521 [root@docker01 ~]# docker volume ls DRIVER VOLUME NAME local f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521 指定卷名 [root@docker01 ~]# docker volume ls DRIVER VOLUME NAME local clsn local f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521 查看卷路径 [root@docker01 ~]# docker volume inspect clsn [ { "CreatedAt": "2018-02-01T00:39:25+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/clsn/_data", "Name": "clsn", "Options": {}, "Scope": "local" } ] 使用卷创建 [root@docker01 ~]# docker run -d -p 9000:80 -v clsn:/usr/share/nginx/html nginx:latest 1434559cff996162da7ce71820ed8f5937fb7c02113bbc84e965845c219d3503 # 宿主机测试 [root@docker01 ~]# echo 'blog.nmtui.com' >/var/lib/docker/volumes/clsn/_data/index.html [root@docker01 ~]# curl 10.0.0.100:9000 blog.nmtui.com 设置卷 [root@docker01 ~]# docker run -d -P --volumes-from 079786c1e297 nginx:latest b54b9c9930b417ab3257c6e4a8280b54fae57043c0b76b9dc60b4788e92369fb 查看使用的端口 [root@docker01 ~]# netstat -lntup Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1400/sshd tcp 0 0 10.0.0.100:2375 0.0.0.0:* LISTEN 26218/dockerd tcp6 0 0 :::9000 :::* LISTEN 32015/docker-proxy tcp6 0 0 :::8080 :::* LISTEN 31853/docker-proxy tcp6 0 0 :::80 :::* LISTEN 31752/docker-proxy tcp6 0 0 :::22 :::* LISTEN 1400/sshd tcp6 0 0 :::32769 :::* LISTEN 32300/docker-proxy [root@docker01 ~]# curl 10.0.0.100:32769 http://www.nmtui.com 1.6.3 手动将容器保存为镜像 本次是基于docker官方centos 6.8 镜像创建 官方镜像列表:https://hub.docker.com/explore/ 启动一个centos6.8的镜像 [root@docker01 ~]# docker pull centos:6.8 [root@docker01 ~]# docker run -it -p 1022:22 centos:6.8 /bin/bash # 在容器种安装sshd服务,并修改系统密码 [root@582051b2b92b ~]# yum install openssh-server -y [root@582051b2b92b ~]# echo "root:123456" |chpasswd [root@582051b2b92b ~]# /etc/init.d/sshd start 启动完成后镜像ssh连接测试 将容器提交为镜像 [root@docker01 ~]# docker commit brave_mcclintock centos6-ssh 使用新的镜像启动容器 [root@docker01 ~]# docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D 5b8161fda2a9f2c39c196c67e2eb9274977e7723fe51c4f08a0190217ae93094 在容器安装httpd服务 [root@5b8161fda2a9 /]# yum install httpd -y 编写启动脚本脚本 [root@5b8161fda2a9 /]# cat init.sh #!/bin/bash /etc/init.d/httpd start /usr/sbin/sshd -D [root@5b8161fda2a9 /]# chmod +x init.sh # 注意执行权限 再次提交为新的镜像 [root@docker01 ~]# docker commit 5b8161fda2a9 centos6-httpd sha256:705d67a786cac040800b8485cf046fd57b1828b805c515377fc3e9cea3a481c1 启动镜像,做好端口映射。并在浏览器中测试访问 [root@docker01 ~]# docker run -d -p 1222:22 -p 80:80 centos6-httpd /init.sh 46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c 1.7 Dockerfile自动构建docker镜像 官方构建dockerffile文件参考 https://github.com/CentOS/CentOS-Dockerfiles 1.7.1 Dockerfile指令集 dockerfile主要组成部分: 基础镜像信息FROM centos:6.8 制作镜像操作指令RUN yum insatll openssh-server -y 容器启动时执行指令CMD ["/bin/bash"] dockerfile常用指令: FROM这个镜像的妈妈是谁?(指定基础镜像) MAINTAINER告诉别人,谁负责养它?(指定维护者信息,可以没有) RUN你想让它干啥(在命令前面加上RUN即可) ADD给它点创业资金(COPY文件,会自动解压) WORKDIR我是cd,今天刚化了妆(设置当前工作目录) VOLUME给它一个存放行李的地方(设置卷,挂载主机目录) EXPOSE它要打开的门是啥(指定对外的端口) CMD奔跑吧,兄弟!(指定容器启动后的要干的事情) dockerfile其他指令: COPY复制文件 ENV环境变量 ENTRYPOINT容器启动后执行的命令 1.7.2 创建一个Dockerfile 创建第一个Dockerfile文件 # 创建目录 [root@docker01 base]# cd /opt/base # 创建Dcokerfile文件,注意大小写 [root@docker01 base]# vim Dockerfile FROM centos:6.8 RUN yum install openssh-server -y RUN echo "root:123456" |chpasswd RUN /etc/init.d/sshd start CMD ["/usr/sbin/sshd","-D"] 构建docker镜像 [root@docker01 base]# docker image build -t centos6.8-ssh . -t 为镜像标签打标签 . 表示当前路径 使用自构建的镜像启动 [root@docker01 base]# docker run -d -p 2022:22 centos6.8-ssh-b dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a 1.7.3 使用Dcokerfile安装kodexplorer Dockerfile文件内容 FROM centos:6.8 RUN yum install wget unzip php php-gd php-mbstring -y && yum clean all # 设置工作目录,之后的操作都在这个目录中 WORKDIR /var/www/html/ RUN wget -c http://static.kodcloud.com/update/download/kodexplorer4.25.zip RUN unzip kodexplorer4.25.zip && rm -f kodexplorer4.25.zip RUN chown -R apache.apache . CMD ["/usr/sbin/apachectl","-D","FOREGROUND"] 更多的Dockerfile可以参考官方方法。 1.8 Docker中的镜像分层 参考文档:http://www.maiziedu.com/wiki/cloud/dockerimage/ Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。 从上图可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。 1.8.1 Docker 镜像为什么分层 镜像分层最大的一个好处就是共享资源。 比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。 如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。 1.8.2 可写的容器层 当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。 所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。 1.8.3 容器层的细节说明 镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。 文件操作的 文件操作 说明 添加文件 在容器中创建文件时,新文件被添加到容器层中。 读取文件 在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后打开并读入内存。 修改文件 在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。 删除文件 在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。(只是记录删除操作) 只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。 这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。 1.9 使用docker运行zabbix-server 1.9.1 容器间的互联 在运行zabbix之前务必要了解容器间互联的方法 # 创建一个nginx容器 docker run -d -p 80:80 nginx # 创建容器,做link,并进入容器中 docker run -it --link quirky_brown:web01 centos-ssh /bin/bash # 在容器中访问nginx容器可以ping通 ping web01 命令执行过程 # 启动apache容器 [root@docker01 ~]# docker run -d httpd:2.4 3f1f7fc554720424327286bd2b04aeab1b084a3fb011a785b0deab6a34e56955 ^[[A[root@docker01 docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f1f7fc55472 httpd:2.4 "httpd-foreground" 6 seconds ago Up 5 seconds 80/tcp determined_clarke # 拉取一个busybox 镜像 [root@docker01 ~]# docker pull busybox # 启动容器 [root@docker01 ~]# docker run -it --link determined_clarke:web busybox:latest /bin/sh / # # 使用新的容器访问最初的web容器 / # ping web PING web (172.17.0.2): 56 data bytes 64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.058 ms ^C --- web ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.058/0.058/0.058 ms 1.9.2 启动zabbix容器 1、启动一个mysql的容器 docker run --name mysql-server -t \ -e MYSQL_DATABASE="zabbix" \ -e MYSQL_USER="zabbix" \ -e MYSQL_PASSWORD="zabbix_pwd" \ -e MYSQL_ROOT_PASSWORD="root_pwd" \ -d mysql:5.7 \ --character-set-server=utf8 --collation-server=utf8_bin 2、启动java-gateway容器监控java服务 docker run --name zabbix-java-gateway -t \ -d zabbix/zabbix-java-gateway:latest 3、启动zabbix-mysql容器使用link连接mysql与java-gateway。 docker run --name zabbix-server-mysql -t \ -e DB_SERVER_HOST="mysql-server" \ -e MYSQL_DATABASE="zabbix" \ -e MYSQL_USER="zabbix" \ -e MYSQL_PASSWORD="zabbix_pwd" \ -e MYSQL_ROOT_PASSWORD="root_pwd" \ -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \ --link mysql-server:mysql \ --link zabbix-java-gateway:zabbix-java-gateway \ -p 10051:10051 \ -d zabbix/zabbix-server-mysql:latest 4、启动zabbix web显示,使用link连接zabbix-mysql与mysql。 docker run --name zabbix-web-nginx-mysql -t \ -e DB_SERVER_HOST="mysql-server" \ -e MYSQL_DATABASE="zabbix" \ -e MYSQL_USER="zabbix" \ -e MYSQL_PASSWORD="zabbix_pwd" \ -e MYSQL_ROOT_PASSWORD="root_pwd" \ --link mysql-server:mysql \ --link zabbix-server-mysql:zabbix-server \ -p 80:80 \ -d zabbix/zabbix-web-nginx-mysql:latest 1.9.3 关于zabbix API 关于zabbix API可以参考官方文档:https://www.zabbix.com/documentation/3.4/zh/manual/api 1、获取token方法 # 获取token [root@docker02 ~]# curl -s -X POST -H 'Content-Type:application/json' -d ' { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1 }' http://10.0.0.100/api_jsonrpc.php {"jsonrpc":"2.0","result":"d3be707f9e866ec5d0d1c242292cbebd","id":1} 1.10 docker 仓库(registry) 1.10.1 创建一个普通仓库 1、创建仓库 docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry 2、修改配置文件,使之支持http [root@docker01 ~]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"], "insecure-registries": ["10.0.0.100:5000"] } 重启docker让修改生效 [root@docker01 ~]# systemctl restart docker.service 3、修改镜像标签 [root@docker01 ~]# docker tag busybox:latest 10.0.0.100:5000/clsn/busybox:1.0 [root@docker01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos6-ssh latest 3c2b1e57a0f5 18 hours ago 393MB httpd 2.4 2e202f453940 6 days ago 179MB 10.0.0.100:5000/clsn/busybox 1.0 5b0d59026729 8 days ago 1.15MB 4、将新打标签的镜像上传镜像到仓库 [root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox 1.10.2 带basic认证的仓库 1、安装加密工具 [root@docker01 clsn]# yum install httpd-tools -y 2、设置认证密码 mkdir /opt/registry-var/auth/ -p htpasswd -Bbn clsn 123456 > /opt/registry-var/auth/htpasswd 3、启动容器,在启动时传入认证参数 docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry 4、使用验证用户测试 # 登陆用户 [root@docker01 ~]# docker login 10.0.0.100:5000 Username: clsn Password: 123456 Login Succeeded # 推送镜像到仓库 [root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox The push refers to repository [10.0.0.100:5000/clsn/busybox] 4febd3792a1f: Pushed 1.0: digest: sha256:4cee1979ba0bf7db9fc5d28fb7b798ca69ae95a47c5fecf46327720df4ff352d size: 527 #认证文件的保存位置 [root@docker01 ~]# cat .docker/config.json { "auths": { "10.0.0.100:5000": { "auth": "Y2xzbjoxMjM0NTY=" }, "https://index.docker.io/v1/": { "auth": "Y2xzbjpIenNAMTk5Ng==" } }, "HttpHeaders": { "User-Agent": "Docker-Client/17.12.0-ce (linux)" } } 至此,一个简单的docker镜像仓库搭建完成 1.11 docker-compose编排工具 1.11.1 安装docker-compose 安装docker-compose # 下载pip软件 yum install -y python2-pip # 下载 docker-compose pip install docker-compose 国内开启pip 下载加速:http://mirrors.aliyun.com/help/pypi mkdir ~/.pip/ cat > ~/.pip/pip.conf <<'EOF' [global] index-url = https://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com EOF 1.11.2 编排启动镜像 1、创建文件目录 [root@docker01 ~]# mkdir /opt/my_wordpress/ [root@docker01 ~]# cd /opt/my_wordpress/ 2、编写编排文件 [root@docker01 my_wordpress]# vim docker-compose.yml version: '3' services: db: image: mysql:5.7 volumes: - /data/db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest volumes: - /data/web_data:/var/www/html ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress 3、启动 [root@docker01 my_wordpress]# docker-compose up #启动方法:docker-compose up #后台启动方法:docker-compose up -d 4、浏览器上访问http://10.0.0.100:8000 进行wordpress的安装即可 1.11.3 haproxy代理后端docker容器 1、修改编排脚本 [root@docker01 my_wordpress]# cat docker-compose.yml version: '3' services: db: image: mysql:5.7 volumes: - /data/db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest volumes: - /data/web_data:/var/www/html ports: - "80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress 2、同时启动两台wordpress [root@docker01 my_wordpress]# docker-compose scale wordpress=2 WARNING: The scale command is deprecated. Use the up command with the --scale flag instead. Starting mywordpress_wordpress_1 ... done Creating mywordpress_wordpress_2 ... done 3、安装haproxy [root@docker01 ~]# yum install haproxy -y 4、修改haproxy配置文件 关于配置文件的详细说明,参考:https://www.cnblogs.com/MacoLee/p/5853413.html [root@docker01 ~]#cp /etc/haproxy/haproxy.cfg{,.bak} [root@docker01 ~]# vim /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats level admin #支持命令行控制 defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen stats mode http bind 0.0.0.0:8888 stats enable stats uri /haproxy-status stats auth admin:123456 frontend frontend_www_example_com bind 10.0.0.100:8000 mode http option httplog log global default_backend backend_www_example_com backend backend_www_example_com option forwardfor header X-REAL-IP option httpchk HEAD / HTTP/1.0 balance roundrobin server web-node1 10.0.0.100:32768 check inter 2000 rise 30 fall 15 server web-node2 10.0.0.100:32769 check inter 2000 rise 30 fall 15 5、启动haproxy systemctl start haproxy systemctl enable haproxy 6、使用浏览器访问hapeoxy监听的8000端口可以看到负载的情况 7、使用浏览器访问 http://10.0.0.100:8888/haproxy-status 可以看到后端节点的监控状况, 1.11.4 安装socat 直接操作socket控制haproxy 1、安装软件 yum install socat.x86_64 -y 2、查看帮助 [root@docker01 web_data]# echo "help"|socat stdio /var/lib/haproxy/stats 3、下线后端节点 echo "disable server backend_www_example_com/web-node2"|socat stdio /var/lib/haproxy/stats 4、上线后端节点 echo "enable server backend_www_example_com/web-node3"|socat stdio /var/lib/haproxy/stats 5、编写php测试页,放到/data/web_data下,在浏览器中访问可以查看当前的节点 [root@docker01 web_data]# vim check.php <html> <head> <title>PHP测试</title> </head> <body> <?php echo '<p>Hello World </p>'; ?> <?php echo "访问的服务器地址是:"."<fontcolor=red>".$_SERVER['SERVER_ADDR']."</font>"."<br>"; echo"访问的服务器域名是:"."<fontcolor=red>".$_SERVER['SERVER_NAME']."</font>"."<br>"; ?> </body> </html> 1.12 重启docker服务,容器全部退出的解决办法 1.12.1 在启动是指定自动重启 docker run --restart=always 1.12.2 修改docker默认配置文件 # 添加上下面这行 "live-restore": true docker server配置文件/etc/docker/daemon.json参考 [root@docker02 ~]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"], "graph": "/opt/mydocker", # 修改数据的存放目录到/opt/mydocker/,原/var/lib/docker/ "insecure-registries": ["10.0.0.100:5000"], "live-restore": true } 重启生效,只对在此之后启动的容器生效 [root@docker01 ~]# systemctl restart docker.service 1.13 Docker网络类型 1.13.1 docker的网络类型 类型 说明 None 不为容器配置任何网络功能,没有网络 --net=none Container 与另一个运行中的容器共享Network Namespace,--net=container:containerID Host 与主机共享Network Namespace,--net=host Bridge Docker设计的NAT网络模型(默认类型) Bridge默认docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。 1.13.2 不为容器配置网络功能 此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。 [root@docker01 ~]# docker run -it --network none busybox:latest /bin/sh / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 1.13.3 与其他容器共享网络配置(Container) 此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。 [root@docker01 ~]# docker run -it --network container:mywordpress_db_1 busybox:latest /bin/sh / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 105: eth0@if106: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0 valid_lft forever preferred_lft forever 1.13.4 使用宿主机网络 此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。 [root@docker01 ~]# docker run -it --network host busybox:latest /bin/sh 1.13.5 查看网络列表 [root@docker01 ~]# docker network list NETWORK ID NAME DRIVER SCOPE b15e8a720d3b bridge bridge local 345d65b4c2a0 host host local bc5e2a32bb55 mywordpress_default bridge local ebf76eea91bb none null local 1.13.6 用PIPEWORK为docker容器配置独立IP 参考文档:http://blog.csdn.net/design321/article/details/48264825 官方网站:https://github.com/jpetazzo/pipework 宿主环境:centos7.2 1、安装pipework wget https://github.com/jpetazzo/pipework/archive/master.zip unzip master.zip cp pipework-master/pipework /usr/local/bin/ chmod +x /usr/local/bin/pipework 2、配置桥接网卡 安装桥接工具 yum install bridge-utils.x86_64 -y 修改网卡配置,实现桥接 # 修改eth0配置,让br0实现桥接 [root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet BOOTPROTO=static NAME=eth0 DEVICE=eth0 ONBOOT=yes BRIDGE=br0 [root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 TYPE=Bridge BOOTPROTO=static NAME=br0 DEVICE=br0 ONBOOT=yes IPADDR=10.0.0.100 NETMASK=255.255.255.0 GATEWAY=10.0.0.254 DNS1=223.5.5.5 # 重启网络 [root@docker01 ~]# /etc/init.d/network restart 3、运行一个容器镜像测试: pipework br0 $(docker run -d -it -p 6880:80 --name httpd_pw httpd) 10.0.0.220/24@10.0.0.254 在其他主机上测试端口及连通性 [root@docker01 ~]# curl 10.0.0.220 <html><body><h1>It works!</h1></body></html> [root@docker01 ~]# ping 10.0.0.220 -c 1 PING 10.0.0.220 (10.0.0.220) 56(84) bytes of data. 64 bytes from 10.0.0.220: icmp_seq=1 ttl=64 time=0.043 ms 4、再运行一个容器,设置网路类型为none: pipework br0 $(docker run -d -it --net=none --name test httpd:2.4) 10.0.0.221/24@10.0.0.254 进行访问测试 [root@docker01 ~]# curl 10.0.0.221 <html><body><h1>It works!</h1></body></html> 5、重启容器后需要再次指定: pipework br0 testduliip 172.16.146.113/24@172.16.146.1 pipework br0 testduliip01 172.16.146.112/24@172.16.146.1 Dcoker跨主机通信之overlay可以参考: http://www.cnblogs.com/CloudMan6/p/7270551.html 1.13.7 Docker跨主机通信之macvlan 创建网络 [root@docker01 ~]# docker network create --driver macvlan --subnet 10.1.0.0/24 --gateway 10.1.0.254 -o parent=eth0 macvlan_1 33a1f41dcc074f91b5bd45e7dfedabfb2b8ec82db16542f05213839a119b62ca 设置网卡为混杂模式 ip link set eth0 promisc on 创建使用macvlan网络容器 [root@docker02 ~]# docker run -it --network macvlan_1 --ip=10.1.0.222 busybox /bin/sh 1.14 docker企业级镜像仓库harbor 容器管理 [root@docker01 harbor]# pwd /opt/harbor [root@docker01 harbor]# docker-compose stop 1、安装docker、docker-compose 下载 harbor cd /opt && https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgz tar xf harbor-offline-installer-v1.3.0.tgz 2、修改主机及web界面密码 [root@docker01 harbor]# vim harbor.cfg ··· hostname = 10.0.0.100 harbor_admin_password = Harbor12345 ··· 3、执行安装脚本 [root@docker01 harbor]# ./install.sh 浏览器访问 http://10.0.0.11 添加一个项目 4、镜像推送到仓库的指定项目 [root@docker02 ~]# docker tag centos:6.8 10.0.0.100/clsn/centos6.8:1.0 [root@docker02 ~]# [root@docker02 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 5b0d59026729 8 days ago 1.15MB 10.0.0.100/clsn/centos6.8 1.0 6704d778b3ba 2 months ago 195MB centos 6.8 6704d778b3ba 2 months ago 195MB [root@docker02 ~]# docker login 10.0.0.100 Username: admin Password: Login Succeeded 5、推送镜像 [root@docker02 ~]# docker push 10.0.0.100/clsn/centos6.8 The push refers to repository [10.0.0.100/clsn/centos6.8] e00c9229b481: Pushing 13.53MB/194.5MB 6、在web界面里查看 1.14.1 使用容器的建议 1.不要以拆分方式进行应用程序发布 2.不要创建大型镜像 3.不要在单个容器中运行多个进程 4.不要再镜像内保存凭证,不要依赖IP地址 5.以非root用户运行进程 6.不要使用“最新”标签 7.不要利用运行中的容器创建镜像 8.不要使用单层镜像 9.不要将数据存放在容器内 1.14.2 关于Docker容器的监控 容器的基本信息 包括容器的数量、ID、名称、镜像、启动命令、端口等信息 容器的运行状态 统计各状态的容器的数量,包括运行中、暂停、停止及异常退出 容器的用量信息 统计容器的CPU使用率、内存使用量、块设备I/O使用量、网络使用情况等资源的使用情况 1.15 参考文献 [1]https://www.redhat.com/zh/topics/containers/whats-a-linux-container [2]https://www.redhat.com/zh/topics/containers/what-is-docker [3]http://blog.51cto.com/dihaifeng/1713512 [4]https://www.cnblogs.com/Bourbon-tian/p/6867796.html [5]https://www.cnblogs.com/CloudMan6/p/6806193.html 作者: 惨绿少年 出处: https://www.nmtui.com 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

优秀的个人博客,低调大师

AMFPHP快速入门

AMFPHP是PHP的远程调用(RPC, Remote Procedure Call)工具。它可以使PHP与下述技术无缝通信: (1) Flash 和 Flex Remoting (2) JavaScript JSON 和 Ajax JSON (3) XML 和XML-RPC 什么是RPC 远端程序调用(RPC, Remote Procedure Call) 是一种客户端与服务器端交换数据方式。我们可以调用本地对象带对各种参数方法设置回调并接受调用结果。我们不用关心发送和接收数据的实现细节。实现细节通常是抽象的,就像我们在调用本地方法一样。 AMFPHP的工作原理 客户端(Flash / Flex)与服务器端(PHP) 使用相同的方式描述方法调用和复杂数据。客户端序列化请求并将它发送到网关AMFPHP。AMFPHP再执行: (1) 反序列化请求 (2) 找到相应的远程服务类 (3) 实例化类 (4) 执行安全检查 (5)(使用指定参数)调用服务器端方法 (6) 序列化返回的数据 AMFPHP可以正确地序列化、反序列化复杂类型数据。除了对象和数组,它还支持 resources 数据连接资源,这就意味着我们可以通过调用远程方法简单返回mysql_query,amfphp 会处理这一切。如果平台支持 (目前来说,Flash Remoting 和Flex Remoting),AMFPHP还可以处理循环引用和自定义数据它也支持简单的远程调试。还有AMFPHP附带一个浏览器,它可以在创建客户端代码前测试远程服务。AMFPHP 1.0.1还添加了模板,可以自动生成客户端代码。AMFPHP 1.9 beta更是新增了对AMF3的支持。 简单示例 下面我们通过一个简单的登录示例来对AMFPHP有一个初步的认识,将分别从客户端和服务器端两个部分进行介绍。 一,Flex客户端: 复制代码 代码 import mx.controls.Alert; import mx.rpc.remoting.mxml.RemoteObject; import mx.rpc.events.*; public var login_remoteObj:RemoteObject = null; public function initLoginRemoteObject():void {//初始化RemoteObject this.login_remoteObj = new RemoteObject(); this.login_remoteObj.source = "Login"; this.login_remoteObj.destination = "amfphp"; this.login_remoteObj.showBusyCursor = true; this.login_remoteObj.endpoint = "http://localhost/MyTest/amfphp/gateway.php"; this.login_remoteObj.doLogin.addEventListener("result", loginHandler); this.login_remoteObj.doLogin.addEventListener("fault", faultHandler); } public function doLogin():void {//登陆操作,向服务器提交数据 var name:String = this.txtName.text; var pwd:String = this.txtPassword.text; var data:Array = new Array(); data.push(name); data.push(pwd); this.login_remoteObj.getOperation("doLogin").send(data); } public function loginHandler(event: ResultEvent):void {//处理服务器返回的结果 var result:Array = event.result as Array; var flag:String = result[0]; if (flag == "0") { Alert.show("登陆失败: " + result[1]); } else if (flag == "1") { Alert.show("登陆成功: " + result[1]); } else if (flag == "-1") { Alert.show("异常: " + result[1]); } } public function faultHandler(event: FaultEvent):void {//出错处理 Alert.show("sorry,出错了!!!"); } } 复制代码 二,PHP服务器端 1,将amfphp文件夹置于MyTest项目的根目录下,打开浏览器输入下述地址验证amfphp是否安装成功 http://localhost/MyTest/amfphp/gateway.php amfphp就是通过这个gateway来定位我们的服务类,并将请求转发给这些服务类进行处理的。 2,Login.php文件,包含了处理登陆请求的Login类,此文件置于BusinessLogic目录下 复制代码 代码 <?php class Login { public function doLogin($data) { $result = array(); try { $name = array_shift($data); $pwd = array_shift($data); if ($name == "phinecos" && $pwd == "123") { $result[] = "1"; $result[] = "you are valid user!"; } else { $result[] = "0"; $result[] = "login failed"; } } catch (Exception $ex) { $result[] = "-1"; $result[] = $ex->getMessage(); } return $result; } } ?> 复制代码 3,将globals.php中的服务路径项修改如下,为amfphp指明服务类所在的目录 $servicesPath = "../BusinessLogic/"; 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2010/05/10/1731595.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

docker 入门 安装

ubuntu_16.04 执行下面命令,安装docker curl -sSL https://get.docker.com/ | sh 安装完成 docker pull ubuntu:latest(获取ubuntu镜像) docker images(列出你的镜像) docker run --rm -ti ubuntu /bin/bash(在镜像上创建一个容器) 上一条命令的简要说明: --rm:告诉Docker一旦运行的进程退出就删除容器。这在进行测试时非常有用,可免除杂乱[图片] -ti:告诉Docker分配一个伪终端并进入交互模式。 这将进入到容器内,对于快速原型开发或尝试很有用,但不要在生产容器中打开这些标志[图片] ubuntu:这是容器立足的镜像 /bin/bash:要运行的命令,因为我们以交互模式启动,它将显示一个容器的提示符 可以用ps或top命令查看运行哪些进程 容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。 守护态运行 更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 -d 参数来实现。 例如下面面的命令会在后台运行容器。$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147容器启动后会返回一个唯一的 id,也可以通过 docker ps 命令来查看容器信息。$ sudo docker ps 要获取容器的输出信息,可以通过 docker logs 命令。$ sudo docker logs insane_babbage sudo docker run -t -i -c 100 -m 512MB -h test1 -d --name="docker_test1" ubuntu /bin/bash # 创建一个 cpu 优先级为 100,内存限制 512MB,主机名为 test1,名为 docker_test1 后台运行 bash 的容器 查看当前 docker0 ip sudo ifconfig docker0 数据卷 sudo docker run --name data -v /data -t -i ubuntu /bin/bash # 创建数据卷绑定到到新建容器,新建容器中会创建 /data 数据卷 bash-4.1 # ls -ld /data/ 创建的数据卷可以通过docker inspect获取宿主机对应路径 sudo docker inspect data 挂载宿主机目录为一个数据卷 -v选项除了可以创建卷,也可以挂载当前主机的一个目录到容器中。 sudo docker run --name web -v /source/:/web -t -i ubuntu:14.04 /bin/bash bash-4.1# ls -ld /web/ h-t-t-p-://www.open-open.com/lib/view/open1423703640748.html 本文转自 skinglzw 51CTO博客,原文链接:http://blog.51cto.com/skinglzw/1879070,如需转载请自行联系原作者

优秀的个人博客,低调大师

Kafka实战-入门

1.概述 经过一个多月的时间观察,业务上在集成Kafka后,各方面还算稳定,这里打算抽时间给大家分享一下Kafka在实际场景中的一些使用心得。本篇博客打算先给大家入个门,让大家对Kafka有个初步的了解,知道Kafka是做什么的,下面是本篇博客的目录内容: Kafka背景 Kafka应用场景 Kafka架构原理 下面开始今天的博客分享内容。 2.Kafka背景 Kafka它本质上是一个消息系统,由当时从LinkedIn出来创业的三人小组开发,他们开发出了Apache Kafka实时信息队列技术,该技术致力于为各行各业的公司提供实时数据处理服务解决方案。Kafka为LinkedIn的中枢神经系统,管理从各个应用程序的汇聚,这些数据经过处理后再被分发到其他地方。Kafka不同于传统的企业信息队列系统,它是以近乎实时的方式处理流经一个公司的所有数据,目前已经服务于LinkedIn、Netflix、Uber以及Verizon,并为此建立了实时信息处理平台。 流水数据是所有站点对其网站使用情况做报表时都要用到的数据中最常用的一部分,流水数据包括PV,浏览内容信息以及搜索记录等。这些数据通常是先以日志文件的形式存在,然后有周期的去对这些日志文件进行统计分析处理,然后获得需要的KPI指标结果。 3.Kafka应用场景 我们在接触一门新技术或是新语言时,得明白这门技术(或是语言)的应用场景,也就说要明白它能做什么,服务的对象是谁,下面用一个图来说明,如下图所示: 首先,Kafka可以应用于消息系统,比如,当下较为热门的消息推送,这些消息推送系统的消息源,可以使用Kafka作为系统的核心组建来完成消息的生产和消息的消费。然后是网站的行迹,我们可以将企业的Portal,用户的操作记录等信息发送到Kafka中,按照实际业务需求,可以进行实时监控,或者做离线处理等。最后,一个是日志收集,类似于Flume套件这样的日志收集系统,但Kafka的设计架构采用push/pull,适合异构集群,Kafka可以批量提交消息,对Producer来说,在性能方面基本上是无消耗的,而在Consumer端中,我们可以使用HDFS这类的分布式文件存储系统进行存储。 4.Kafka架构原理 Kafka的设计之初是希望做一个统一的信息收集平台,能够实时的收集反馈信息,并且具有良好的容错能力。Kafka中我们最直观的感受就是它的消费者与生产者,如下图所示: 4.1Producer And Consumer 这里Kafka对消息的保存是根据Topic进行归类的,由消息生产者(Producer)和消息消费者(Consumer)组成,另外,每一个Server称为一个Broker。对于Kafka集群而言,Producer和Consumer都依赖于ZooKeeper来保证数据的一致性。 4.2Topic 在每条消息输送到Kafka集群后,消息都会由一个Type,这个Type被称为一个Topic,不同的Topic的消息是分开存储的。如下图所示: 一个Topic会被归类为一则消息,每个Topic可以被分割为多个Partition,在每条消息中,它在文件中的位置称为Offset,用于标记唯一一条消息。在Kafka中,消息被消费后,消息仍然会被保留一定时间后在删除,比如在配置信息中,文件信息保留7天,那么7天后,不管Kafka中的消息是否被消费,都会被删除;以此来释放磁盘空间,减少磁盘的IO消耗。 在Kafka中,一个Topic的多个分区,被分布在Kafka集群的多个Server上,每个Server负责分区中消息的读写操作。另外,Kafka还可以配置分区需要备份的个数,以便提高可用行。由于用到来ZK来协调,每个分区都有一个Server为Leader状态,服务对外响应(如读写操作),若该Leader宕机,会由其他的Follower来选举出新的Leader来保证集群的高可用性。 5.总结 总体来说,介绍Kafka的相关背景,概述及原理,这些较为偏理论,概念性较强,需要大家认真的去理解、琢磨,这里可以大致熟悉一下,心中有个轮廓,后面会陆续介绍Kafka的实战用法,让大家在实际业务和编码中去体会Kafka的这些原理。 6.结束语 这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉! 联系方式: 邮箱:smartloli.org@gmail.com Twitter: https://twitter.com/smartloli QQ群(Hadoop - 交流社区1): 424769183 温馨提示:请大家加群的时候写上加群理由(姓名+公司/学校),方便管理员审核,谢谢! 热爱生活,享受编程,与君共勉! 本文转自哥不是小萝莉博客园博客,原文链接:http://www.cnblogs.com/smartloli/,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spring入门介绍

spring是为了解决企业应用开发环境所创建的。框架的主要优势之一是分层架构,分层架构允许使用者选择使用哪一个组件,同时也为javaEE应用开发提供集成的框架。 IOC和AOP这两个模块是Spring的核心模块,同时也是系统中其他模块的其他组件应用开发的基础。只有深刻了解这两个模块的基本原理,才能更好的进行Spring应用程序的开发。 一、Spring概况 a.Spring的简介 Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架,它主要是为了解决企业应用开发的复杂性而诞生的。 目的:解决企业应用开发的复杂性 功能:使用基本的JavaBean代替EJB 范围:任何的Java应用 b.Spring的起源 Spring的存在是因为它自身有着得天独厚的优势: 它定位的领域是其他framework没有的 Spring是全面的和模块化的 它的设计从底部帮助开发者编写易于测试的代码 Spring是潜在的一站式解决方案 c.Spring的优点 Spring天生就存在如下的优点: 低侵入式设计,代码污染极低 Write Once,Run Anywhere DI有效的降低了耦合度 AOP提供了通用任务的集中管理 ORM和DAO简化了对数据库的访问 高度开放性,并不强制 Spring的优点给开发带来的好处: 可以有效组织中间层对象 使用统一的配置文件 促进良好编程习惯,减少编程代价 易于单元测试 使EJB成为一种备选 为数据的存取提供了一致的框架 d.Spring的特点 方便解耦,简化开发 AOP编程的支持 声明式事务的支持 方便程序的测试 方便集成各种优秀框架 降低JavaEE API的使用难度 Spring的源码是经典的学习范例 e.Spring的核心模块 Spring框架是一个分层架构,它由7个定义良好的模块组成。Spring的模块构建在核心容器之上,核心容器对应了创建、配置和管理Bean的方式。组成Spring框架的每个模块或者组件都可以单独存在,或者与其他一个或多个模块来联合实现一个应用程序。 核心容器(Spring Core) 核心容器定义了框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 应用上下文(Spring Context) Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。 AOP模块(Spring AOP) 通过配置管理特性,Spring的AOP模块直接将面向切面的编程功能集成到了Spring框架当中。所以,可以很容易地使Spring框架管理的任何对象都可以支持AOP。Spring的AOP模块为基于Spring的应用程序中的对象提供了事务管理服务,通过使用Spring AOP,不用依赖EJB组件就可以将声明性事务管理集成到应用程序当中。 JDBC和DAO模块(Spring DAO) JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。 对象实体映射(Spring ORM) Spring框架插入了若干个ORM框架,从而提供了ORM对象的关系工具。其中包括JDO、Hibernate、iBats。所有这些都遵从Spring的通用事务和DAO异常层次结构。 Web模块(Spring Web) Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以Spring框架支持与Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到预对象的工作。 MVC模块(Spring Web MVC) Spring的MVC框架是一个全功能的构建Web应用程序的MVC的实现。通过策略接口,MVC框架变成了高度可配置的。MVC容纳了大量视图技术,其中包括JSP、Tiles、iText和POI。模型由JavaBean来构成,存放于map当中。而视图是一个接口,负责实现模型。控制器表示逻辑代码,是Controller的实现。 Spring的框架的功能可以用在任何J2EE服务器当中,大多数功能也适用于不受管理的环境。Spring的核心要点就是:支持不把用到特定JavaEE服务的可重用业务和数据的访问对象。毫无疑问,这样的业务和对象可以在不同的JavaEE环境独立应用程序和测试环境之间重用。 本文转自yeleven 51CTO博客,原文链接:http://blog.51cto.com/11317783/1832047

优秀的个人博客,低调大师

Hadoop入门(二)

一、Hadoop 1.0的模型: | split 0->map-[sort]->[1,3..] | /merge | ==> reducer-->part 0 =>HDFS replication split 1->map-[sort]->[2,6..] |————————————— |==> reducre--->part 1 =>HDFS replication split 2->map-[sort]->[4,2..] | | | //INPUT HDFS | //output HDFS //启动有3个map,reducer只启动了2个,sort:本地排序后发送给reducer 相同的key发送到同一个reducer //merge:把多个数据流整合为一个数据流 工作流程: Client--->Job--->Hadoop MapReduce master | | V / \ Job parts Job parts | | V V [Input] -- map1 reduceA---->[Output] [Data ] ---map2 =》 reduceB---->[Data ] \__map3 //其中map1,2,3和reduceA,B是交叉使用的。也就是说map1可以同时对应reduceA和reduceB,其他的也都可以 //MapReduce将需要处理的任务分成两个部分,Map和Reduce Client App (MapReduce Client)----> Job Tracker | ____________________|_____________________________ [task tracker1] [task tracker1] [task tracker1] map reduce reduce reduce map map reduce map JobTracker:有任务列表,以及状态信息 JobA----> [map task1] JobB [map task2] JobC [map task3] ... [reduce task 1] [reduce task 2] //任何一个task tracker能够运行的任务数量是有限的,可以进行定义 //任务槽:决定可以运行多少个job Jobtracker: 1.负责任务分发 2.检查Task tracker状态,tracker故障重启等 3.监控任务的状态 Job tracker存在单点故障的问题,在hadoop2.0后这几个功能分别实现了 Mapreduce 2.0之后切割为两部分 二、HadooP 1.0 和 2.0 1.0: pig:data flow,Hive:sql , 2.0: MR:batch批处理,Pig:data flow,Hive:sql RT:stream graph:实时流式图形处理 Tez:execution engine//执行引擎 MRv1:cluster resouce manager,Data procession MRV2: 1.YARN:Cluster resource manager Yet Another Resource Negotiator,另一种资源协调者 2.MRv2:Data procession MR:batch作业 Tez:execution engine //提供运行时环境 可以直接在YARN之上的程序有: MapReduce:Batch,Tez,HBase,Streaming,Graph,SPark,HPC MPI[高性能],Weave Hadoop2.0 clinet-->RM--->node1/node2/node n... Resouce Manager: RM是独立的 node上运行的有[node manager+App Master+ Container] Node manager:NM,运行在各node上,周期向RM报告node信息, clinet请求作业:node上的Application master决定要启动几个mapper几个 reducer mapper和reducer 称为 Container //作业都在容器内运行。 Application master只有一个,且同一个任务的APP M只在一个节点上,但是Container会分别运行在多个节点上,并周期向APP M报告其处理状态 APP M向RM报告任务运行状况,在任务执行完毕后,RM会把APP M关闭 某一个任务故障后,由App M进行管理,而不是RM管理 2.0工作模型 A 【NM/Container 1 /APP M(B)】 \ / 【RM】 -- 【NM/Container 2 /APP M(A)】 / \ B 【NM/Container 3 /A&A 】 //任务 A运行了3个container,在两个节点上 //任务B运行了1个container,在一个节点上 Mapreduce status:container向APP M报告 //container包括map和reducer任务 Job submission: node status:NM周期向RM报告 Resouce Request :由App M向RM申请,然后APP M就可以使用其他node 的container client请求-->RM查找空闲node,空闲node上运行APP M-->APP M向RM申请运行container资源,RM向NM提请container,RM分配好coantainer后,告诉给APP M APP M使用container运行任务。Container在运行过程中,不断向APP M反馈自己的状态和进度,APP M向RM报告运行状态。 APP M报告运行完成,RM收回container和关闭APP M RM:resource manager NM:node manager AM:application master container:mr任务运行 Hadoop 发展路线: 2003 nutch //蜘蛛程序 2004-2006:Mapreduce + GFS,论文 2011:hadoop 1.0.0 2013:hadoop 2.0 http://hadoop.apache.org/ 可以直接在YARN之上的程序有: MapReduce:Batch,Tez,HBase,Streaming,Graph,SPark,HPC MPI[高性能],Weave 三、Hadoop 2.0生态系统与基本组件 //在YARN之上是依赖于YARN的,其他的都是可以独立使用的 2、HDFS(Hadoop分布式文件系统) 源自于Google的GFS论文,发表于2003年10月,HDFS是GFS克隆版。 HDFS是Hadoop体系中数据存储管理的基础。它是一个高度容错的系统,能检测和应对硬件故障,用于在低成本的通用硬件上运行。 HDFS简化了文件的一致性模型,通过流式数据访问,提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序。 它提供了一次写入多次读取的机制,数据以块的形式,同时分布在集群不同物理机器上。 3、Mapreduce(分布式计算框架) 源自于google的MapReduce论文,发表于2004年12月,Hadoop MapReduce是google MapReduce 克隆版。 MapReduce是一种分布式计算模型,用以进行大数据量的计算。它屏蔽了分布式计算框架细节,将计算抽象成map和reduce两部分, 其中Map对数据集上的独立元素进行指定的操作,生成键-值对形式中间结果。Reduce则对中间结果中相同“键”的所有“值”进行规约,以得到最终结果。 MapReduce非常适合在大量计算机组成的分布式并行环境里进行数据处理。 4.HBASE(分布式列存数据库) 源自Google的Bigtable论文,发表于2006年11月,HBase是Google Bigtable克隆版 HBase是一个建立在HDFS之上,面向列的针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。 HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。 HBase提供了对大规模数据的随机、实时读写访问,同时,HBase中保存的数据可以使用MapReduce来处理,它将数据存储和并行计算完美地结合在一起。 HBase:山寨版的BitTable,列式存储,SQL为行式存储。 列祖:把多个常用的列存放在一个中。 cell:行和列的交叉位置,每个cell在存储时,可以多版本共存,之前的版本不会被删除,可以追溯老版本。 可以指定保存几个版本。每个cell都是键值对,任何一个行多一个字段或者少一个字段,都是可以的,没有强schema约束 HBASE是工作在HDFS之上,转化为chunk的 需要用到大数据块时,读取到HBase中,进行读取和修改,然后覆盖或者写入HDFS 从而实现随机读写。HDFS是不支持随机读写的 HBase接口: HBase基于分布式实现:需要另起一套集群,严重依赖于ZooKeeper解决脑裂 HDFS本身就有冗余功能,每个chunk存储为了多个副本 HBase作为面向列的数据库运行在HDFS之上,HDFS缺乏随即读写操作,HBase正是为此而出现。 HBase以Google BigTable为蓝本,以键值对的形式存储。项目的目标就是快速在主机内数十亿行数据中定位所需的数据并访问它。 HBase是一个数据库,一个NoSql的数据库,像其他数据库一样提供随即读写功能,Hadoop不能满足实时需要,HBase正可以满足。 如果你需要实时访问一些数据,就把它存入HBase。 你可以用Hadoop作为静态数据仓库,HBase作为数据存储,放那些进行一些操作会改变的数据 5.Zookeeper(分布式协作服务) 源自Google的Chubby论文,发表于2006年11月,Zookeeper是Chubby克隆版 解决分布式环境下的数据管理问题:统一命名,状态同步,集群管理,配置同步等。 Hadoop的许多组件依赖于Zookeeper,它运行在计算机集群上面,用于管理Hadoop操作。 6.HIVE(数据仓库)小蜜蜂 由facebook开源,最初用于解决海量结构化的日志数据统计问题。 Hive定义了一种类似SQL的查询语言(HQL),将SQL转化为MapReduce任务在Hadoop上执行。通常用于离线分析。 HQL用于运行存储在Hadoop上的查询语句,Hive让不熟悉MapReduce开发人员也能编写数据查询语句,然后这些语句被翻译为Hadoop上面的MapReduce任务。 Hive:帮忙转换成MapReduce任务//MapReduce:是bat程序,速度较慢 HQ与SQl语句接近,适合在离线下进行数据的操作,在真实的生产环境中进行实时的在线查询或操作很“慢” Hive在Hadoop中扮演数据仓库的角色。 你可以用 HiveQL进行select,join,等等操作。 如果你有数据仓库的需求并且你擅长写SQL并且不想写MapReduce jobs就可以用Hive代替。 熟悉SQL的朋友可以使用Hive对离线的进行数据处理与分析工作 7.Pig(ad-hoc脚本) 由yahoo!开源,设计动机是提供一种基于MapReduce的ad-hoc(计算在query时发生)数据分析工具 Pig定义了一种数据流语言—Pig Latin,它是MapReduce编程的复杂性的抽象,Pig平台包括运行环境和用于分析Hadoop数据集的脚本语言(Pig Latin)。 其编译器将Pig Latin翻译成MapReduce程序序列将脚本转换为MapReduce任务在Hadoop上执行。通常用于进行离线分析。 Pig:脚本编程语言接口 一种操作hadoop的轻量级脚本语言,最初又雅虎公司推出,不过现在正在走下坡路了。 不过个人推荐使用Hive 8.Sqoop(数据ETL/同步工具) Sqoop是SQL-to-Hadoop的缩写,主要用于传统数据库和Hadoop之前传输数据。数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。 Sqoop利用数据库技术描述数据架构,用于在关系数据库、数据仓库和Hadoop之间转移数据。 9.Flume(日志收集工具) Cloudera开源的日志收集系统,具有分布式、高可靠、高容错、易于定制和扩展的特点。 它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。 同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。此外,Flume还具有能够将日志写往各种数据目标(可定制)的能力。 总的来说,Flume是一个可扩展、适合复杂环境的海量日志收集系统。当然也可以用于收集其他类型数据 10.Mahout(数据挖掘算法库) Mahout起源于2008年,最初是Apache Lucent的子项目,它在极短的时间内取得了长足的发展,现在是Apache的顶级项目。 Mahout的主要目标是创建一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。 Mahout现在已经包含了聚类、分类、推荐引擎(协同过滤)和频繁集挖掘等广泛使用的数据挖掘方法。 除了算法,Mahout还包含数据的输入/输出工具、与其他存储系统(如数据库、MongoDB 或Cassandra)集成等数据挖掘支持架构。 11.Oozie(工作流调度器) Oozie是一个可扩展的工作体系,集成于Hadoop的堆栈,用于协调多个MapReduce作业的执行。它能够管理一个复杂的系统,基于外部事件来执行,外部事件包括数据的定时和数据的出现。 Oozie工作流是放置在控制依赖DAG(有向无环图 Direct Acyclic Graph)中的一组动作(例如,Hadoop的Map/Reduce作业、Pig作业等),其中指定了动作执行的顺序。 Oozie使用hPDL(一种XML流程定义语言)来描述这个图。 12.Yarn(分布式资源管理器) YARN是下一代MapReduce,即MRv2,是在第一代MapReduce基础上演变而来的,主要是为了解决原始Hadoop扩展性较差,不支持多计算框架而提出的。 Yarn是下一代 Hadoop 计算平台,yarn是一个通用的运行时框架,用户可以编写自己的计算框架,在该运行环境中运行。 用于自己编写的框架作为客户端的一个lib,在运用提交作业时打包即可。该框架为提供了以下几个组件: - 资源管理:包括应用程序管理和机器资源管理 - 资源双层调度 - 容错性:各个组件均有考虑容错性 - 扩展性:可扩展到上万个节点 13.Mesos(分布式资源管理器) Mesos诞生于UC Berkeley的一个研究项目,现已成为Apache项目,当前有一些公司使用Mesos管理集群资源,比如Twitter。 与yarn类似,Mesos是一个资源统一管理和调度的平台,同样支持比如MR、steaming等多种运算框架。 14.Tachyon(分布式内存文件系统) Tachyon(/'tki:n/ 意为超光速粒子)是以内存为中心的分布式文件系统,拥有高性能和容错能力, 能够为集群框架(如Spark、MapReduce)提供可靠的内存级速度的文件共享服务。 Tachyon诞生于UC Berkeley的AMPLab。 15.Tez(DAG计算模型) Tez是Apache最新开源的支持DAG作业的计算框架,它直接源于MapReduce框架,核心思想是将Map和Reduce两个操作进一步拆分, 即Map被拆分成Input、Processor、Sort、Merge和Output, Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等, 这样,这些分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的DAG作业。 目前hive支持mr、tez计算模型,tez能完美二进制mr程序,提升运算性能。 16.Spark(内存DAG计算模型) Spark是一个Apache项目,它被标榜为“快如闪电的集群计算”。它拥有一个繁荣的开源社区,并且是目前最活跃的Apache项目。 最早Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架。 Spark提供了一个更快、更通用的数据处理平台。和Hadoop相比,Spark可以让你的程序在内存中运行时速度提升100倍,或者在磁盘上运行时速度提升10倍 17.Giraph(图计算模型) Apache Giraph是一个可伸缩的分布式迭代图处理系统, 基于Hadoop平台,灵感来自 BSP (bulk synchronous parallel) 和 Google 的 Pregel。 最早出自雅虎。雅虎在开发Giraph时采用了Google工程师2010年发表的论文《Pregel:大规模图表处理系统》中的原理。后来,雅虎将Giraph捐赠给Apache软件基金会。 目前所有人都可以下载Giraph,它已经成为Apache软件基金会的开源项目,并得到Facebook的支持,获得多方面的改进。 18.GraphX(图计算模型) Spark GraphX最先是伯克利AMPLAB的一个分布式图计算框架项目,目前整合在spark运行框架中,为其提供BSP大规模并行图计算能力。 19.MLib(机器学习库) Spark MLlib是一个机器学习库,它提供了各种各样的算法,这些算法用来在集群上针对分类、回归、聚类、协同过滤等。 20.Streaming(流计算模型) Spark Streaming支持对流数据的实时处理,以微批的方式对实时数据进行计算 21.Kafka(分布式消息队列) Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数据。 活跃的流式数据在web网站应用中非常常见,这些数据包括网站的pv、用户访问了什么内容,搜索了什么内容等。 这些数据通常以日志的形式记录下来,然后每隔一段时间进行一次统计处理。 22.Phoenix(hbase sql接口) Apache Phoenix 是HBase的SQL驱动,Phoenix 使得Hbase 支持通过JDBC的方式进行访问,并将你的SQL查询转换成Hbase的扫描和相应的动作。 23.ranger(安全管理工具) Apache ranger是一个hadoop集群权限框架,提供操作、监控、管理复杂的数据权限,它提供一个集中的管理机制,管理基于yarn的hadoop生态圈的所有数据权限。 24.knox(hadoop安全网关) Apache knox是一个访问hadoop集群的restapi网关,它为所有rest访问提供了一个简单的访问接口点,能完成3A认证(Authentication,Authorization,Auditing)和SSO(单点登录)等 25.falcon(数据生命周期管理工具) Apache Falcon 是一个面向Hadoop的、新的数据处理和管理平台,设计用于数据移动、数据管道协调、生命周期管理和数据发现。它使终端用户可以快速地将他们的数据及其相关的处理和管理任务“上载(onboard)”到Hadoop集群。 26.Ambari(安装部署配置管理工具) Apache Ambari 的作用来说,就是创建、管理、监视 Hadoop 的集群,是为了让 Hadoop 以及相关的大数据软件更容易使用的一个web工具。 注意:Hadoop尽量不要运行在虚拟机上,因为对IO影响比较大 Hadoop Distribution: 社区版:Apache Hadoop 第三方发行版: Cloudera:hadoop源创始人:CDH //iso镜像,最成型的 Hortonworks:原有的hadoop人员:HDP //iso镜像,非开源 Intel:IDH MapR: Amazon Elastic Map Reduce(EMR) 推荐使用Apache hadoop或者CDH 本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1944004,如需转载请自行联系原作者

优秀的个人博客,低调大师

openstack(一)入门

可能很多人会跟我一样,开始刚接触openstack,去学的时候发现东西很多,越看越乱,有种无处发力的感觉。这里我结合红帽RHCA认证里的openstack课程认证和openstack官方网站,加上自己的理解,整理成博文,抛砖引玉。 一、基本概念 OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。 OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。 概念里面几个关键字:开源、云计算管理平台、IaaS、集成。 总的来讲,个人觉得,学习openstack大概需要了解以下几个技能: 要有基本的linux知识 了解基本的虚拟化相关概念,熟悉KVM等 搞云计算离不开网络,对DHCP、NAt、Bridge、vlan这些网络知识是必须要了解的。 了解相关存储知识,如分布式存储、对象存储 掌握一种自动化部署的工具,比如puppet、ansible、Chef等你会发现事半功倍 Python 了解一个框架,flask或Django起码知道。OpenStack 基于 Web 的管理控制台 OpenStack Dashboard 是用 Python 和 Django 框架写的。 二、openstack架构 先上图,暂不多说: 三、主要服务(service) 因为openstack涉及的service比较多,初期接触的时候建议只关注几个关键的服务,慢慢的由浅入深。 安照openstack官方给出的顺序: 第一步,选择你的使用方式,How will you beusing OpenStack? 是只当计算资源用还是当对象存储 使用,亦或两者结合使用; 第二步,选择核心服务,包括keystone(identity)、nova(compute)、neutron(networking)、cinder(block storage)、swift(object storage)glance(glance),这几个core service基本都是需要了解的; 第三步,选Optional Services来强化,这里面可以优先选择看horizon(dashboard)、 ceilometer(telemetry)、heat(orchestration)。 相关服务介绍如下: Horizon(dashboard) 一个基于Web的Openstack管理平台,为用户提供如:启动虚拟机、管理虚拟网络、设置访问控制的图像接口。 Keystone(identity) 一个中心认证服务,为其他服务提供认证和授权。keystone同时提供openstack云各个其他组件的目录服务。 Keystone提供多种认证方式包括:用户名、密码,令牌,AWS(Amazon logins) Keystone是所有服务的起始点,只有经过认证,其它的服务才会认为可以合法执行。它是Openstack的钥匙。 Neutron(networking) 在Openstack云中创建和管理虚拟网络架构(网络、子网、路由、防火墙) Cinder(block storage) 为虚拟机提供逻辑卷管理功能,通常为虚拟机提供附加磁盘存储。 Nova(compute) 提供虚拟机管理功能,调用底层的Hypervisor提供该功能,支持libvirtd,qemu,kvm等Hypervisor。 Glance(image) Glance项目提供虚拟机镜像的发现,注册,取得服务; Glance提供restful API可以查询虚拟机镜像的metadata,并且可以获得镜像; 通过Glance,虚拟机镜像可以被存储到多种存储上,比如简单的文件存储或者对象存储。 Swift(object storage) Swift项目提供了弹性可伸缩、高可用的分布式对象存储服务,适合存储大规模非结构化数据。 Ceilometer(metering) Ceilometer像一个漏斗,能把OpenStack内部发生的几乎所有的事件都收集起来,然后为计费和监控以及其它服务提供数据支撑。 Heat(orchestration) heat实现了一种自动化的通过简单定义和配置就能实现的云部署方式。可以在heat模板中定义连串相关任务(例如用某配置开几台虚拟机,然后再去在其中一台中安装一个mysql服务,设定相关数据库属性,然后再配置几台虚拟机安装web服务集群等等),然后交由heat,由heat按照一定的顺序执行heat模板中定义的一连串任务。 本文转自Jx战壕 51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1745675,如需转载请自行联系原作者

优秀的个人博客,低调大师

Docker入门(二)

一、Docker相关概念 1.Docker: namespace,cgroup: 解决方案: lxc,openvz lxc:linux containers docker最初就是lxc的封装版本。 docker engine/docker server:输出一个api,用于接受外部请求 接受到client请求,借助于lxc虚拟化技术,在lxc上创建一个虚拟机实例。 docker借助于外部的dockerhub,实现image 后台docker不再使用lxc,使用libcontainer[centos 7],隔离用户空间的引擎 在前端使用没有区别 2.容器虚拟化 例如kvm也需要images,有一个完整的OS 而容器所需的images,并非完整的OS,只拥有FS,没有内核 借助于AUFS技术对映像文件进行分层,容器运行一个独立的FS上 运行nginx需要nginx依赖的库,运行mysql需要依赖mysql的库 把FS做成一个base image,再做几个专用的image,例如nginx专用的,MySQl专用的 [docker hub] / / [cn1][cn2]... [API] [docker engine ] ======================= Hypervisor ============= Host OS ============== 【硬件】 3.核心组件; docker client:docker的client工具,用户使用docker的接口,docker client与docker daemon通信。并将结果返回给client docker daemon:运行在宿主机,Docker的守护进程,用户可通过docker client与其交互; image :只读的,基于aufs或者UnionFS叠加在一起,用来创建container 一个镜像可以运行多个container;镜像文件可以通过Dockerfile创建,也可以从docker hub/registry 下载 repository 公共仓库 //提供有base image Docuer hub/registry 私有仓库 //docker repository docker container:docker的运行实例,容器是一个隔离环境 另外两个重要组件: docker link:各docker之间的通信,openvswtich,netns构建, docker volume:容器中的数据的持久化 二、安装Docker: centos6 ;epel centos7: extra docker-engine 安装Docker: https://mirrors.aliyun.com/docker-engine/yum/repo/main/centos/7/ yum install docker-engine [root@node1 ~]# rpm -ql docker-engine |egrep -v "share" /etc/udev/rules.d/80-docker.rules /usr/bin/docker /usr/bin/docker-containerd /usr/bin/docker-containerd-ctr /usr/bin/docker-containerd-shim /usr/bin/docker-init /usr/bin/docker-proxy /usr/bin/docker-run /usr/bin/dockerd /usr/lib/systemd/system/docker.service docker子命令有很多 systemctl start docker.service docker images //查看镜像 docker search centos Name DESCRIPTION STARS STARS OFFICAL AUTOMATED 星 自动生成 darksheer/centos //用户名:镜像名 docker search busybox docker pull busybox //拉取官方镜像 base iamge tag : lastest //最新版本,默认最新版本 docker pull hub.mt.com:5000/busybox //执行私有仓库获取image,必须支持ssl。或者禁止使用tls docker help run //运行 docker run [OPTIONS] IMAGS [COMMAND] [AEG,...] //image应该有一个运行起来后,默认运行的命令。 -t --tty=false 分配一个默认的伪终端 -i --interactive=false 打开之后运行在交互式 [root@node1 ~]# docker run -it busybox:latest /bin/sh docker ps //查看正在运行的 docker 需要借助于外 volume 保存创建的数据。 docker help commit //基于当前容器的所有修改,创建一个新的images docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 三、docker常用命令: 1.环境信息相关 info version 2.系统维护相关 images inspect :容器的详细信息 build:基于dockerfile创建image文件 commit:基于运行中的容器创建映像文件 pause:暂停 unpause rm rmi //删除映像文件 run //基于image运行一个容器 start/stop/restart top //资源占用情况 ps kill ... 3.日志相关 events; hisgory; logs; 4.Docker hub 相关 login logout pull push search 基本操作: 获取映像:pull 启动容器:run -i,-t docker run -it centos:latest /bin/bash ifconfig //docker0 一个虚拟接口 一半在虚拟机, 一半在宿主机 docker kill c98dac012556 //kill 掉容器,容器ID docker ps -a //可以查看所有的 关闭后,默认还是会占用内存,可以在启动的时候 docker run --rm //退出则,rm自动移除容器 docker rm c98dac012556 //删除该容器 docker image的创建: 1.基于dockerfile 2.基于运行中的容器修改 //仅仅是打包最上面一层,只有最上面一层是可写的。 实验:commit,保存文件 [root@node1 ~]# docker run -it centos:latest /bin/bash 在home中 useradd centos [root@node1 ~]# docker commit faecb4def9d5 centos:newuser [root@node1 ~]# docker images 有 newuser [root@node1 ~]# docker kill faecb4def9d5 [root@node1 ~]# docker rm faecb4def9d5 [root@node1 ~]# docker ps -a 没有之前的容器了 [root@node1 ~]# docker run -it --rm centos:newuser /bin/bash rm用于关闭后,就删除容器 [root@3f20a3c7f5df /]# id centos uid=1000(centos) gid=1000(centos) groups=1000(centos) [root@3f20a3c7f5df /]# exit [root@node1 ~]# docker ps -a //将没有容器运行 本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1946362,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册