【三小时学会Kubernetes!(一) 】容器简介及为每个服务创建镜像
容器是什么
Kubernetes 是容器管理平台。可想而知我们需要容器去管理它们。但是容器是什么?Docker 官方文档的最佳答案如下:
容器映像是轻量级的、独立的、可执行软件包,包含所有可运行的东西:代码、运行时、系统工具、系统库、设置。对于基于 Linux 和 Windows 的应用,不论环境如何,容器化的软件都可以照常运行。
这意味着容器可以在任何计算机上运行,甚至是在产品服务器上,都没有任何差别。

为了更形象地描述,让我们来对比一下 React 应用程序在虚拟机上和容器内运行的情况。
通过虚拟机提供 React 静态文件
使用虚拟机的缺点包括:
- 资源效率低下,每个虚拟机都需要一个完全成熟的操作系统;
- 对平台有依赖性。本地机器上运行得很好的功能未必能在产品服务器上正常工作;
- 与容器相比,更重而且规模伸缩较慢。

通过容器提供 React 静态文件
使用容器的优点包括:
- 资源效率很高,在 Docker 的帮助下使用主机操作系统;
- 对平台没有依赖性。可以在本地机器上运行的容器可以在任何机器上正常工作;
- 通过映像层提供轻量级服务。

以上是使用容器最突出的特色和优势。更多信息,请参阅 Docker 官方文档:https://www.docker.com/what-container。
为 React 应用建立容器镜像(Docker 简介)
Docker 容器最基本的组件是 .dockerfile。该 Dockerfile 文件最基本的组成是容器镜像,我们将通过下列一系列说明,介绍如何创建一个符合应用程序需求的容器镜像。
在开始定义 Dockerfile 之前,让我们先回想一下使用 Nginx 服务 React 静态文件的步骤:
- 创建静态文件(npm run build);
- 启动 Nginx 服务器;
- 将前端项目的 build 文件夹的内容复制到 nginx/html 目录中。
在下一节中,你会注意到创建容器与建立本地 React 的过程非常相似。
为前端定义 Dockerfile
前端 Dockerfile 的建立只有两个步骤。这是因为 Nginx 团队为我们提供了基本的 Nginx 映像,我们可以直接利用。这两个步骤如下:
- 启动基本的 Nginx 映像;
- 将 sa-frontend/build 目录复制到容器的 nginx/html 中。
转换成的Dockerfile如下所示:
FROM nginx COPY build /usr/share/nginx/html
很惊讶吧?这个文件是可读的,我们可以概括为:
从 Nginx 映像开始(不管里面是什么)。将 build 目录复制到映像的 nginx/html 目录中。然后就好了!
你可能在想,我该从哪儿复制 build 文件呢?例如:/usr/share/nginx/html。非常简单:在 Docker Hub 的 Nginx 映像文档中有记载。
建立并推送容器
在推送映像之前,我们需要一个容器注册来托管映像。Docker Hub 是一个免费的云容器服务,我们将使用它来做演示。接下来有 3 个任务需要完成:
- 安装 Docker CE;
- 注册 Docker Hub;
- 在终端中运行如下命令登录:
docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
在完成上述任何后,请进入目录 sa-frontend。然后运行如下命令(请用你的 docker hub 用户名替换 $DOCKER 用户名,例如:rinormaloku/sentiment-analysis-frontend)
docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend .
现在我们可以删掉 -f Dockerfile 了,因为我们已经在包含 Dockerfile 的目录中了。
我们可以使用 docker push 命令来推送映像:
docker push $DOCKER_USER_ID/sentiment-analysis-frontend
请确认映像已成功地被推送到 docker hub 代码库。
运行容器
现在任何人都可以获取 $DOCKER_USER_ID/sentiment-analysis-frontend 中的映像并运行:
docker pull $DOCKER_USER_ID/sentiment-analysis-frontend docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend
Docker 容器已经处于运行状态了!
在进行下一步之前,让我们先来讲解一下 80:80,很多人对此比较不解:
- 第一个 80 是主机的端口号(例如:我的计算机);
- 第二个 80 是容器的端口号,请求都会被转送到这里。

