正文
【编者的话】本文主要是从实际的角度描述了Docker以及Kubernetes结合在一起给应用程序部署带来的优势。
你应该会看到很多关于
Kubernetes
和
Docker
的消息,以至于你可能想知道哪个更好。
事实上,没有“更好”一说,因为它们所解决的问题是不一样的。Docker就像飞机,而Kubernetes就像飞机场。就像你不可能说“我应该基于哪个去旅行——飞机或者飞机场?”,Docker和Kubernetes也是一样的,你需要它们两个。
在这篇文章中,我们将描述一个部署场景,讲述容器和编排工具是如何帮助部署的,以及开发人员每天是如何使用它们。看完这篇文章,你将了解它们在一起的方式。
所有事情基于你的本地环境
首先,我们从一个在每次部署中奋斗的人的典型一天开始。然后,我会解释这两种技术如何提供帮助。为了更实际一点,我们虚构一个开发人员John Smith,John是一家为初创公司工作的开发人员,他负责将他的代码部署到实时环境中。
John有两个应用程序:一个运行在
.NET Core
中,另一个运行在Node.js中。 每当新版本的语言、框架或库出来时,他必须进行升级。问题是当他所安装的东西不兼容时,导致app不能正常工作,他需要安装、卸载、更新或删除,直到最终恢复运行。当他完成了这些事情,恢复了运行环境,然后需要在另一个环境再来一次时,问题就更大了,毕竟在短时间内需要记住所有的步骤是非常困难的。
一种解决方案是让他使用虚拟机(VM)。这样,他可以隔离所有依赖项,并避免影响任何现有的应用程序及其依赖项。
虽然这个解决方案可以起到一定的作用,但不能扩展,为什么?因为每当有所改变时,他必须做新的快照。然后他必须以某种方式组织这些虚拟机快照的所有不同版本。他仍然需要将代码中的更改以及任何依赖部署到其他环境中。当然,他也可能在其他环境出现问题,然后修复它。但是如果是在生产环境时,事情就会变得危险。他必须与类生产环境一起工作来缓解部署并降低风险,这很难做到。
即使有自动化,部署也可能过于复杂。也许John甚至不得不花整整一个周末来做部署以及修复各种琐碎的东西。
我们都希望部署可以像按下按钮一样简单,这就是Docker和Kubernetes发挥作用的地方。
使用Docker来打包并发送你的应用程序
那么,Docker究竟是什么?
Docker是一家提供容器平台的公司。容器是一种将软件运行所需要的一切打包并隔离的方法。我说“隔离”的意思是因为容器可以从宿主机分配单独的资源。
这听起来与虚拟机非常相似
,但不同之处在于容器更轻:它们不需要另一个操作系统来运行软件。容器让你变得更加
敏捷
,并构建安全且便携式应用程序,这样可以让你在完成良好的基础架构时节省一些成本。
我知道这听起来像是一本教科书的定义,所以让我们实际看看John生活中的这一天是如何获益的。
假设John决定开始他的容器之旅。他了解到Docker容器与基础镜像一起工作是运行应用程序的基础。基础镜像及其所有依赖关系在名为“Dockerfile”的文件中进行了描述。Dockerfile就像一篇食谱,你在Dockerfile中定义好运行应用程序所需要的基础环境,而想要运行你的应用的任何人只需要通过Dockerfile就能构建一个相同的基础环境。John从.NET Core应用程序开始,Dockerfile看起来像这样:
FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app
Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
Build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "hello.dll"]
正如你所看到的,这就好像你在编程。唯一的区别是你只是定义所有的依赖关系,并声明如何构建和运行应用程序。
John需要将该文件放入源代码的根目录并运行以下命令:
docker build -t dotnetapp .
该命令将创建一个包含编译代码及其所有依赖项的镜像。他只需要做一次“构建”,因为这种方式是让应用程序可移植到任何地方。所以,当他想运行应用程序时,只需要安装Docker,然后运行以下命令:
docker run -d -p 80:80 dotnetapp
该命令将开始在主机的端口80上运行应用程序。无论他在哪里运行此命令都无关紧要,只要端口80没有被使用,应用程序就会工作。