JavaRush /Java 博客 /Random-ZH /初识Docker
Viacheslav
第 3 级

初识Docker

已在 Random-ZH 群组中发布
容器化是实践中经常使用的一种机制。例如,当你在猎头上搜索时,截至今天你会发现 477 个职位空缺提到了 Docker。因此,熟悉一下它是什么并不是一个坏主意。我希望这篇简短的评论将有助于形成第一个想法。好吧,他会用额外的材料来支持它,比如 Udemy 上的课程。 Docker 初识 - 1

介绍

在这篇简短的评论中,我想谈谈容器化等主题。您需要首先了解容器化实际上是什么。根据维基百科,“容器化”是操作系统级(即不是硬件)虚拟化,其中操作系统内核维护多个独立的用户空间实例,而不是仅一个。“用户空间”是操作系统为用户程序保留的虚拟内存地址空间。从用户的角度来看,用户空间实例(通常称为容器)与单个操作系统实例完全相同。内核保证容器完全隔离,不同容器的程序不会互相影响。原来容器化就是软件虚拟化,即操作系统层面的虚拟化,由操作系统内核负责。这种方法的特征之一是所有容器都使用与主机操作系统(即容器所在的操作系统)相同的通用内核。这使您可以摆脱模拟虚拟硬件和启动成熟的操作系统实例的开销。可以说,这就是“轻量级”虚拟化。内核是操作系统的核心部分,它为应用程序提供对计算机资源(例如处理器时间、内存、外部硬件以及外部输入和输出设备)的协调访问。内核通常还提供文件系统和网络协议服务。一般来说,这是整个系统的核心。有关其他信息,查看材料“有关容器的一般信息”可能会有所帮助。还需要多说几句话来使介绍完整。我们现在知道操作系统有内核。它为用户空间实例提供隔离。在这种情况下,您可能会遇到术语“ cgroups ”。这是允许您实现此目的的 Linux 内核机制的名称。因此,可以说容器化之路是从Linux系统开始的。不过,从Windows 10开始,对容器化的支持也出现了。要使用虚拟化,您需要在计算机的 BIOS 中配置虚拟化支持。如何执行此操作取决于计算机。例如,它可能看起来像这样:
Docker 初识 - 2
在 Windows 上,您可以通过不同的方式进行检查。例如,您可以从 Microsoft 网站下载一个特殊的实用程序:硬件辅助虚拟化检测工具。好吧,值得一提的是另一个重要的概念——Hypervisor。Hypervisor是一个虚拟机监视器,是一个确保同一台计算机上多个操作系统并行执行的程序。虚拟机管理程序确保操作系统彼此隔离并在运行的操作系统之间共享资源。Oracle VirtualBox就是这样的虚拟机管理程序之一。
Docker 初识 - 3

码头工人

那么,什么是虚拟化就很清楚了。但如何使用呢?Docker 在这里为我们提供了帮助。Docker 是用于在容器化环境中自动部署和管理应用程序的软件。值得一提的是,Docker 以 Docker Enginge 这样的概念为代表。您应该从 Docker 官方网站和“ Docker 概述”部分开始。
Docker 初识 - 4
文档说 docker 包括:
  • Docker服务器称为Docker Daemon进程(dockerd)。
  • 命令行界面,也称为 CLI (docker)。
  • 一个 REST API,描述程序如何与守护程序“对话”并告诉它要做什么。
在我们进一步深入之前,让我们先安装 docker,即安装 docker 守护进程。Docker 网站有安装“ Docker for Windows ”的说明。有趣的是,Docker 有自己的系统要求。如果您像我一样拥有旧的 Windows,例如 Windows 7,那么您需要使用 Docker Toolbox。
Docker 初识 - 5

Docker工具箱