这是从<主机端口>匹配到<容器端口>的。也就是说每个发往主机 80 端口的请求都会被匹配到容器的 80 端口,如图 9 所示。
因为在主机上(你的计算机)80 端口上运行的端口可以访问 localhost:80。如果本地不支持 Docker,那么你可以在 :80 上打开应用程序。运行 docker-machine ip 命令可以找到 Docker 机器的 IP。
试试看!你现在应该可以访问 React 应用程序了。
Dockerignore 文件
刚才我们看到建立 SA-Frontend 的映像非常慢,不好意思,应该是超级慢。这是因为我们必须将建立过程中的环境文件发送给 Docker 服务。更具体地来说,建立过程中的环境文件指的是在建立映像的时候,所有会用到的 Dockerfile 目录中的数据。
以我们的例子来说,SA-Frontend 文件包括如下文件夹:
sa-frontend: | .dockerignore | Dockerfile | package.json | README.md +---build +---node_modules +---public \---src
但是我们只需要 build 文件夹。上传其他的文件会浪费时间。我们可以通过删除其他目录来节约时间。这就需要用到 .dockerignore。你可能觉得这与 .gitignore 很相似,例如你可以所有想要忽略的目录都添加到 .dockerignore,如下所示:
node_modules src public
这个 .dockerignore 文件应该与 Dockerfile 在同一文件夹中。现在建立映像文件只需要几秒钟了。
让我们继续看看 Java 应用程序。
为 Java 应用程序建立容器映像
你知道吗?你已经差不多学习了所有关于创建容器映像的知识!这就是为什么这一小节这么短的原因。
在 sa-webapp 中打开 Dockerfile,你会看到只有两个新的关键字:
ENV SA_LOGIC_API_URL http://localhost:5000 … EXPOSE 8080
关键字 ENV 在 Docker 容器内声明了环境变量。这可以让我们在启动容器的时候为情感分析 API 提供 URL。
另外,关键字 EXPOSE 提供了一个端口,供我们以后访问。但是等等,我们在 SA-Frontend 的时候没有做这一步,说得很对!这个端口仅用于文档,换句话说就是这个端口是用来向阅读 Dockerfile 的人提供信息的。
你应该已经掌握了创建和推送容器映像。如果遇到任何困难,可以阅读 sa-webapp中的README.md 文件。
为 Python 应用程序创建容器映像
sa-logic 的 Dockerfile 中没有新的关键字。现在你已经是 Docker 达人了。
关于如何建立和推送容器映像,请阅读 sa-logic 目录中的 README.md 文件。
测试容器化的应用程序
你能相信没有测试过的东西吗?我也不信。所以我们来测试一下这些容器吧。
1.运行 sa-logic 容器,并配置监听端口 5050:
docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
2.运行 sa-webapp 容器,并配置监听端口 8080(因为我们改变了 Python 应用监听的端口,所以我们需要重写环境变量 SA_LOGIC_API_URL):
$ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://<container_ip or docker machine ip>:5000' $DOCKER_USER_ID/sentiment-analysis-web-app
3.运行 sa-frontend 容器:
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend
然后就可以了。在浏览器中打开 localhost:80。
请注意:如果你改变 sa-webapp 的端口,或使用 Docker 机器的 IP,那么你需要更新 sa-frontend 中的 App.js,让 analyzeSentence 从新的 IP 或端口获取 URL。然后你需要建立并使用更新后的映像。

