我将继续从FrontendConf 2019大会解密前端的Docker报告。
在上一部分中,我试图回答为什么前端开发人员可能需要Docker的问题 。 今天,我将尝试用一种简单的语言来说明它是一种什么样的工具,它是如何工作的,并将其与前端中已知的其他概念进行比较。
目录内容
- 前端的Docker。 第1部分。为什么?
- 前端的Docker。 第2部分。您是什么?
- 前端的Docker。 第3部分。一些食谱
你是什么
谁不知道Docker是什么,他们却有不同的看法。

有人认为这是将容器安装在机器上的一种方法。

在本文前面的VK中的声明下,出现了一些喜剧性评论。

而且只有系统管理员似乎知道一些知识。

Docker,Inc的员工通过营销口号向我们介绍了此工具:
调试您的应用程序,而不是您的环境
在任何地方安全地收集,共享和运行任何应用程序
她有点狡猾。 确实可以收集,共享和发布。 但是对于“安全”和“随处可见”,情况并非如此。
例如,您可以在本文中找到有关安全性问题的信息,但有关“任何地方”的信息,我都会进一步讨论。
虚拟化
虚拟化的可能性很久以前就出现了。
当我在2012年进行开发时,我的团队进行了Ruby on Rails项目。 我需要在笔记本电脑上运行Ruby , MySQL , PostgreSQL之类的东西。 在Windows下,这一切都表现不佳,因此我不得不使用虚拟化。
然后是诸如VirtualBox , VMware Workstation , Vagrant之类的解决方案。 整个工作环境已转移到虚拟机,只有IDE , Git和浏览器保留在主机系统中。

该图取自Docker文档,仅显示了虚拟机( VM )的工作方式。
我们拥有基础架构 (我们的计算机)和虚拟机监控程序 (VMWare,VirtualBox或其他)。 为此,我们运行了一个虚拟机,其中包括来宾操作系统( Guest OS ),必要的库( Bins / Libs )和我们的应用程序( App )。
自然,虚拟机本身变得非常大且缓慢。 维护虚拟机的开销很高。 我的笔记本电脑几乎没花光。

Docker,Inc建议不要将来宾操作系统放入虚拟容器中,而应使用主机系统并通过Linux中的cgroups机制获得进程隔离。
这大大减小了图像的尺寸。 例如,一个alpine:3.11.0映像 (专注于安全性,轻便性和低资源要求的Linux发行版)仅重2.5 MB ,而带有node:alpine的docker映像仅重27 MB 。
即 我们的网站/应用程序可以打包成30 MB的映像,足以在Docker中运行,并且可以在任何地方使用? 是的,但是有细微差别。
安装Docker
Docker分为两个版本: 社区版(CE)和企业版(EE) 。 我们需要Docker CE ,因为 它是免费的,可以解决我们需要的所有问题。
Docker也是Desktop和Server 。

伺服器
服务器版本设计为安装在Linux上 ,仅支持4个发行版和某些体系结构。 因此,您可以“在任何地方”运行docker容器的说法并不完全正确。
台式机
桌面版本供开发人员在计算机上安装。 这将在开发出色的应用程序期间为我们提供帮助。 特别是,我使用Docker Desktop for Mac 。
对于Mac用户,在计算机上进行安装看起来越熟悉。

或者,如果您喜欢Homebrew。
brew cask install docker
之后,该应用程序将在顶部状态栏中和控制台中变为可用。

需要注意的是,在Mac和Windows上缺少Linux控制组( cgroups )(感到惊讶),因此Docker Desktop分别使用Mac OS Hypervisor框架和Microsoft Hyper-V 。

也就是说,要支持虚拟化,必须放弃大约4 GB的RAM。 但是,如果工作容器在单独的虚拟机上运行,它们所占用的空间将大大减少。
docker stats
的输出:
CONTAINER ID NAME MEM USAGE e4941ea92ce7 nginx_1 3.16MiB 1b023bfff38f api_1 351.5MiB e07c6958e378 pg_1 18.64MiB 1fa783f5fdbc terminal-front_1 14.89MiB 72e9dfa0805a adminer_1 11.19MiB e9ce9f965867 admin-front_1 1.312MiB 3edacc59a77b certbot_1 1.547MiB
我们看到数据库占用了19 MB ,而Java API占用了352 MB 。
Docker Desktop中包含什么
Docker被设计为模块化架构,因此,当您安装Docker Desktop时 ,您会一次获得多个程序。
Docker引擎
Docker Engine包括容器构建工具,容器注册表,编排工具,运行时等。 这是用Go编写的开源项目 。 它以守护程序启动,该守护程序提供了用于执行命令的RESTful API 。
该解决方案使您几乎可以从任何地方管理容器,例如,从浏览器 , Node.js甚至从Minecraft 。

Docker CLI客户端
Docker Engine API的控制台客户端。
也是用Go编写的一个开源项目 。
Docker撰写
用于描述和启动多容器应用程序的工具。 开发中非常有用的东西。
感觉像一个SRE 。 自然地用Python编写。
Docker机器
一种用于管理安装了Docker的远程主机的工具 。 我们没有在开发中使用过,但其余都附带了。
风筝
用JavaScript(Electron)编写的开源 Docker Engine API GUI。
对于不喜欢控制台甚至GIT的人,使用图形界面非常理想。
该工具非常粗糙,但是可以正常工作( v0.17.9 , > 800个未解决的问题 )。

Docker不仅适合管理员
现在为前端开发人员提供了一些免费的类比,以表明该工具与我们前端开发人员熟悉的事物(例如Node.js和NPM)有很多共同点。
图片
Docker映像。 我们可以将其发布在某个地方,例如,在DockerHub中。 我们还可以发布NPM-
。
Docker文件
图像的配方。 我们没有食谱,但是有一个包/应用程序清单package.json
。
码头工人
将docker映像放在一起。 好吧,在前端,我们正在构建应用程序npm run build
。
Dockerhub

不要与另一个流行的中心相混淆。 这是docker映像的注册表。 我们有自己的注册表NPM Registry
。
docker运行
启动容器的控制台命令。 与前端世界最接近的模拟是npm start
命令。
该项目开始为专有开发
Docker项目于2008年作为dotCloud的内部专有开发而开始,直到2013年3月才以开源形式发布。
我们拥有Node.js ,尽管它最初是开源的,但直到2015年2月 , io.js的丑闻故事才由Joyent负责。
用于一切
我们都知道NPM是Node Package Manager 。 它曾经是,但是现在不仅有针对Node.js的软件包,而且还有针对浏览器的软件包。
而且那里可能没有包裹。 如果愿意,您可以在其中放置一组字体甚至电影。
与DockerHub相同。 您可以在那里发布任何内容。 没有预先审核。
有替代品可以替代
我们都知道,如果您不喜欢NPM ,可以使用其他软件包管理器。 这是Yarn , pnpm , jspm 。
Docker也可以被替代品替代。 例如, Podmad或Buildah 。
一些食谱
我希望我能够概述一下该工具。
在下一部分中,我计划展示前端使用Docker的秘诀和具体案例。