Docker和Kubernetes入门:初学者指南

作者 : IT 大叔 本文共8543个字,预计阅读时间需要22分钟 发布时间: 2020-09-28

随着企业迁移其基础架构和架构以反映云原生,数据驱动的时代,我们已经看到了云计算,容器化和容器编排等主题的兴起。提出这些趋势时,很难忽视一些大牌公司,例如KubernetesDocker,它们缺乏更好的词汇,彻底改变了我们大规模开发和部署软件的方式。

无论您是开发人员,数据科学家,产品经理还是其他人,都有两种工具非常适合您使用:DockerKubernetes

Docker(容器化平台)和Kubernetes(容器编排平台)都是基本的工具,对您的事业发展至关重要。

今天,我们来看看:

  • 什么是Docker和Docker容器,为什么要使用它们?
  • 什么是Kubernetes,为什么要使用它?
  • Docker和Kubernetes之间的区别
  • Docker和Kubernetes:更好的结合
  • Docker入门
  • Kubernetes入门

(如果您已经熟悉Docker和Kubernetes,则可以直接跳到“入门”部分)

什么是Docker,为什么要使用它?

Docker和Kubernetes入门:初学者指南插图

现实生活场景:Docker使在一个项目上工作的不同人员在同一环境中运行应用程序变得非常容易和简单,而Docker提供了自己的OS,因此没有任何依赖性或操作系统问题。在方案之前和之后考虑以下情况:

在Docker之前:开发人员将代码发送到测试人员,但是由于各种依赖性问题,它无法在测试人员的系统上运行,但是在开发人员方面可以正常工作。

Docker之后:由于测试人员和开发人员现在在Docker容器上运行相同的系统,因此他们俩都能够在Docker环境中运行应用程序,而不必像以前那样面对依赖关系问题。

有关Docker和容器的更多信息:

Docker是一个容器化平台,以Docker容器的形式将您的应用程序及其所有依赖项打包在一起。它是一组平台即服务产品,旨在解决日益增长的DevOps趋势带来的许多挑战。Docker使使用容器更容易创建,部署和运行应用程序。

容器使Docker如此吸引现代开发人员。他们在应用程序层创建一个抽象,将您的应用程序和依赖项与运行所需的一切打包在一起,包括:操作系统,应用程序代码,运行时,系统工具,系统库等。

容器占用的空间少于VM(容器映像的大小通常为几十MB),可以处理更多的应用程序,并且需要的VM和操作系统更少。

Docker和Kubernetes入门:初学者指南插图(2)

通过https://www.educba.com/docker-vs-vms/信用

什么是Kubernetes,为什么要使用它?

Docker和Kubernetes入门:初学者指南插图(4)