在不满足系统要求的旧机器上安装Docker。该网站是这样说的:“旧版桌面解决方案”。我们去“ Docker Toolbox ”页面下载它。该套装重约 211 兆字节。我们将把它安装为默认值,也就是说,我们将简单地温顺地同意一切,而不重新排列标志。安装后,我们将检查一切是否正常。未来,我们的战场将是命令行。我建议不要使用Windows命令行,因为它可能会出现不明显的问题。最好使用 bash shell。在Windows上,最推荐的获取方式是安装git版本控制系统,它仍然会派上用场。因为与它“捆绑”的将是我们需要的 bash。对于本次审查,我将使用 git bash。您还可以使用CYGWIN安装 bash 。让我们启动 bash 或 git bash。让我们确保我们已经安装了 Docker Machine,也称为 Docker Machine:docker-machine -version 这个 Docker Machine 是什么? Docker Machine是一个用于管理 docker 化主机(这些主机是安装了 Docker Engine 的主机)的实用程序。如果我们在安装 Docket Toolbox 后立即使用命令查看 docker 机器docker-machine ls,我们将看到一个空列表:
Docker 初识 - 6
让我们创建一台新机器。为此,我们需要运行create命令::docker-machine create -- driver virtualbox javarush我们将看到docker机器创建日志:
Docker 初次介绍 - 7
我们感兴趣的是以下内容。Boot2Docker是什么?这是一个用于运行 Docker 引擎的简约 Linux 发行版(我们知道 Docker 的工作得益于 Linux 虚拟化工具,而在 Windows 中,必要的机制仅从 Windows 10 开始出现)。该发行版基于“ Tiny Core Linux ”发行版。还提到了 VirtualBox VM。这是因为我们指定了--driver virtualbox. 在 VirtualBox 中从 Boot2Docker 映像创建了一个新的虚拟机。创建完成后,我们可以启动VirtualBox(因为VirtualBox是随Docker Toolbox一起安装的)并查看为docker机器创建的虚拟机:
Docker 初识 - 8
创建完成后,会提示我们运行命令“ docker-machine env ”来获取连接docker机器需要配置的环境变量:
Docker 初识 - 9
使用 docker-machine 执行此命令后,我们连接到远程 docker 化主机(在本例中是 Virtual Box 上托管的虚拟主机),并且可以在本地执行 docker 命令,就像在远程主机上执行它们一样。要检查,我们可以运行“ docker info ”命令。如果未建立与 docker 机器的连接,我们将收到错误。如果一切顺利,则会显示有关 docker 机器上 docker 的信息。现在是时候了解 Docker 一般如何工作以及如何使用它了。
Docker 初识 - 10

Docker容器

所以我们有码头工人。这个 docker 到底是什么?Docker 文档和“入门”部分将帮助我们理解这一点。本节的引言部分介绍了 Docker概念。它指出,Docker 是一个用于在容器中开发、调试和运行应用程序的平台。所以说,Docker最主要的是容器。即使你看docker的标志,它也是一头背着容器的鲸鱼。但什么是容器呢?接下来的“图像和容器”部分表示容器是图像的运行实例。Image 是一个“包”,包含应用程序所需的一切(代码、环境、库、设置等)。现在我们自己来尝试一下。Docker 网站有一个名为“ Docker 示例”的部分,其中包括“ Docker for Beginners ”。这里的例子对我来说似乎更有趣。所以,我们突然想熟悉Alpine Linux,我们可以使用 Docker 容器来做到这一点。要获得图像,我们必须将其“拉”或“拉”出来。因此,我们执行docker pull命令:docker pull apline
Docker 初识 - 11
正如我们所看到的,我们正在从某个地方下载。默认情况下,Docker 查看其在网络https://hub.docker.com上的存储库。成功检索镜像后,我们可以通过运行docker images命令来检查可用镜像的列表:
Docker 初识 - 12
现在我们有了一个 apline 图像。由于容器是映像的运行实例,因此让我们启动这个映像。让我们使用命令启动容器docker run alpine。正如我们所见,什么也没发生。如果我们执行命令docker ps来显示所有活动容器,我们也不会得到任何结果。但如果我们执行,docker ps -a我们将看到所有容器:
初识 Docker - 13
问题是我们没有以交互模式启动 Docker。于是,他执行了命令,停了下来。该命令是打开终端。让我们做同样的事情,但是在交互模式下(使用-it标志):
Docker 初识 - 14
正如您所看到的,克服了一个错误并使用提示后,我们到达了容器并可以在其中工作!要退出容器而不停止其运行,可以按Ctrl + p + q。如果我们现在运行docker ps,我们将看到一个活动容器。要进入已经运行的容器,请运行docker exec命令:
初识 Docker - 15
我建议阅读 Docker 示例的描述,以获取关于这一切如何发生的精彩描述:“ 1.0 运行你的第一个容器”。我喜欢它,因为所有内容都以一种非常容易理解的方式写在那里。简而言之,我们使用 docker-machine 连接到运行 Docker Daemon 的虚拟机。使用 CLI 通过 REST API,我们要求启动 alpine 镜像。Docker 找到了它,因此不会下载它。Docker 创建一个新容器并运行我们在该容器中指定的命令。当然,这一切都是好的。但为什么我们需要这一切?而这里我们需要弄清楚docker是如何创建镜像的。他根据 dockerfile 创建它们。
Docker 初识 - 16

Dockerfile