智力问答题——为什么使用 Kubernetes?
本节中,我们学习了 Dockerfile,如何使用它创建映像,以及推送映像到 Docker注册目录的命令。另外,我们探讨了如何通过忽略没用的文件,减少需要发送的建立过程中的环境文件。最后我们从容器上运行了应用程序。
接下来,我们介绍为什么要使用 Kubernetes?我们将在下面深入介绍 Kubernetes,这里我想给你留个智力问答题。
如果我们的情感分析网络应用完成得很好,突然间访问量暴涨到每分钟数百万的请求,那么我们的 sa-webapp 和 sa-logic 将面临巨大的负荷压力。请问,我们如何才能扩大容器的规模?
来自:CSDN(微信号:CSDNnews),作者:Rinor Maloku,译者:弯月,责编:郭芮
【三小时学会Kubernetes!(一) 】容器简介及为每个服务创建镜像的更多相关文章
- 三小时学会Kubernetes:容器编排详细指南
三小时学会Kubernetes:容器编排详细指南 如果谁都可以在三个小时内学会Kubernetes,银行为何要为这么简单的东西付一大笔钱? 如果你心存疑虑,我建议你不妨跟着我试一试!在完成本文的学习后 ...
- [转载]三小时学会Kubernetes:容器编排详细指南
原翻译by梁晓勇 原英文:Learn Kubernetes in Under 3 Hours: A Detailed Guide to Orchestrating Containers 我很奇怪,为什 ...
- 【三小时学会Kubernetes!(二) 】Kubernetes 简介及Pod实践
Kubernetes 简介 我向你保证我没有夸大其词,读完本文你会问“为什么我们不称它为 Supernetes?” Kubernetes 是什么? 从容器启动微服务后,我们有一个问题,让我们通过如下问 ...
- 【三小时学会Kubernetes!(零) 】系统结构及相关示例微服务介绍
写在前面 牢牢占据容器技术统治地位的 Kubernetes,其重要性想必不言而喻,我保证本文是最详尽的 Kubernetes 技术文档,从我在后台排版了这么漫长的时间就能看出来.废话不多说 — — 以 ...
- 【三小时学会Kubernetes!(五) 】完成整个架构
完成整个架构 现在我们学习了完成架构的所有必须的资源,因此这一节会非常快.图 22 中灰色的部分是需要做的事情.让我们从底部开始:部署 sa-logic 的部署. 图 22:当前应用程序状态 部署 S ...
- 【三小时学会Kubernetes!(四) 】Deployment实践
Deployment 部署 Kubernetes 部署可以帮助每一个应用程序的生命都保持相同的一点:那就是变化.此外,只有挂掉的应用程序才会一尘不变,否则,新的需求会源源不断地涌现,更多代码会被开发出 ...
- 【三小时学会Kubernetes!(三) 】Service实践
服务Service Kubernetes 服务资源可以作为一组提供相同服务的 Pod 的入口.这个资源肩负发现服务和平衡 Pod 之间负荷的重任,如图 16 所示. 图16:Kubernetes 服务 ...
- 三小时攻克 Kubernetes!
我保证本文是最详尽的 Kubernetes 技术文档,从我在后台排版了这么漫长的时间就能看出来.废话不多说——牢牢占据容器技术统治地位的 Kubernetes,其重要性想必不言而喻. 以下为译文: 为 ...
- Docker(三):利用Kubernetes实现容器的弹性伸缩
一.前言 前两章有的介绍docker与Kubernetes.docker是项目运行的容器,Kubernetes则是随着微服务架构的演变docker容器增多而进行其编排的重要工具.Kubernetes不 ...
随机推荐
- vim的快捷键
vim的快捷键 (〇)3中模式之间的切换 默认在命令模式. i键,从命令模式,进入插入模式. 冒号(:)键,从命令模式,进入末行模式. Esc键,从插入模式.末行模式,进入命令模式. (一)命令模式下 ...
- (2.7)Mysql之SQL基础——表的操作与查看
(2.7)Mysql之SQL基础——表的操作与查看 搜索关键字:mysql表操作,comment注释操作,mysql临时表 0.临时表 create temporary table 1.创建表(在in ...
- thread msg
提取的nordic rf51xx/rf52xx sdk中的线程间消息通信机制,非常简洁 demo.c #include <stdio.h> #include <stdlib.h> ...
- Java中树的存储结构实现
一.树 树与线性表.栈.队列等线性结构不同,树是一种非线性结构. 一棵树只有一个根节点,如果一棵树有了多个根节点,那它已经不再是一棵树了,而是多棵树的集合,也被称为森林. 二.树的父节点表示法 树中除 ...
- 机器学习第7周-炼数成金-支持向量机SVM
支持向量机SVM 原创性(非组合)的具有明显直观几何意义的分类算法,具有较高的准确率源于Vapnik和Chervonenkis关于统计学习的早期工作(1971年),第一篇有关论文由Boser.Guyo ...
- 安卓和ios的区别
安卓不闪退,会卡死,有几率复活,也有可能要强制重启,iOS默认闪退,强制重启的几率小很多. 总的来说,如果要深层次挖掘Android的漏洞就要明白linux内核安全,如果要挖身深层次挖掘iOS的漏洞就 ...
- GIL用C语言解决
执行一个单线程死循环程序,单核cpu占用直接100% while True: pass 执行一个双线程的死循环程序,cpu同样占用100% import threading #子线程死循环 def t ...
- python的数据类型的有序无序
列表有序可变 字典无序不可变 元组不可变 集合无序不可变 数字不可变 字符串不可变
- java Object转换成指定的类型
java Object转换成指定的类型 /** * Object转成指定的类型 * @param obj * @param type * @param <T> * @return */ p ...
- Git-创建和合并分支
本人拜读了廖雪峰老师关于Git的讲述后整理所得 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你 ...