Kubernetes是功能强大的容器管理工具,可自动执行容器的部署和管理。Kubernetes(k8's)是云计算的下一个大浪潮。

在生产中运行容器时,随着时间的推移,您最终可能会获得数十个甚至数千个容器。这些容器需要部署,管理,连接和更新。如果您要手动执行此操作,则需要整个团队专用于此。

运行容器还不够。您需要能够:

  • 集成和编排这些模块化部件
  • 根据需求放大和缩小
  • 使它们容错
  • 提供跨集群的通信

您可能会问:容器不是应该做所有的事情吗?答案是容器只是解决难题的一个小层次。使用容器顶部的工具(如Kubernetes)可以获得真正的好处。这些工具今天被称为容器调度程序。

Docker和Kubernetes之间的区别

Docker和Kubernetes入门:初学者指南插图(6)

首先,我们说这是两种旨在一起工作的不同技术。它们不是竞争性工具,因此不应有任何混淆:“我应该在一个之上使用另一个吗?” 或“哪个更好?”。它们在DevOps中都有各自的作用,并且经常一起使用。

话虽如此,这是区别:

Docker用于将您的应用程序隔离到容器中。它用于打包和运送您的应用程序。

另一方面,Kubernetes是一个容器调度程序。它用于部署和扩展应用程序。

Docker和Kubernetes:更好的结合

Docker和Kubernetes入门:初学者指南插图(8)

两种技术被设计为可以协同工作,而当它们实现时,这就是DevOps的梦想。如本文前面所述,仅在生产中运行容器是不够的,需要对其进行监管,Kubernetes提供了一些出色的功能,这些功能使使用容器变得更加容易。Kubernetes提供了诸如自动缩放,运行状况检查和负载平衡之类的功能,这对于管理容器的生命周期至关重要。

将您的应用程序容器化很重要,但不要忘记该过程的下一步。您将如何在生产中大规模运行容器?如果您回答了Kubernetes,那是正确的。

通过向专家Arnaud Weil和Viktor Farcic学习,开始使用这两个工具。

Docker入门

基本Docker概念

您需要学习一些基本概念,它们是:

  • 货柜
  • 图片
  • 登记处

货柜

容器是您最终要在Docker中运行和托管的容器。您可以将其视为隔离的计算机,也可以将其视为虚拟机

从概念上讲,一个容器在与其他容器甚至主机操作系统隔离的Docker主机内部运行。除非您明确声明可以看到,否则它无法看到其他容器,物理存储或获得传入连接。它包含需要运行的所有内容:操作系统,程序包,运行时,文件,环境变量,标准输入和输出。

您的典型Docker服务器看起来像这样-一个包含许多容器的主机:

Docker和Kubernetes入门:初学者指南插图(10)

上面的架构中有两个app2容器是正常的;服务器托管发行版和测试版本时,通常是这种情况。这意味着您可以在同一服务器上托管两个版本。

图片

任何运行的容器都是从映像创建的。图像描述了创建容器所需的一切;这是容器的模板。您可以根据需要从单个映像创建任意数量的容器。整个图片如下所示:

Docker和Kubernetes入门:初学者指南插图(12)

登记处

图像存储在注册表中。在上面的示例中,app2映像用于创建两个容器。每个容器都有自己的生命,并且它们都有一个共同的根:它们来自注册表的映像。

设置和运行Docker

根据需求选择哪种Docker产品

在运行托管关键应用程序的容器的生产环境中,您宁愿让您喜欢的管理员安装Docker Enterprise。

但是,在您的开发机器或连续集成构建机器上,您可以根据机器类型使用免费的Docker Engine社区或Docker桌面。简而言之:

Docker和Kubernetes入门:初学者指南插图(14)

你好世界测试

无论您安装的是哪个版本,都可以通过在命令行中运行以下命令(Linux上的终端或Windows上的PowerShell)来检查安装:

docker run hello-world

它应提取图像并显示以以下内容开头的输出文本:

Hello from Docker!
This message shows that your installation appears to be working correctly.

安装Docker-Windows,Linux,Mac

在Windows 10上设置Docker

Docker Desktop需要基于Windows 10的Professional或Enterprise 64位版本的Windows 10,因为它基于Hyper-V。如果您拥有不满足要求的Windows桌面版本,则可以使用基于VirtualBox 的旧Docker工具箱

在安装Docker Desktop之前,重要的是:

  • 启用Hyper-V
  • 在BIOS中启用硬件虚拟化
  • 然后,按照此链接并按照那里的说明进行操作。

在安装过程中,系统将提示您使用Windows还是Linux容器。我建议使用Linux容器,因为:

  • 您以后可以随时改变主意,只需右键单击工具栏中的Docker图标,然后选择“切换到Windows容器...”。
  • 到目前为止,大多数容器映像都基于Linux

在Linux上设置Docker

还有其他可用的Docker软件包,您可以根据您的版本简单地执行以下步骤:

无论你的Linux的味道,也有共同的安装后的步骤在这里。请确保您仔细阅读它们。如果您无法成功运行hello-world测试,请仔细检查它们。

在Mac上设置Docker

Docker Desktop需要Mac OS Sierra 10.12或更高版本。如果您使用的是旧版macOS,则可以使用基于VirtualBox 的旧版Docker Toolbox

创建您的第一个Docker映像

如前所述,容器是根据图像创建的。让我们探索如何创建自己的。在我们的映像内部,我们可以填充程序及其依赖项,以便可以从这些映像创建多个容器并从此幸福地生活。

创建一个简单的Docker映像

Docker和Kubernetes入门:初学者指南插图(16)

Docker文件

使用docker build命令和Dockerfile文件创建Docker映像。Dockerfile文件包含有关如何构建映像的说明。

Dockerfile文件可以具有任何名称。将其命名为Dockerfile可使其他人在项目中看到该文件时更容易理解其目的。这也意味着您在使用docker build命令时无需声明文件名。

现在,让我们为容器创建一个基本映像,该映像在运行时显示“ hello world”消息。

为此,创建一个名为Dockerfile的文件,该文件描述如何构建映像。Dockerfile文件始终以FROM指令开头,因为每个映像都基于另一个基本映像。这是一项强大的功能,因为它使您可以扩展可能已经很复杂的图像。

因为我只需要一个简单的文本输出,所以我可以使用Debian Linux映像。这是我的Dockerfile文件:

FROM debian:8

这还不够。尽管我确实获得了Debian Linux的支持,但是我没有运行任何可能显示“ hello world”的命令。这可以通过使用CMD指令来实现。该CMD指令指定使用映像创建容器时运行哪个可执行文件,并提供可选参数。

这是一个经过改进的Dockerfile文件,该文件创建了一个基于Debian Linux的映像,并指示它在容器生成时向我们的用户致意:

FROM debian:8
 
CMD ["echo", 'Hello world']

请注意,要运行的程序及其参数均作为JSON字符串数组提供。为了从我的Dockerfile文件创建映像,我需要运行docker build命令。为此,我在终端中的Dockerfile文件所在的文件夹中键入以下命令:

docker build -t hello .

-t开关用于所需图像的前面。可以创建没有名称的映像,它会具有自动生成的唯一ID,因此它是docker build命令上的可选参数。

注意上面命令末尾的点。它指定将哪个路径用作构建上下文(稍后会详细介绍),以及期望在何处找到Dockerfile。如果我的Dockerfile有其他名称或居住在其他地方,我可以添加一个-f开关以提供文件路径。

docker build命令刚刚创建了一个名为hello的映像。该图像存储在本地计算机上,您可以像运行其他任何图像一样运行它:

docker run --rm hello

从这里开始,您可能想要发布图像,以供其他人基于它运行容器。稍后我们将看到如何执行此操作,但现在让我们集中精力创建图像。

为了使事情变得清晰起来,这是完成的操作:

  • 创建一个图像
  • 创建一个名为Dockerfile的文件
  • 跑一个docker build命令
  • 从创建的图像中跑出一个容器

让我们扩展一下这意味着什么;运行容器实际上相当于启动一台新计算机,然后将其丢弃。为了打印“ Hello world”消息,我们实质上是买了一台新计算机,让它执行echo命令,然后将其丢弃。Docker使抛弃式计算变得便宜。当然,这样做太简单了,但是即使在我们内部安装框架或在容器内移动文件时也是如此。这是一个了不起的功能。当您了解如何轻松创建和废弃隔离的虚拟计算机时,大多数Docker功能将发挥作用。

发布您的Docker映像

Docker Registry本质上是一个映像存储,提供以下功能:

  • 能够存储各种图像。
  • 能够存储同一图像的各种标签。
  • HTTP API,其允许从它们,或拉图像产生到运行从这些图像的容器的机器的机器推图像。
  • TLS-secured 连接到API,以避免中间人攻击。

有许多可用的注册表。您可以使用公共可用的Docker Hub或使用自己的私有注册表。无论如何,标记和发布图像的过程对于每个注册表都是相同的。

无论选择哪个注册表,发布映像都是一个三步过程:

  1. 使用适当的前缀名称或标记(docker标记)适当地构建现有映像。
  2. 登录到注册表(docker登录)。
  3. 将映像推送到注册表(docker push)。
Docker和Kubernetes入门:初学者指南插图(18)

Kubernetes入门

Kubernetes基本概念

豆荚

Pod是Kubernetes中应用程序的最低单位。现在,在继续之前,我们需要弄清楚一件事-那是一个pod,不等于Docker世界中的一个容器。容器可以由多个容器组成。如果您来自纯粹的Docker背景,这可能很难使您头脑清醒。如果一个容器可以有多个容器,它是如何工作的?我们需要注意一些限制。吊舱具有以下功能:

  • 一个IP地址
  • 共享本地主机
  • 共享的IPC空间
  • 共享的网络端口范围
  • 共享卷

容器中的容器通过本地主机相互交谈,而容器间的通信是通过服务进行的。

副本集

现在在吊舱部分中,我们发现吊舱是凡人,如果吊舱死亡,那就是吊舱的尽头。如果要运行同一吊舱的三个版本以提高可用性怎么办?

输入复制控制器。

复制控制器的主要职责是防止发生故障,它位于pod资源类型之上并对其进行控制。让我们来看一个例子。我要部署4个pod x,这一次我将创建一个副本集。副本集具有需要运行的已定义数量的Pod,在这种情况下为4。如果其中一个Pod发生故障或死亡,则复制控制器将为我启动一个新Pod,然后再次运行4个Pod x 。因此,此功能可解决我们前面提到的豆荚致命问题。

服务

如果我们要与Pod保持连接,则需要创建服务。在Kubernetes中,服务是一组Pod上的网络抽象。这使得流量可以针对故障进行负载平衡。服务允许Kubernetes为Pod设置单个DNS记录。如前所述,每个Pod都有一个单独的IP地址。

部署

部署资源类型位于副本集上方,并且可以对其进行操作。我们为什么要操纵副本集?副本集全有或全无。如果需要升级,则需要替换副本集。此操作将导致应用程序停机。

Kubernetes的主要好处之一就是高可用性。部署为我们提供了无需停机即可进行升级的功能。就像在副本集中所做的那样,您可以指定要运行的Pod数。触发更新后,部署将在Pod上进行滚动升级,同时确保在Pod上升级成功,然后再移至下一个。

切记: 部署控制副本集,副本集控制吊舱;这意味着,当您使用部署资源类型时,您不会忘记您仍然需要访问它的服务。

Kubernetes入门和在本地部署集群

安装kubectl

Kubernetes的命令行工具kubectl用于管理集群及其内部运行的应用程序。以下是在Windows,Linux和Mac上安装它的方法:

视窗

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/windows/amd64/kubectl.exe

的Linux

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

苹果电脑

curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/darwin/amd64/kubectl
chmod +./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

验证您的设置

kubectl version --output=yaml

安装Minikube

Minikube支持多种虚拟化技术。我们将使用VirtualBox,因为它是所有操作系统中唯一支持的虚拟化。请记住,要使VirtualBox或HyperV正常工作,必须在BIOS中启用虚拟化。大多数笔记本电脑应默认启用它。

视窗

最后,如果您是Windows用户,则不会获得命令。而是从minikube-windows-amd64.exe文件下载最新版本,将其重命名为minikube.exe,然后将其添加到您的路径中。

的Linux

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

苹果电脑

brew cask install minikube

在Minikube上创建本地集群

Minikube使创建集群变得尽可能容易。您需要做的就是执行一个命令。Minikube将在本地启动虚拟机并将必要的Kubernetes组件部署到其中。将通过单个名为localkube的二进制文件为VM配置Docker和Kubernetes。

minikube start --vm-driver=virtualbox

当我们执行Minikube start命令时,它基于Minikube映像创建了一个新的VM。该图像包含一些二进制文件。它同时具有Dockerrkt容器引擎以及localkube库。

rkt是为现代生产云原生环境开发的应用程序容器引擎。

localkube库包含运行Kubernetes所需的所有组件。目前,重要的是localkube提供了在本地运行Kubernetes集群所需的一切。

Docker和Kubernetes入门:初学者指南插图(20)

请记住,这是仅在我们的计算机上本地运行的单节点群集。话虽如此,它仍然是在本地“玩” Kubernetes并了解该工具的最简单方法。

通过声明性语法创建容器

首先使用Minikube创建一个本地集群,如下所示:

minikube start --vm-driver=virtualbox
kubectl get nodes

让我们通过访问git存储库中的db.yml文件来查看一个简单的Pod 。现在,让我们创建db.yml文件中定义的Pod。

kubectl create -f pod/db.yml

让我们看一下集群中的Pods。

kubectl get pods

输出如下,您可以看到我们的pod已启动并正在运行。

NAME READY STATUS  RESTARTS AGE
db   1/1   Running 0        11s

通过声明性语法创建服务

创建服务:

kubectl create -f svc/go-demo-2-svc.yml
kubectl get -f svc/go-demo-2-svc.yml

我们创建了服务,并从API服务器检索了其信息。后一个命令的输出如下。

NAME      TYPE     CLUSTER-IP EXTERNAL-IP PORT(S)         AGE
go-demo-2 NodePort 10.0.0.129 <none>      28017:30001/TCP 10m

现在该服务正在运行,您可以通过尝试访问MongoDB UI再次检查它是否按预期工作。

open "http://$IP:30001"

部署新版本

再次从创建集群开始:

cd k8s-specs
git pull
minikube start --vm-driver=virtualbox
kubectl config current-context

让我们创建部署。

kubectl create \
    -f deploy/go-demo-2-db.yml \
    --record
kubectl get -f deploy/go-demo-2-db.yml

后一个命令的输出如下。

NAME           READY   UP-TO-DATE   AVAILABLE   AGE
go-demo-2-db   0/1     1            0           4s

在此材料上扩展

这总结了我们对DevOps,Docker和Kubernetes的介绍。虽然这些材料可以帮助您入门,但是还有很多事情需要探索,例如在Kubernetes中使用Ingress,运行生产级集群的实际需求以及如何在常见的开发配置文件(例如Python,.NET)中使用Docker。核心,Java等)。两种技术都将保留下来,并正在成为市场上最抢手的技术。现在掌握它可以帮助您开发更好的软件,提升您的职业生涯,并在人群中脱颖而出。

免责声明:
1. 本站资源转自互联网,源码资源分享仅供交流学习,下载后切勿用于商业用途,否则开发者追究责任与本站无关!
2. 本站使用「署名 4.0 国际」创作协议,可自由转载、引用,但需署名原版权作者且注明文章出处
3. 未登录无法下载,登录使用金币下载所有资源。
IT小站 » Docker和Kubernetes入门:初学者指南

常见问题FAQ

没有金币/金币不足 怎么办?
本站已开通每日签到送金币,每日签到赠送五枚金币,金币可累积。
所有资源普通会员都能下载吗?
本站所有资源普通会员都可以下载,需要消耗金币下载的白金会员资源,通过每日签到,即可获取免费金币,金币可累积使用。

发表评论