如Dockerfile 参考中所述,dockerfile 是一个文本文件,其中包含用于获取映像的所有命令。事实上,我们收到的所有图像(甚至是上面示例中的 Alpine)都是从 dockerfile 创建的。让我们使用 Java 应用程序构建我们的映像。首先我们需要这个 Java 应用程序。我建议使用 Gradle 构建系统,您可以在这篇简短的评论中阅读更多信息:“ Gradle 简介”。将帮助我们创建项目“ Gradle Build init plugin ”。让我们使用 Gradle 创建一个新的 Java 应用程序: gradle init --type java-application 此命令创建一个模板 Java 项目。这是一个独立的应用程序,但我们想创建一个 Web 应用程序。让我们删除 App 和 AppTest 类(它们是由 Gradle Build Init 插件自动生成的)。为了快速创建 Web 应用程序,我们将使用 Gradle 中的教程:“构建 Java Web 应用程序”。根据教程,我们来做: 你必须要小心。与往常一样,示例中可能存在错误。这里是:
Docker 初识 - 17
现在,为了测试它,让我们将 gretty 插件添加到 build.gradle,如“添加 gretty 插件并运行应用程序”部分所示:
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
有趣的是,Gretty 没有看到HelloServlet上面描述的 中的错误。这证明应用程序在不同的环境中可以有不同的行为。Gretty 可以在常规独立服务器会抛出错误的地方工作。剩下的就是检查应用程序是否正常工作。让我们做:gradle appRun
初识 Docker - 18
如果一切顺利,则使用该命令gradle war收集带有扩展 war 的存档(网络存档)。默认情况下,gradle 将其构建在\build\libs. 现在,我们准备编写 dockerfile。使用“ Dockerfile 参考”我们将创建一个 Dockerfile。让我们在 Java 项目的根目录中创建一个名为“Dockerfile”的文件(与构建脚本位于同一位置)。让我们打开它进行编辑。该文件有其自己的格式,在“ Dockerfile 参考:格式”部分中进行了描述。任何 dockerfile 都以 FROM 语句开头,表示“基础映像”。我们可以说这是我们制作图像的基础图像。我们很容易选择父图像。Web 应用程序需要 Web 服务器。例如,我们可以使用 Tomcat Web 服务器。我们进入官方 Docker 存储库,称为docker hub。我们查看那里是否有我们需要的图像:
初识 Docker - 19
还值得理解的是 tomcat 镜像的调用。但除了名称之外,它还有一个标签。标签就像一个版本。不同版本的Tomcat镜像的区别在于使用哪个版本的Tomcat、哪个版本的jre以及哪个基础镜像。例如,我们可以得到一个镜像,docker pull tomcat:9-jre8-alpine 它使用tomcat版本9、jre版本8和alpine镜像作为基础。这对于减小图像的大小非常重要:
初识 Docker - 20
正如我们所看到的,差异是巨大的。如果我们基于 tomcata alpine 构建镜像,我们将仅从 100 MB 开始,而不是 600 MB。因此,我们将以下内容添加到之前创建的 dockerfile 中:
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
现在让我们执行命令来构建图像docker build -t jrdocker .
初识 Docker - 21
-t- 这是一个标签,也就是组装好的镜像叫什么。末尾的点表示我们将当前目录(dockerfile 所在的目录以及我们运行命令的目录)添加到Build context. Build context- 这是创建 dockerfile 时可用的那些文件的上下文。正如您所看到的,多亏了这一点,我们能够将组装的 war 文件复制到我们的映像中,到 Web 服务器目录中。现在让我们运行我们的图像:docker run -d --rm -p 8888:8080 jrdocker
初识 Docker - 22
要了解服务器是否已启动,可以查看容器中的日志。可以使用 docker log 命令获取日志,并通过容器的 ID 或名称指定容器。例如:
初识 Docker - 23
好吧,不要忘记我们总是可以使用以下命令按名称访问正在运行的容器:winpty docker exec -it NameКонтейнера sh 现在剩下的就是连接了。之前,我们指定了EXPOSE,即允许从容器内部访问 8080 端口。当我们启动容器本身时,我们指定了 -p (传入端口)标签,从而关联容器(Tomcat Web 服务器)上的 8080 端口正在等待与具有 docker 守护进程的计算机上的端口 8888 的连接。我们记得,我们不是直接启动 docker 守护进程,而是通过 docker-machine 启动。因此,让我们再次使用 docker-machine ls 命令在我们的 docker 机器上请求数据并联系容器中的服务器:
Docker 初次介绍 - 24
因此,你和我刚刚在 Docker 容器中启动了我们的 Web 应用程序!)我还想指出以下几点。如果出现访问问题,您应该记住,Docker 机器首先是 Virtual BOx 虚拟机。虚拟机的网络设置可能有问题。正常工作的 VMBox 配置可能如下所示:
初识 Docker - 25
初识 Docker - 26

层数

我们已经知道镜像是从 dockerfile 创建的,并且 dockerfile 是一组命令。我们还发现 dockerfile 有一个父文件。而且图像的大小是不同的。有趣的是,您可以使用docker History命令查看镜像构建的历史记录。例如:
初识 Docker - 27
重要的是要明白,从本质上讲,每个图像都是一组图像。每个镜像更改(dockerfile 中的每个新命令)都会创建一个具有自己的 ID 的新层。您可以在文档“ Docker:图像和层”中阅读有关层的更多信息。我还强烈推荐阅读关于 Habré 的文章:“ Docker 镜像和图片中的容器”。

结论

我希望这个简短的概述足以让您对容器化感兴趣。以下是可能有用的其他材料的链接: #维亚切斯拉夫
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION