容器化的概念很早就有了。2013 年 Docker 引擎 的出现使应用步伐容器化变得更加容易。
根据 Stack Overflow 开发者观察-2020,Docker 是开发者 #1 最想要的平台、#2 最喜好的平台,以及 #3 最盛行的平台。
只管 Docker 功能强大,但上手确并不容易。因此,本文将先容从根本知识到更高层次容器化的的全部内容。读完本文之后,你应该可以或许:
- 容器化(险些)任何应用步伐
- 将自界说 Docker 镜像上传到在线堆栈
- 使用 Docker Compose 处置惩罚多个容器
条件
- 熟悉 Linux 终端操纵
- 熟悉 JavaScript(稍后的的演示项目用到了 JavaScript)
容器化和 Docker 简介
摘自 IBM,
容器化意味着封装或打包软件代码及其全部依赖项,以便它可以在任何根本架构上同一且同等地运行。
换句话说,容器化可以将软件及其全部依赖项打包在一个自包罗的软件包中,如许就可以省略贫苦的设置,直接运行。
举一个现实生存的场景。假设你已经开发了一个很棒的图书管理应用步伐,该应用步伐可以存储全部图书的信息,还可以为别人提供图书借阅服务。
如果列出依赖项,如下所示:
- Node.js
- Express.js
- SQLite3
理论上应该是如许。但是现实上还要搞定其他一些事变。 Node.js 使用了 node-gyp 构建工具来构建原生加载项。根据 官方存储库 中的 安装阐明,此构建工具必要 Python 2 或 3 和相应的的 C/C ++ 编译器工具链。
思量到全部这些因素,终极的依赖关系列表如下:
- Node.js
- Express.js
- SQLite3
- Python 2 or 3
- C/C++ tool-chain
无论使用什么平台,安装 Python 2 或 3 都非常简单。在 Linux 上,设置 C/C ++ 工具链也非常容易,但是在 Windows 和 Mac 上,这是一项繁重的工作。
在 Windows 上,C++ 构建工具包有数 GB 之大,安装必要耗费相当长的时间。在 Mac 上,可以安装巨大的 Xcode 应用步伐,也可以安装小巧的 Xcode 下令行工具 包。
不管安装了哪一种,它都大概会在 OS 更新时停止。现实上,该问题非常广泛,以致连官方堆栈都专门提供了 macOS Catalina 的安装阐明。
这里假设你已包办理了设置依赖项的全部贫苦,而且已经预备好开始。这是否意味着如今开始就一帆风顺了?固然不是。
如果你使用 Linux 而同事使用 Windows 该怎么办?如今,必须思量如那里理这两个差别的操纵体系不同等的路径,或诸如 nginx 之类的盛行技能在 Windows 上未得到很好的优化的毕竟,以及诸如 Redis 之类的某些技能以致都不是针对 Windows 预先构建的。
纵然你完成了整个开发,如果负责管理服务器的职员摆设流程搞错了,该怎么办?
全部这些问题都可以通过以下方式办理:
- 在与终极摆设环境匹配的隔离环境(称为容器)中开发和运行应用步伐。
- 将你的应用步伐及其全部依赖项和须要的摆设设置放入一个文件(称为镜像)中。
- 并通过具有恰当授权的任何人都可以访问的中心服务器(称为堆栈)共享该镜像。
然后,你的同事就可以从堆栈中下载镜像,可以在没有平台辩论的隔离环境中运行应用,以致可以直接在服务器上进行摆设,由于该镜像也可以进行生产环境设置。
这就是容器化背后的想法:将应用步伐放在一个独立的步伐包中,使其在各种环境中都可移植且可回溯。
如今的问题是:Docker 在这里扮演什么脚色?
正如我之前讲的,容器化是一种将齐备同一放入盒子中来办理软件开发过程中的问题的头脑。
这个想法有很多实现。Docker 就是如许的实现。这是一个开放源代码的容器化平台,可让你对应用步伐进行容器化,使用公共或私有堆栈共享它们,也可以编排它们。
目前,Docker 并不是市场上唯一的容器化工具,却是最受欢迎的容器化工具。我喜好的另一个容器化引擎是 Red Hat 开发的 Podman。其他工具,比方 Google 的 Kaniko,CoreOS 的 rkt 都很棒,但和 Docker 还是有差距。
别的,如果你想相识容器的汗青,可以阅读 A Brief History of Containers: From the 1970s Till Now,它形貌了该技能的很多紧张节点。
怎样安装 Docker
Docker 的安装因使用的操纵体系而异。但这整个过程都非常简单。
Docker可在 Mac、Windows 和 Linux 这三个紧张平台上完善运行。在这三者中,在 Mac 上的安装过程是最简单的,因此我们从这里开始。
怎样在 macOS 里安装 Docker
在 Mac 上,要做的就是跳转到官方的下载页面,然后单击Download for Mac(stable)按钮。
你会看到一个通例的 Apple Disk Image 文件,在该文件的内有 Docker 应用步伐。所要做的就是将文件拖放到 Applications 目录中。
只需双击应用步伐图标即可启动 Docker。应用步伐启动后,将看到 Docker 图标出如今菜单栏上。
如今,打开终端并实验 docker --version 和 docker-compose --version 以验证是否安装乐成。
怎样在 Windows 上安装 Docker
在 Windows 上,步调险些雷同,固然还必要实验一些额外的操纵。安装步调如下:
- 跳转到此站点,然后按照阐明在 Windows 10 上安装 WSL2。
- 然后跳转到官方下载页面 并单击 Download for Windows(stable) 按钮。
- 双击下载的安装步伐,然后使用默认设置进行安装。
安装完成后,从开始菜单或桌面启动 Docker Desktop。Docker 图标应显示在使命栏上。
如今,打开 Ubuntu 或从 Microsoft Store 安装的任何发行版。实验 docker --version 和 docker-compose --version 下令以确保安装乐成。
也可以从通例下令提示符或 PowerShell 访问 Docker,只是我更喜好使用 WSL2。
怎样在 Linux 上安装 Docker
在 Linux 上安装 Docker 的过程有所差别,详细操纵取决于你所使用的发行版,它们之间差别大概更大。但老实说,安装与其他两个平台一样容易(如果不能算更容易的话)。
Windows 或 Mac 上的 Docker Desktop 软件包是一系列工具的聚集,比方Docker Engine、Docker Compose、Docker Dashboard、Kubernetes 和其他一些好东西。
但是,在 Linux 上,没有得到如许的捆绑包。可以手动安装所需的全部须要工具。 差别发行版的安装过程如下:
- 如果你使用的是 Ubuntu,则可以依照官方文档中的 在 Ubuntu 上安装 Docker 引擎 部分。
- 对于其他发行版,官方文档中提供了 差别发行版的安装指南。
- 在 Debian上安装 Docker Engine
- 在 Fedora 上安装 Docker Engine
- 在 CentOS 上安装 Docker Engine
- 如果你使用的发行版未在文档中列出,则可以参考从二进制文件安装 Docker 引擎指南。
- 无论参考什么步伐,都必须完成一些非常紧张的 Linux 的安装后续步调。
- 完成 docker 安装后,必须安装另一个名为 Docker Compose 的工具。 可以参考官方文档中的 Install Docker Compose 指南。
安装完成后,打开终端并实验 docker --version 和 docker-compose --version 以确保安装乐成。
只管无论使用哪个平台,Docker 的性能都很好,但与其他平台相比,我更喜好 Linux。在本文中,我将使用Ubuntu 20.10 大概 Fedora 33。
一开始就必要分析的另一件事是,在本文中,我不会使用任何 GUI 工具操纵 Docker。
我在各个平台用过很多不错的 GUI 工具,但是先容常见的 docker 下令是本文的紧张目标之一。
初识 Docker - 先容 Docker 根本知识
已经在盘算机上启动并运行了 Docker,如今该运行第一个容器了。打开终端并实验以下下令:
docker run hello-world# Unable to find image 'hello-world:latest' locally# latest: Pulling from library/hello-world# 0e03bdcc26d7: Pull complete # Digest: sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bc# Status: Downloaded newer image for hello-world:latest# # Hello from Docker!# This message shows that your installation appears to be working correctly.# # To generate this message, Docker took the following steps:# 1. The Docker client contacted the Docker daemon.# 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.# (amd64)# 3. The Docker daemon created a new container from that image which runs the# executable that produces the output you are currently reading.# 4. The Docker daemon streamed that output to the Docker client, which sent it# to your terminal.## To try something more ambitious, you can run an Ubuntu container with:# $ docker run -it ubuntu bash# # Share images, automate workflows, and more with a free Docker ID:# https://hub.docker.com/## For more examples and ideas, visit:# https://docs.docker.com/get-started/hello-world 镜像是使用 Docker 进行最小化容器化的一个示例。它有一个从 hello.c 文件编译的步伐,负责打印出终端看到的消息。
如今,在终端中,可以使用 docker ps -a 下令检察当前正在运行或已往运行的全部容器:
docker ps -a# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES# 128ec8ceab71 hello-world "/hello" 14 seconds ago Exited (0) 13 seconds ago exciting_chebyshev在输出中,使用 hello-world 镜像运行了名为 exciting_chebyshev 的容器,其容器标识为 128ec8ceab71。它已经在 Exited (0) 13 seconds ago,此中 (0) 退出代码表现在容器运行时未发生任何错误。
如今,为了相识背后发生的事变,必须熟悉 Docker 体系布局和三个非常根本的容器化概念,如下所示:
我已经按字母序次列出了这三个概念,而且将从列表中的第一个开始先容。
什么是容器?
在容器化天下中,没有什么比容器的概念更根本的了。
官方 Docker resources 网站说 -
容器是应用步伐层的抽象,可以将代码和依赖项打包在一起。容器不虚拟化整个物理机,仅虚拟化主机操纵体系。
可以以为容器是下一代虚拟机。
就像虚拟机一样,容器是与主机体系是相互之间完全隔离的环境。它也比传统虚拟机轻量得多,因此可以同时运行大量容器,而不会影响主机体系的性能。
容器和虚拟机现实上是虚拟化物理硬件的差别方法。两者之间的紧张区别是虚拟化方式。
虚拟机通常由称为虚拟机监控器的步伐创建和管理,比方 Oracle VM VirtualBox,VMware Workstation,KVM,Microsoft Hyper-V 等等。 该虚拟机监控步伐通常位于主机操纵体系和虚拟机之间,充当通讯介质。
每个虚拟机都有自己的 guest 操纵体系,该操纵体系与主机操纵体系一样斲丧资源。
在虚拟机内部运行的应用步伐与 guest 操纵体系进行通讯,该 guest 操纵体系在与虚拟机监控器进行通讯,后者随后又与主机操纵体系进行通讯,以将须要的资源从物理根本办法分配给正在运行的应用步伐。
虚拟机内部运行的应用步伐与物理根本办法之间存在很长的通讯链。在虚拟机内部运行的应用步伐大概只拥有少量资源,由于 guest 操纵体系会占用很大的开销。
与虚拟机差别,容器以更智能的方式完成虚拟化工作。在容器内部没有完备的 guest 操纵体系,它只是通过容器运行时使用主机操纵体系,同时保持隔离 – 就像传统的虚拟机一样。
容器运行时(即 Docker)位于容器和主机操纵体系之间,而不是虚拟机监控器中。容器与容器运行时进行通讯,容器运行时再与主机操纵体系进行通讯,以从物理根本办法中获取须要的资源。
由于消除了整个主机操纵体系层,因此与传统的虚拟机相比,容器的更轻量,资源占用更少。
为了阐明这一点,请看下面的代码片断:
uname -a# Linux alpha-centauri 5.8.0-22-generic #23-Ubuntu SMP Fri Oct 9 00:34:40 UTC 2020 x86_64 x86_64 x86_64 GNU/Linuxdocker run alpine uname -a# Linux f08dbbe9199b 5.8.0-22-generic #23-Ubuntu SMP Fri Oct 9 00:34:40 UTC 2020 x86_64 Linux在上面的代码片断中,在主机操纵体系上实验了 uname -a 下令以打印出内核详细信息。然后在下一行,我在运行 Alpine Linux 的容器内实验了雷同的下令。
从输出中可以看到,该容器确实正在使用主机操纵体系中的内核。这证明确容器虚拟化主机操纵体系而不是拥有自己的操纵体系这一点。
如果你使用的是 Windows 盘算机,则会发现全部容器都使用 WSL2 内核。发生这种环境是由于 WSL2 充当了 Windows 上 Docker 的后端。在 macOS 上,默认后端是在 HyperKit 虚拟机管理步伐上运行的 VM。
什么是 Docker 镜像?
镜像是分层的自包罗文件,充当创建容器的模板。它们就像容器的冻结只读副本。 镜像可以通过堆栈进行共享。
已往,差别的容器引擎具有差别的镜像格式。但是厥后,开放式容器筹划(OCI)界说了容器镜像的标准规范,该规范被紧张的容器化引擎所依照。这意味着使用 Docker 构建的映像可以与 Podman 等其他运行时一起使用,而不会有兼容性问题。
容器只是处于运行状态的镜像。当从互联网上获取镜像并使用该镜像运行容器时,现实上是在先前的只读层之上创建了另一个临时可写层。
在本文的后续部分中,这一概念将变得更加清晰。但就目前而言,请记住,镜像是分层只读文件,此中保存着应用步伐所需的状态。
什么是堆栈?
已经相识了这个困难的两个非常紧张的部分,即 Containers 和 Images 。 末了一个是 Registry。
镜像堆栈是一个会合式的位置,可以在此中上传镜像,也可以下载其他人创建的镜像。 Docker Hub 是 Docker 的默认公共堆栈。另一个非常盛行的镜像堆栈是 Red Hat 的 Quay。
在本文中,我将使用 Docker Hub 作为首选堆栈。
可以免费在 Docker Hub 上共享恣意数量标公共镜像。供天下各地的人们下载免费使用。
除了 Docker Hub 或 Quay,还可以创建自己的镜像堆栈来托管私有镜像。盘算机中还运行着一个本地堆栈,该堆栈缓存从远程堆栈提取的镜像。
Docker 架构概述
既然已经熟悉了有关容器化和 Docker 的大多数根本概念,那么如今是时候相识 Docker 作为软件的架构了。
该引擎包罗三个紧张组件:
- Docker 守卫步伐: 守卫步伐(dockerd)是一个始终在背景运行并等候来自客户端的下令的进程。守卫步伐可以或许管理各种 Docker 对象。
- Docker 客户端: 客户端(docker)是一个下令行界面步伐,紧张负责传输用户发出的下令。
- REST API: REST API 充当守卫步伐和客户端之间的桥梁。使用客户端发出的任何下令都将通过 API 转达,终极到达守卫步伐。
根据官方 文档,
“ Docker 使用客户端-服务器体系布局。Docker client 与 Docker daemon 对话,daemon 繁重地构建、运行和分发 Docker 容器”。
作为用户,通常将使用客户端组件实验下令。然后,客户端使用 REST API 来访问长期运行的守卫步伐并完成工作。
全景图
好吧,说的够多了。 如今是时候相识刚刚学习的全部这些知识怎样调和地工作了。在深入表明运行 docker run hello-world 下令时现实发生的环境之前,看一下下面的图片:
该图像是在官方文档中找到的图像的略微修改版本。 实验下令时发生的变乱如下: |